Opengl常用缓冲对象功能介绍及使用示例(C++实现)

本文整理了常用的opengl缓冲区对象并安排了使用示例

名称英文全称作用简述
顶点数组对象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置,存储顶点属性设置,简化渲染流程,避免重复设置状态
顶点缓冲区对象Vertex Buffer Object (VBO)存储顶点属性数据,提升渲染性能
索引缓冲区对象Element/Index Buffer Object (EBO/IBO)存储顶点索引,减少数据冗余
统一缓冲区对象Uniform Buffer Object (UBO)存储着色器统一变量,方便多着色器共享
着色器存储缓冲区对象Shader Storage Buffer Object (SSBO)供着色器直接读写复杂数据
像素缓冲区对象Pixel Buffer Object (PBO)加速像素数据在 CPU 和 GPU 间传输
变换反馈缓冲区对象Transform Feedback Buffer Object (TFBO)存储处理后的顶点数据用于后续渲染
原子计数器缓冲区对象Atomic Counter Buffer Object (ACBO)存储可并发修改的计数器
纹理缓冲区对象Texture Buffer Object (TBO)将缓冲区数据作为一维纹理采样
查询对象Query Object查询 OpenGL 操作状态和结果用于调试
帧缓冲区对象Framebuffer Object (FBO)自定义渲染目标实现离屏渲染
渲染缓冲区对象Renderbuffer Object (RBO)与 FBO 配合存储单一图像数据
命令缓冲区Command Buffer提前记录命令,减少 CPU - GPU 同步开销
稀疏纹理Sparse Texture仅为纹理实际部分分配内存,节省空间
采样器缓冲区对象Sampler Buffer Object结合缓冲区与采样器功能访问数据
多视图帧缓冲区对象Multiview Framebuffer Object支持同时渲染到多个视图用于特殊渲染

