OpenGL学习总结-数据缓存区(四)

OpenGL进阶(一)之帧缓冲FrameBuffer 帧缓冲(Framebuffer),它被储存在显存中,包括:用于写入颜色值的、用于写入深度信息的和允许我们根据一些条件丢弃特定片段的。我们目前在前边入门文章中所做的所有操作都是在的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)!由于我们的帧缓冲不是默认帧缓冲,渲染指令将不会对窗口的视觉输出有任何影响,这个过程也被称为。 阅读详情

        第二部分里介绍了缓冲区对象(Buffer Object), 缓冲区对象是存储在 GPU 中的内存区域,用于存放顶点数据、索引数据、纹理数据等。OpenGL 使用缓冲区对象来高效管理和传输数据。
        常见缓冲区类型:

  • 顶点数组对象(VAO,Vertex Array Object)
  • 顶点缓冲区对象(VBO):用于存储顶点数据。
  • 索引缓冲区对象(IBO/EBO):用于存储顶点的索引数据,以减少数据冗余。
  • 帧缓冲对象(FBO):用于渲染到纹理或离屏渲染。

        作用:缓冲区对象通过在 GPU 上存储数据,提高了数据传输和渲染的效率。

缓冲区对象(Buffer Object)

缓冲区对象是OpenGL中用于在GPU内存中存储数据的一种机制,它们使得数据传输和渲染更加高效。以下是几种常见的缓冲区对象类型及其作用:

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

概念:VAO用于保存顶点属性数组的状态,包括与VBO的绑定以及顶点属性的配置。

作用:通过VAO,开发者可以一次性配置好顶点数组的所有状态,在后续的绘制中快速恢复这些状态,减少OpenGL函数调用次数,提升效率。

代码示例:

// 生成VAO和VBO
GLuint vao;
glGenVertexArrays(1, &vao);
GLuint vbo;
glGenBuffers(1, &vbo);

// 绑定VAO
glBindVertexArray(vao);

// 绑定VBO并设置顶点数据
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// 配置顶点属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

// 解绑VAO和VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

在这个例子中,我们创建了一个VAO和VBO,绑定了VAO,然后绑定VBO并上传顶点数据。接着,我们配置了顶点属性指针并启用了顶点属性。

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

概念:VBO是存储在GPU内存中的缓冲区,用于存储顶点数据,如顶点位置、法线、纹理坐标等。

作用:VBO允许开发者将大量顶点数据从CPU传输到GPU,减少每帧的CPU-GPU通信量,提高渲染效率。

代码示例:

// 绑定VBO并设置顶点数据
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

这里我们将顶点数据上传到GPU内存中,以便后续的渲染操作。

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

概念:EBO用于存储顶点的索引数据,允许通过索引引用顶点,避免重复存储相同的顶点数据。

作用:EBO提高了渲染效率,减少了顶点数据的冗余,尤其在渲染复杂网格时,通过索引复用顶点能够显著节省内存。

代码示例:

// 生成EBO
GLuint ebo;
glGenBuffers(1, &ebo);

// 绑定EBO并设置索引数据
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

// 解绑EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

在这个例子中,我们创建了一个EBO,绑定它,然后上传索引数据。

代码示例

下面是一个创建 VAO 和 VBO 的示例,其中包含了顶点位置、颜色和纹理坐标这三个顶点属性:

#include <GL/glew.h>
#include <GLFW/glfw3.h>

// 顶点数据,包含位置、颜色和纹理坐标
float vertices[] = {
    // 位置              // 颜色             // 纹理坐标
    -0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,  0.0f, 0.0f, // 左下角
     0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,  1.0f, 0.0f, // 右下角
     0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f,  0.5f, 1.0f, // 顶部
    -0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,  0.0f, 0.0f, // 左下角(重复,用于纹理坐标说明)
     0.5f,  0.5f, 0.0f,  0.0f, 1.0f, 1.0f,  1.0f, 1.0f  // 右上角
};

unsigned int indices[] = {
    0, 1, 2,
    2, 3, 0
};

int main() {
    // 初始化 GLFW 和 GLEW
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL VAO and VBO Example", NULL, NULL);
    if (!window) {
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glewInit();

    // 生成 VAO 和 VBO
    unsigned int VAO, VBO, EBO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);

    // 绑定 VAO
    glBindVertexArray(VAO);

    // 绑定 VBO 并上传顶点数据
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // 绑定 EBO 并上传索引数据
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    // 设置顶点属性指针
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0); // 位置属性
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(1); // 颜色属性
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
    glEnableVertexAttribArray(2); // 纹理坐标属性

    // 解绑 VAO, VBO 和 EBO
    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    // 渲染循环
    while (!glfwWindowShouldClose(window)) {
        // 渲染指令
        glBindVertexArray(VAO);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

        // 交换缓冲区并处理事件
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // 释放资源
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glDeleteBuffers(1, &EBO);

    glfwTerminate();
    return 0;
}

