文章目录
前言:
在 OpenGL 中,有许多常见的对象,它们在图形渲染流程中各自承担着重要的角色。下面将详细介绍几种常见对象及其工作原理。
一、对象
1、顶点缓冲区对象(Vertex Buffer Object,VBO)
概念:
顶点缓冲区对象用于在 GPU 内存中存储顶点数据,如顶点的位置、颜色、法线等。通过使用 VBO,可以减少 CPU 与 GPU 之间的数据传输开销,提高渲染性能。
工作原理:
- 创建与绑定:使用
glGenBuffers函数创建一个或多个 VBO 对象,然后使用glBindBuffer函数将其绑定到GL_ARRAY_BUFFER目标。绑定后,后续对缓冲区的操作都会作用于该 VBO。 - 数据存储:使用
glBufferData函数将顶点数据从 CPU 内存复制到 GPU 内存中的 VBO 中。可以指定数据的使用方式,如GL_STATIC_DRAW(数据很少更改)、GL_DYNAMIC_DRAW(数据经常更改)等。 - 使用数据:在顶点着色器中,通过顶点属性指针从 VBO 中读取顶点数据进行处理。
示例代码:
// 创建 VBO
unsigned int VBO;
glGenBuffers(1, &VBO);
// 绑定 VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// 将顶点数据存入 VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
2、顶点数组对象(Vertex Array Object,VAO)
概念:
顶点数组对象是一种用于管理顶点属性状态的对象。它存储了顶点属性的配置信息,包括顶点缓冲区对象(VBO)的绑定状态、顶点属性指针的设置等。通过 VAO,可以方便地切换不同的顶点属性配置。
工作原理:
- 创建与绑定:首先使用
glGenVertexArrays函数创建一个或多个 VAO 对象,然后使用glBindVertexArray函数将其绑定到当前的 OpenGL 上下文。绑定后,后续对顶点属性的设置操作都会记录在该 VAO 中。 - 关联 VBO:在 VAO 绑定的状态下,创建并绑定顶点缓冲区对象(VBO),使用
glBufferData函数将顶点数据存储到 VBO 中。 - 设置顶点属性指针:使用
glVertexAttribPointer函数设置顶点属性的指针,指定每个属性的起始位置、数据类型、数据数量等信息。这些设置会被记录在当前绑定的 VAO 中。 - 切换 VAO:当需要切换到不同的顶点属性配置时,只需绑定不同的 VAO,OpenGL 会自动恢复该 VAO 所记录的顶点属性设置。
示例代码:
// 创建并绑定VAO
glGenVertexArrays(1, &m_vao);
glBindVertexArray(m_vao);
// 设置顶点属性指针
// 位置属性 (location = 0)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
// 解绑VAO
glBindVertexArray(0);
3、glVertexAttribPointer()函数
作用:
告诉 OpenGL 如何解析顶点缓冲区对象(VBO)中存储的顶点数据。
函数原型:
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized,
GLsizei stride, const GLvoid * pointer);
参数解析:
各参数的含义如下:
index:指定要配置的顶点属性的索引。在 OpenGL 着色器程序中,每个顶点属性都有一个唯一的索引,用于标识该属性。例如,顶点的位置属性可能索引为 0,颜色属性可能索引为 1。size:表示每个顶点属性由多少个组件组成。例如,顶点的位置通常是三维坐标(x, y, z),所以 size 为 3;如果是二维纹理坐标(s, t),则 size 为 2。type:指定顶点属性中每个组件的数据类型,常见的取值有 GL_FLOAT(浮点数)、GL_INT(整数)等。normalized:一个布尔值,指示当数据类型不是浮点数时,是否需要对数据进行归一化处理。如果设置为 GL_TRUE,则会将数据归一化到 [0, 1](无符号数据)或 [-1, 1](有符号数据)的范围内;如果设置为 GL_FALSE,则数据会直接使用,不进行归一化。stride:表示相邻两个顶点属性之间的字节偏移量,即从一个顶点的某个属性到下一个顶点的相同属性之间的距离。如果顶点数据是紧密排列的,没有额外的填充字节,stride 可以设置为 size * sizeof(type);如果顶点数据中包含多种属性,stride 则需要根据实际情况计算。pointer:表示当前顶点属性在 VBO 中的起始偏移量,通常是一个指向 VBO 中数据起始位置的指针。如果该属性是 VBO 中第一个属性,pointer 可以设置为 (GLvoid*)0。
680

被折叠的 条评论
为什么被折叠?