1. 顶点数组对象(Vertex Array Object, VAO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(800, 600, "VAO 示例", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 创建 VAOGLuint VAO;glGenVertexArrays(1, &VAO);// 绑定 VAOglBindVertexArray(VAO);// 这里可以进行 VBO 和 EBO 的绑定与设置// 解绑 VAOglBindVertexArray(0);// 主循环while (!glfwWindowShouldClose(window)) {// 处理事件glfwPollEvents();// 绑定 VAOglBindVertexArray(VAO);// 绘制操作// glDrawArrays(GL_TRIANGLES, 0, 3);// 解绑 VAOglBindVertexArray(0);// 交换缓冲区glfwSwapBuffers(window);}// 清理 VAOglDeleteVertexArrays(1, &VAO);// 终止 GLFWglfwTerminate();return 0;
}

2. 顶点缓冲区对象(Vertex Buffer Object, VBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "VBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 顶点数据float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f};// 创建 VBOGLuint VBO;glGenBuffers(1, &VBO);// 绑定 VBOglBindBuffer(GL_ARRAY_BUFFER, VBO);// 填充数据glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 解绑 VBOglBindBuffer(GL_ARRAY_BUFFER, 0);glfwTerminate();// 清理 VBOglDeleteBuffers(1, &VBO);return 0;
}

3. 索引缓冲区对象(Element Buffer Object, EBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "EBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 顶点数据float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f};// 索引数据unsigned int indices[] = {0, 1, 2};// 创建 EBOGLuint EBO;glGenBuffers(1, &EBO);// 绑定 EBOglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);// 填充数据glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);// 解绑 EBOglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glfwTerminate();// 清理 EBOglDeleteBuffers(1, &EBO);return 0;
}

4. 统一缓冲区对象(Uniform Buffer Object, UBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const GLuint UBO_BINDING_POINT = 0;int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "UBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 UBOGLuint UBO;glGenBuffers(1, &UBO);// 绑定 UBOglBindBuffer(GL_UNIFORM_BUFFER, UBO);// 分配内存glBufferData(GL_UNIFORM_BUFFER, 16 * sizeof(float), nullptr, GL_STATIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_UNIFORM_BUFFER, UBO_BINDING_POINT, UBO);// 解绑 UBOglBindBuffer(GL_UNIFORM_BUFFER, 0);glfwTerminate();// 清理 UBOglDeleteBuffers(1, &UBO);return 0;
}

5. 着色器存储缓冲区对象(Shader Storage Buffer Object, SSBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "SSBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 数据float data[] = {1.0f, 2.0f, 3.0f, 4.0f};// 创建 SSBOGLuint SSBO;glGenBuffers(1, &SSBO);// 绑定 SSBOglBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO);// 填充数据glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(data), data, GL_STATIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, SSBO);// 解绑 SSBOglBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);glfwTerminate();// 清理 SSBOglDeleteBuffers(1, &SSBO);return 0;
}

6. 像素缓冲区对象(Pixel Buffer Object, PBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "PBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 PBOGLuint PBO;glGenBuffers(1, &PBO);// 绑定 PBOglBindBuffer(GL_PIXEL_UNPACK_BUFFER, PBO);// 分配内存glBufferData(GL_PIXEL_UNPACK_BUFFER, 800 * 600 * 4, nullptr, GL_STREAM_DRAW);// 解绑 PBOglBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);glfwTerminate();// 清理 PBOglDeleteBuffers(1, &PBO);return 0;
}

7. 变换反馈缓冲区对象(Transform Feedback Buffer Object, TFBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "TFBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 TFBOGLuint TFBO;glGenBuffers(1, &TFBO);// 绑定 TFBOglBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, TFBO);// 分配内存glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, nullptr, GL_STATIC_DRAW);// 绑定到变换反馈绑定点glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, TFBO);// 解绑 TFBOglBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);glfwTerminate();// 清理 TFBOglDeleteBuffers(1, &TFBO);return 0;
}

8. 原子计数器缓冲区对象(Atomic Counter Buffer Object, ACBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "ACBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 ACBOGLuint ACBO;glGenBuffers(1, &ACBO);// 绑定 ACBOglBindBuffer(GL_ATOMIC_COUNTER_BUFFER, ACBO);// 分配内存glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), nullptr, GL_DYNAMIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, ACBO);// 解绑 ACBOglBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);glfwTerminate();// 清理 ACBOglDeleteBuffers(1, &ACBO);return 0;
}

9. 纹理缓冲区对象(Texture Buffer Object, TBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "TBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 数据float data[] = {1.0f, 2.0f, 3.0f, 4.0f};// 创建 TBOGLuint TBO;glGenBuffers(1, &TBO);// 绑定 TBOglBindBuffer(GL_TEXTURE_BUFFER, TBO);// 填充数据glBufferData(GL_TEXTURE_BUFFER, sizeof(data), data, GL_STATIC_DRAW);// 创建纹理GLuint texture;glGenTextures(1, &texture);// 绑定纹理glBindTexture(GL_TEXTURE_BUFFER, texture);// 将 TBO 关联到纹理glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, TBO);// 解绑 TBO 和纹理glBindBuffer(GL_TEXTURE_BUFFER, 0);glBindTexture(GL_TEXTURE_BUFFER, 0);glfwTerminate();// 清理 TBO 和纹理glDeleteBuffers(1, &TBO);glDeleteTextures(1, &texture);return 0;
}

10. 查询对象(Query Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "查询对象示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建查询对象GLuint query;glGenQueries(1, &query);// 开始查询glBeginQuery(GL_SAMPLES_PASSED, query);// 这里进行绘制操作// glDrawArrays(GL_TRIANGLES, 0, 3);// 结束查询glEndQuery(GL_SAMPLES_PASSED);// 获取查询结果GLuint result;glGetQueryObjectuiv(query, GL_QUERY_RESULT, &result);std::cout << "采样通过数量: " << result << std::endl;// 清理查询对象glDeleteQueries(1, &query);glfwTerminate();return 0;
}

11. 帧缓冲区对象(Framebuffer Object, FBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "FBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 FBOGLuint FBO;glGenFramebuffers(1, &FBO);// 绑定 FBOglBindFramebuffer(GL_FRAMEBUFFER, FBO);// 这里可以创建并附加纹理或渲染缓冲区// 检查 FBO 是否完整if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)std::cerr << "FBO 不完整" << std::endl;// 解绑 FBOglBindFramebuffer(GL_FRAMEBUFFER, 0);glfwTerminate();// 清理 FBOglDeleteFramebuffers(1, &FBO);return 0;
}

12. 渲染缓冲区对象(Renderbuffer Object, RBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "RBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 RBOGLuint RBO;glGenRenderbuffers(1, &RBO);// 绑定 RBOglBindRenderbuffer(GL_RENDERBUFFER, RBO);// 分配内存glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);// 解绑 RBOglBindRenderbuffer(GL_RENDERBUFFER, 0);glfwTerminate();// 清理 RBOglDeleteRenderbuffers(1, &RBO);return 0;
}

13. 命令缓冲区(Command Buffer)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <vector>// 模拟命令结构体
struct Command {enum Type { DRAW_ARRAYS } type;GLenum mode;GLint first;GLsizei count;
};int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "命令缓冲区示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();std::vector<Command> commandBuffer;// 添加命令到缓冲区Command cmd;cmd.type = Command::DRAW_ARRAYS;cmd.mode = GL_TRIANGLES;cmd.first = 0;cmd.count = 3;commandBuffer.push_back(cmd);// 执行命令缓冲区中的命令for (const auto& cmd : commandBuffer) {if (cmd.type == Command::DRAW_ARRAYS) {glDrawArrays(cmd.mode, cmd.first, cmd.count);}}glfwTerminate();return 0;
}

