五、VBO、EBO 和 VAO

news/2024/7/19 8:02:51 标签: opengles

五、VBO、EBO 和 VAO

VBO、EBO 和 VAO

VBO(Vertex Buffer Object)是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VAO 是顶点数据的缓冲区对象,VAO 和 EBO 实际上是对同一类 Buffer 按照用途的不同称呼

VBO 和 EBO 的作用是在显存中提前开辟好一块内存,用于缓存顶点数据或者图元索引数据,从而避免每次绘制时的 CPU 与 GPU 之间的内存拷贝,可以提升渲染性能,降低内存带宽和功耗

顶点数组缓冲区对象、图元索引缓冲区对象。GL_ARRAY_BUFFER 标志指定的缓冲区对象用于保存顶点数组,GL_ELEMENT_ARRAY_BUFFER 标志指定的缓存区对象用于保存图元索引

VBO(EBO)的创建和更新。

// 创建 2 个 VBO(EBO 实际上跟 VBO 一样,只是按照用途的另一种称呼)
glGenBuffers(2, m_VboIds);

// 绑定第一个 VBO,拷贝顶点数组到显存
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// 绑定第二个 VBO(EBO),拷贝图元索引数据到显存
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
GL_STATIC_DRAW 标志标识缓冲区对象数据被修改一次,使用多次,用于绘制。

VBO:就是管理顶点数据,从内存的角度使用偏移量来保存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUExmVaQ-1686049956021)(C:\Users\CreatWall_zhouwen\Desktop\pic\pic\2019080118415916.png)]

glUseProgram(m_ProgramObj);

//不使用 VBO 的绘制
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), vertices);

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (vertices + 3));

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

//使用 VBO 的绘制
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[0]);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (const void *)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (const void *)(3 *sizeof(GLfloat)));

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[1]);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);

EBO:就是存储纹理数据相关的,就是存储纹理的索引数组的

//将GL_ELEMENT_ARRAY_BUFFER缓冲区绑定到EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
//将索引坐标绑定到GL_ELEMENT_ARRAY_BUFFER
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

VAO顶点数组对象,VAO 的主要作用是用于管理 VBO 或 EBO ,减少 glBindBuffer 、glEnableVertexAttribArray、 glVertexAttribPointer 这些调用操作,高效地实现在顶点数组配置之间切换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOOPQIRJ-1686049956026)(C:\Users\CreatWall_zhouwen\Desktop\pic\pic\20190801184256585.png)]

// 创建并绑定 VAO
glGenVertexArrays(1, &m_VaoId);
glBindVertexArray(m_VaoId);

// 在绑定 VAO 之后,操作 VBO ,当前 VAO 会记录 VBO 的操作
glBindBuffer(GL_ARRAY_BUFFER, m_VboIds[0]);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (const void *)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (3+3)*sizeof(GLfloat), (const void *)(3 *sizeof(GLfloat)));

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_VboIds[1]);

glBindVertexArray(GL_NONE);

绘画

// 是不是精简了很多?
glUseProgram(m_ProgramObj);

glBindVertexArray(m_VaoId);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void *)0);


http://www.niftyadmin.cn/n/404915.html

相关文章

PyCharm显示python文件的函数和类的列表 structure视图的使用与介绍

目录 打开structure视图structure视图的使用与介绍1.排序方式按字母升序or降序排列2. 是否显示有关联的函数和类(一般不用激活)3. 展示类中的字段4. 点击后是否定位到目标5. 自动定位到当前文件 总结 欢迎关注 『Python』 系列,持续更新中 欢…

【SpinalHDL快速入门】4.5、复合类型之Bundle

文章目录 1.1、描述1.2、声明1.2.1、条件信号(Conditional signals) 1.3、运算符1.3.1、比较(Comparison)1.3.2、类型转换(Type cast)1.3.3、将比特转换回 Bundle 1.4、IO元素方向1.4.1、in/out1.4.2、mast…

实验15:20211127 1+X 中级实操考试(id:2660)

文章目录 一、项目背景说明二、表结构三、步骤【5 分】步骤 1:项目准备【5 分】步骤 2:完成实体类 Student【10 分】步骤 3:完成实体类 Course【10 分】步骤 4:完成实体类 Score【10 分】步骤 5:完成 StudentDaoImpl 的…

ATK-MD0096-V21使用手册

ATK-0.96’ OLED_V2.0(V2.0 是版本号,下面均以 OLED 表示该产品)是 ALIENTEK 推出的一款高性能 OLED 显示模块,,尺寸小巧(27mm26mm),结构紧凑,模块通过一个28P的排针与外部连接。 8080并口模式…

【Linux服务器编程总结】网络编程基础知识 (udp初级)

一.预备知识 1.主机字节序和网络字节序: 其实本质就是大小端。通常在网络传输的时候会将要发送的数据转同一转换成大端后再发送。在linux中提供了如下四个函数进行大小端转换。 2. 网络套接字: 我们在网络编程的时候会使用到socktet 套接字。对此我们需要了解so…

chatgpt赋能python:Python安装到C盘有什么方便之处?

Python安装到C盘有什么方便之处? 在进行Python编程时,安装Python到C盘是一个非常常见的做法。那么,将Python安装到C盘有哪些好处呢?下面,让我们来一一介绍。 1. 方便快捷 安装Python到C盘的好处之一就是非常方便&am…

chatgpt赋能python:Python定义未知长度数组

Python定义未知长度数组 Python是一种受欢迎的编程语言,广泛用于数据分析,人工智能,WEB开发和其他领域。其中一个非常方便的特性是它提供了定义未知长度数组的选项。 在本文中,我们将介绍如何使用Python定义未知长度数组&#x…

java设计模式(十五)责任链模式

目录 定义模式结构角色职责代码实现适用场景优缺点 定义 责任链模式(Chain of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理…