在这个示例中,我们定义了一个浮点数组 vertices,它包含了顶点的位置、颜色和纹理坐标。然后我们创建了一个 VAO 和两个 VBO(一个用于顶点数据,一个用于索引数据)。我们将顶点数据上传到 GPU,并设置了三个顶点属性指针,分别对应位置、颜色和纹理坐标。在渲染循环中,我们绑定 VAO 并调用 glDrawElements 来渲染两个三角形。

这个示例展示了如何使用 VAO 和 VBO 来存储和管理包含多个属性的顶点数据,以及如何设置多个顶点属性指针来定义顶点的多个属性。通过这种方式,我们可以高效地渲染具有复杂属性的顶点数据

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

概念:帧缓冲区是一个容器,包含用于显示的颜色缓冲区、深度缓冲区和模板缓冲区。默认情况下,OpenGL渲染的结果会输出到帧缓冲区中。

作用:帧缓冲区保存最终的渲染结果,显示在屏幕上。通过使用自定义帧缓冲对象(FBO),可以将渲染结果存储到纹理或进行离屏渲染。

代码示例:

// 生成FBO
GLuint fbo;
glGenFramebuffers(1, &fbo);

// 绑定FBO
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

// 创建纹理并附加到FBO
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

// 检查FBO完整性
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    std::cout << "FBO incomplete\n";

// 解绑FBO
glBindFramebuffer(GL_FRAMEBUFFER, 0);

在这个例子中,我们创建了一个FBO,绑定它,然后创建一个纹理并将其附加到FBO上。最后,我们检查FBO的完整性,并在完成后解绑FBO。这样,我们就可以将渲染结果输出到纹理,实现离屏渲染。

OpenGL中的顶点缓冲区(Vertex Buffer) Vertex buffer即顶点缓冲区。从字面意思来看,这个词就是指储存是顶点数据的缓冲区,本质还是一个缓冲区(buffer),是占一定字节的内存。就像在C++中我们用声明并赋值一个int类型,在内存中开辟4个字节空间来储存数据,这是在CPU上进行的。而Vertex buffer是OpenGL在GPU中开辟空间储存数据。当我们运行程序绘制图形时,显卡会从缓存(buffer)中读取顶点数据,进行绘制。 今天我们来看一下如何用OpenGL来创建顶点缓存区(vertex buffer)。我个人感觉这个过程和编程 阅读详情

相关推荐

【OpenGL实践12】关于缓存区Framebuffer的运用

关于FrameBuffer的使用,是OpenGL的高级使用方式,而这种新诞生的功能有些未知的技术需要逐步熟悉,本篇就是针对它的图像处理功能展开陈述。

gongdiwudu的专栏 3706

OpenGL ES对于缓存的管理

缓存是指图形处理器能够控制和管理的连续的RAM。 对缓存管理分三个阶段: 1、构建阶段 生成独一无二的标识符:glGenBuffer()。 绑定运算使用的缓存:glBindBuffer()。 初始化数据:glBufferData()or glBufferSubData()。 2、启动阶段 启用或者禁止缓存:glEnableVertextAttribArray() or glDisa...

cbhgreat2011的博客 534

OpenGL----OpenGL纹理与纹理缓存区

纹理(Texture)在计算机图形学中是指应用于几何体表面的图像或图案,用于增加视觉细节和真实感。纹理对象:在OpenGL中,纹理是通过纹理对象(Texture Object)来管理的。纹理对象存储了纹理图像数据以及相关的参数设置。纹理类型1D纹理):一维纹理,通常用于线性渐变等效果。2D纹理):二维纹理,最常见的纹理类型,用于贴图到二维表面。3D纹理):三维纹理,用于体积渲染等。立方体贴图):用于环境映射和反射效果。纹理坐标。

charce_you的专栏 362

OpenGL高级-帧缓冲

 颜色缓冲记录帧的颜色值,深度缓冲记录深度信息,模板缓冲允许我们基于一些条件丢弃指定片段。这几种缓冲结合起来叫做帧缓冲(FrameBuffer),它被储存于内存中。  OpenGL给了我们自己定义帧缓冲的自由,我们可以选择性的定义自己的颜色缓冲、深度和模板缓冲。  定义自己的帧缓冲好处就是:我们现在可以自由的获取已经渲染场景中的任何像素,然后把它当作一个纹理图像了。我们可以在片段着色器中创建一些有意思的效果。所有这些有意思的效果统称为后处理特效。  我们目前所做的渲染操作都是是在默认的帧缓冲之上进行的。当你