稀疏纹理(Sparse Texture)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const int WIDTH = 800;
const int HEIGHT = 600;int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Sparse Texture Example", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 检查是否支持稀疏纹理扩展if (!GLEW_ARB_sparse_texture) {std::cerr << "不支持 ARB_sparse_texture 扩展" << std::endl;glfwTerminate();return -1;}// 创建纹理对象GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);// 设置纹理参数glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// 分配稀疏纹理存储GLint alignment;glGetInternalformativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_SPARSE_ARB, 1, &alignment);glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, WIDTH, HEIGHT, GL_TRUE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SPARSE_ARB, GL_TRUE);// 定义一个稀疏纹理的子区域GLint x = 0, y = 0, z = 0;GLint width = WIDTH / 2, height = HEIGHT / 2, depth = 1;GLint level = 0;glTexPageCommitmentARB(GL_TEXTURE_2D, level, x, y, z, width, height, depth, GL_TRUE);// 主循环while (!glfwWindowShouldClose(window)) {glfwPollEvents();// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 这里可以进行纹理绘制操作glfwSwapBuffers(window);}// 清理资源glDeleteTextures(1, &texture);glfwTerminate();return 0;
}

采样器缓冲区对象(Sampler Buffer Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const int WIDTH = 800;
const int HEIGHT = 600;int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Sampler Buffer Object Example", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 创建缓冲区对象GLuint buffer;glGenBuffers(1, &buffer);glBindBuffer(GL_TEXTURE_BUFFER, buffer);// 分配缓冲区数据const int bufferSize = 1024;float* data = new float[bufferSize];for (int i = 0; i < bufferSize; ++i) {data[i] = static_cast<float>(i);}glBufferData(GL_TEXTURE_BUFFER, bufferSize * sizeof(float), data, GL_STATIC_DRAW);delete[] data;// 创建纹理对象并绑定到缓冲区GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_BUFFER, texture);glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, buffer);// 主循环while (!glfwWindowShouldClose(window)) {glfwPollEvents();// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 这里可以在着色器中使用采样器缓冲区对象进行采样操作glfwSwapBuffers(window);}// 清理资源glDeleteTextures(1, &texture);glDeleteBuffers(1, &buffer);glfwTerminate();return 0;
}

多视图帧缓冲区对象(Multiview Framebuffer Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const int WIDTH = 800;
const int HEIGHT = 600;int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Multiview Framebuffer Object Example", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 检查是否支持多视图扩展if (!GLEW_NV_multiview) {std::cerr << "不支持 NV_multiview 扩展" << std::endl;glfwTerminate();return -1;}// 创建帧缓冲区对象GLuint fbo;glGenFramebuffers(1, &fbo);glBindFramebuffer(GL_FRAMEBUFFER, fbo);// 创建纹理附件GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D_ARRAY, texture);glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, WIDTH, HEIGHT, 2); // 2 个视图// 将纹理附件附加到帧缓冲区glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);// 设置多视图GLuint views[] = {0, 1};glNamedFramebufferMultiviewOVR(fbo, GL_COLOR_ATTACHMENT0, texture, 0, 0, 2, 2, views);// 主循环while (!glfwWindowShouldClose(window)) {glfwPollEvents();// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 这里可以进行多视图渲染操作glfwSwapBuffers(window);}// 清理资源glDeleteTextures(1, &texture);glDeleteFramebuffers(1, &fbo);glfwTerminate();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23803.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek赋能智慧文旅:新一代解决方案,重构文旅发展的底层逻辑

DeepSeek作为一款前沿的人工智能大模型&#xff0c;凭借其强大的多模态理解、知识推理和内容生成能力&#xff0c;正在重构文旅产业的发展逻辑&#xff0c;推动行业从传统的经验驱动向数据驱动、从人力密集型向智能协同型转变。 一、智能服务重构&#xff1a;打造全域感知的智…

uniapp修改picker-view样式

解决问题&#xff1a; 1.选中文案样式&#xff0c;比如字体颜色 2.修改分割线颜色 3.多列时&#xff0c;修改两边间距让其平分 展示效果&#xff1a; 代码如下 <template><u-popup :show"showPicker" :safeAreaInsetBottom"false" close&quo…

开源嵌入式实时操作系统uC/OS-II介绍

一、uC/OS-II的诞生&#xff1a;从开源实验到行业标杆 背景与起源 uC/OS-II&#xff08;Micro-Controller Operating System Version II&#xff09;诞生于1992年&#xff0c;由嵌入式系统先驱Jean J. Labrosse开发。其前身uC/OS&#xff08;1991年&#xff09;最初作为教学工…

8.spring对logback的支持

文章目录 一、入口二、源码解析LoggingApplicationListener 三、其它支持四、总结 本节以logback为背景介绍的 一、入口 gav: org.springframework.boot:spring-boot:3.3.4 spring.factories文件中有如下两个配置 org.springframework.boot.logging.LoggingSystemFactory\ …

OpenHarmony分布式数据管理子系统

OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化&#xff0c;以及跨设备之间数据的同步、…

智慧后勤的消防管理:豪越科技为安全护航

智慧后勤消防管理难题大揭秘&#xff01; 在智慧后勤发展得如火如荼的当下&#xff0c;消防管理却暗藏诸多难题。传统模式下&#xff0c;消防设施分布得那叫一个散&#xff0c;就像一盘散沙&#xff0c;管理起来超费劲。人工巡检不仅效率低&#xff0c;还容易遗漏&#xff0c;不…

python轻量级框架-flask

flask简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用&#xff0c;适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架&#xff0c;是因为它与一些大型 We…

政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio&#xff08;UI&#xff09; 运…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展&#xff0c;本地部署大型语言模型&#xff08;LLM&#xff09;已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私&#xff0c;还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2&#xff08;24GB 内存&#xff09;上部署 DeepS…

【Godot4.3】基于绘图函数的矢量蒙版效果与UV换算

概述 在设计圆角容器时突发奇想&#xff1a; 将圆角矩形的每个顶点坐标除以对应圆角矩形所在Rect2的size&#xff0c;就得到了顶点对应的UV坐标。然后使用draw_colored_polygon&#xff0c;便可以做到用图片填充圆角矩形的效果。而且这种计算的效果就是图片随着其填充的图像缩…

51单片机-AT24CXX存储器工作原理

1、AT24CXX存储器工作原理 1.1、特点&#xff1a; 与400KHz&#xff0c;I2C总线兼容1.8到6.0伏工作电压范围低功耗CMOS技术写保护功能当WP为高电平时进入写保护状态页写缓冲器自定时擦写周期100万次编程/擦除周期可保存数据100年8脚DIP SOIC或TSSOP封装温度范围商业级和工业级…

Linux网络 网络层

IP 协议 协议头格式 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 4 字节&#xff0c;4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…

Unity百游修炼(1)——FootBall详细制作全流程

一、引言 游玩测试&#xff1a; Football 游玩测试 1.项目背景与动机 背景&#xff1a;在学习 Unity 的过程中&#xff0c;希望通过实际项目来巩固所学知识&#xff0c;同时出于对休闲小游戏的喜爱&#xff0c;决定开发一款简单有趣的小游戏加深自己的所学知识点。 动机&#…

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构&#xff0c;顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考&#xff1a; C语言&#xff08;11&#xff09;-------------&#xff1e;while循…

【1】VS Code 新建上位机项目---C#基础语法

VS Code 新建上位机项目---C#基础语法 1 基本概念1.1 准备工具1.2 新建项目2 C#编程基础2.1 命名空间和类2.2 数据类型2.3 控制台输入输出2.3.1 输入输出: write 与 read2.3.2 格式化 : string.Foramt() 与 $2.3.3 赋值与运算2.4 类型转换2.4.1 数值类型之间的转换:(int)2.4…

SQL:DQL数据查询语言以及系统函数(oracle)

SQL Structured Query Language&#xff0c;结构化查询语言, 是一种用于管理和操作关系数据库的标准编程语言。 sql的分类 DQL&#xff08;Data Query Language&#xff09;&#xff1a;数据查询语言 DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…

提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践

1. 业务背景 阿里妈妈品牌广告数据包括投放引擎、下发、曝光、点击等日志&#xff0c;面向运筹调控、算法特征、分析报表、诊断监控等应用场景&#xff0c;进行了品牌数仓能力建设。随着业务发展&#xff0c;基于Lambda架构的数仓开发模式&#xff0c;缺陷日益突出&#xff1a;…

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理&#xff0c;以及面对一些问题时的解决思路&#xff0c;故对以前的方法进行原理上的解释&#xff0c;主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导&#xff0c;我们可以看一下微pe制作的启动盘&#…

基于Docker的前端环境管理:从开发环境到生产部署的实现方案

# 基于Docker的前端环境管理&#xff1a;从开发环境到生产部署的实现方案 简介及前端开发环境挑战 简介 是一种容器化平台&#xff0c;可以将应用程序及其依赖项打包为一个容器&#xff0c;提供一种轻量级、可移植的环境。它能够简化开发、部署和运维的流程&#xff0c;提高…