少年的博客 1589

OpenGL ES之3D渲染旋转的贴图立方体

效果展示 绘制流程 一、OpenGL ES 初始化 ① 初始化上下文并设置当前上下文 /* 初始化上下文并设置当前上下文 * EAGLContext 是苹果iOS平台下实现OpenGLES 渲染层 * kEAGLRenderingAPIOpenGLES1 = 1, 固定管线 * kEAGLRenderingAPIOpenGLES2 = 2, * kEAGLRenderingAPIOpenGLES3 = 3, */ context = [[E

╰つ栺尖篴夢ゞ 606

从赛题到实战:一份面向高职“区块链技术应用”赛项的食品溯源系统全栈部署与运维指南

本文为高职院校学生备战“区块链技术应用”技能大赛提供了一份详实的食品溯源系统全栈部署与运维指南。内容涵盖从理解赛题业务逻辑、绘制技术蓝图,到搭建4节点FISCO BCOS联盟链、部署管理平台与智能合约,再到核心运维技能与前后端联调测试的完整流程,旨在帮助参赛者将赛题转化为可运行的实战项目,全面提升区块链全栈开发与运维能力。

weixin_29172201的博客 669

OpenGL 入门 16:帧缓冲

OpenGL 帧缓冲

On_The_Way 2726

CentOS 9 Stream 上安装 MySQL 8.0+

根据提示进行设置,包括设置新的 root 密码、禁用远程 root 登录等。MySQL 在首次安装时会生成一个临时密码。这样就完成了 MySQL 8.0.37 的安装。这将安装最新的 MySQL 8.0 版本。

小强不是坑 1679

使用缓存区对象存取像素矩形数据

在缓存区中存储像素数据可以提高应用程序的性能,我们可以消除在渲染每一帧的时候都把数据从客户机的内存传输到

hhy518518的专栏 567

告别双导航栏!微信小程序web-view嵌入H5的导航栏隐藏实战(附uniapp代码)

本文详细解析了微信小程序中web-view嵌入H5页面时出现的双导航栏问题,并提供了基于uniapp的完整解决方案。通过环境感知、动态适配和样式隔离等技术手段,实现导航栏的无缝整合,提升用户体验和屏幕空间利用率。文章包含实战代码示例和常见问题排查指南,帮助开发者快速解决这一常见痛点。

weixin_26945061的博客 343

麒麟操作系统Kylin如何从 2203 升级到 2403

fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;开始升级流程第一步:升级前准备1. 确认版本为 V10 SP1 22032. 备份全部重要数据3. 确保网络稳定4. 关闭应用第二步:选择升级方式方法一:图形界面升级方法二:命令行升级1. 更新现有系统至最新2. 启动“系统升级”工具3. 检测并开始下载2403。

让编程变的很简单!! 2657

OpenGL深度缓存区、深度测试及alpha blend

1. OpenGL深度缓存区、深度测试及alpha blend 【颜色缓冲区】颜色缓冲区(COLOR_BUFFER)就是帧缓冲区(FRAME_BUFFER),你需要渲染的场景最终每一个像素都要写入该缓冲区,然后由它在渲染到屏幕上显示. 【深度缓冲区】深度缓冲区(DEPTH_BUFFER)与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以进行深度测试,从而确定像素的遮挡关系,

计算机技术交流 1044

竞拍算法(Auction Algorithm)原理及工作过程分析

因一些项目工作需要对竞拍算法进行深入了解。但百度了大部分资料都未找到一篇文章能对此算法进行较为深入的介绍。在一番努力之下,终于找打了最初提出该算法的论文,本文内容主要结合该论文对竞拍算法进行分析。 竞拍算法简介 竞拍算法(Auction Algorithm)是一种用于解决分配问题的分布式算法,经相关文献查询,最早由麻省理工学院信息和决策系统实验室的Bertsekas(教授?)提出 1,于1988年发表于期刊Annals of Operations Research。 顾名思义,竞拍算法本质就是模拟人类拍.

weixin_47546390的博客 3万+

基于linux系统的OpenGL环境(四)——红宝书简单示例

创建缓存   在OpenGL中绘制模型图像,首先要创建并分配缓存区,然后将模型的顶点数据传入到缓存区中。 GLuint vao, vbo[2]; // 设置顶点缓存 glGenVertexArrays(1, &vao); glBindVertexArray(vao); // 顶点缓存数据 glGenBuffers(2, vbo); // 分配OpenGL缓存空间 long unsigned int size_array = sizeof(GLfloat) * num * 4; // 顶点数据1 gl

wanchaochaochao的博客 640

【Coze搞钱实战】14. 抖音直播间自动回复机器人实战教程:三小时搭建智能客服,互动率提升150%(保姆级无代码指南)

摘要:抖音直播间高频问题重复回复、观众互动不及时是运营痛点。本文针对新手和进阶用户,提供无代码的自动回复机器人搭建方案:新手1小时完成基础配置(Coze+抖音对接),进阶用户通过促销倒计时、粉丝分层、热点借势三大策略提升互动率150%。方案基于某女装直播间实测数据(日UV 5W+),所有工具免费获取,步骤拆解到分钟级,附避坑指南与效果验证(某案例互动率从8%升至20%),读者可直接套用配置模板,无需代码基础即可落地。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2458

k8s篇之underlay网络和overlay区别

underlay和overlay

小橙子的笔记屋 2142

OpenGL学习例程精析(四棱锥)

#include <gl/glut.h> #define WIDTH 400 #define HEIGHT 400 #include <math.h> #define ColoredVertex(c, v) do{ glColor3fv(c); glVertex3fv(v); }while(0) GLfloat angle = 0.0f; void myDisplay(void) { static int list = 0; if( list == 0 )

KingsMan666的博客 1764

[Dify] 法律文档解析助手怎么做才敢用?先把条款提取、依据核对和人工复核分开

这篇文章围绕用 Dify 搭建法律文档解析助手时最容易被忽略的可靠性问题展开:文档能上传、模型能总结,并不等于结果就能直接用于法务判断。文章会从文档抽取、条款定位、召回片段核对、结构化输出和人工复核几个角度梳理设计思路,适合正在用 Dify 处理合同、制度、招投标文件或企业知识库问答的读者阅读。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 9379

OPENGL学习笔记(三)

SDL创建简单的窗口,调用API. 创建一个简单的类: Class Display {  public:  Display(int width,int height,const*  std::string& title); ~Display(); protected: private: } 实现文件中:Display.CPP Display::Display

V的博客 529

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OpenGL学习笔记(四)对VAO、VBO以及EBO的理解

OpenGL学习笔记(四)对VAO、VBO以及EBO的理解顶点缓冲对象(Vertex Buffer Objects,VBO)顶点数组对象(Vertex Arrary Object,VAO)索引缓冲对象(Element Buffer Object,EBO)参考链接 顶点缓冲对象(Vertex Buffer Objects,VBO)     顶点缓冲对象VBO是在显卡存储空间中开辟出的一块内存缓存区,...

皮皮#2500 723

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[OpenGL]OpenGL中VAO、VBO、EBO概念及应用

1.VBO(顶点缓冲对象 Vertex Buffer Objects ,VBO) VBO:顶点缓冲对象,是在显卡存储空间中开辟出的一块内存缓存区,用于存储顶点的各类属性信息,如顶点坐标,顶点向量,顶点颜色数据等。在渲染时,可以直接从VBO取出顶点的各类属性数据,由于VBO在显存而不是在内存中,不需要从CPU传输数据,处理效率更高。 可以开辟很多个VBO,每个VBO在OpenGL中有它的唯一标识ID...

用01改变世界 1688

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OpenCV 与 OpenGL 的区别

OpenCV 与 OpenGL 的关系是什么? https://www.zhihu.com/question/20212016 OpenCV 与 OpenGL 的区别 OpenCV是 Open Source Computer Vision Library OpenGL是 Open Graphics Library OpenCV主要是bai提供图像处理和视频处理的基du础算法库,还涉及一些zhi机器学习的算法。比dao如你想实现视频的降噪、运动物体的跟踪、目标(比如人脸)的识别这些都是CV的领域 OpenGL

weixin_41454036的博客 2215

OpenGL ES画板

一、概述 利用自定义顶点和片元着色器渲染,并且设置图片纹理颜色为画笔颜色 二、核心代码 - (void)renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end { //顶点缓存区 static GLfloat *vertexBuffer = NULL; //顶点Max sta...

aqqf36217的博客 423

学习 opengl_OpenGL学习 - 纹理

OpenGL学习 - 纹理常用函数:常用函数纹理纹理只是一种能够应用到场景中的三角形上的图像数据,它通过经过过滤的纹理单元(texture,相当于基于纹理的像素)填充到实心区域。一、原始图像数据1、像素包装图像存储空间 = 图像的高度 * 图像的宽度 *每个像素的字节数改变或恢复像素的存储方式void glPixelStorei (GLenum pname, GLint param); void ...

weixin_29067143的博客 240

OpenGL学习之绘制三角形

配置好opengl环境以后就可以实现第一个三角形绘制了,并且学习VAO,VBO,EBO及其使用

Estelle 1509
上一篇: OpenGL学习总结-基本渲染流程(三)
下一篇: OpenGL学习总结-OpenGL状态机(五)
pplander
博客等级 码龄20年 111粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值