glVertexAttribPointer简介

glVertexAttribPointer 是一个 OpenGL 函数,用于将当前的顶点属性与顶点缓冲对象(VBO)关联起来。它的原型如下:

void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);

其中:

index 指定要配置的顶点属性的编号。
size 指定每个顶点属性的分量数(1、2、3 或 4,就像向量的维度一样)。
type 指定每个分量的数据类型,可以是 GL_BYTE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT、GL_INT、GL_UNSIGNED_INT、GL_FLOAT 或 GL_DOUBLE。
normalized1 指定是否将数据归一化到 [0,1] 或 [-1,1] 范围内。
stride (步长)指定连续两个顶点属性间的字节数。如果为 0,则表示顶点属性是紧密排列的。
pointer 指向缓冲对象中第一个顶点属性的第一个分量的地址。(offset的作用)

在使用 glVertexAttribPointer 时,您需要指定当前属性的编号,并将其与一个 VBO 关联起来。如果需要配置多个顶点属性,可以使用多个 glVertexAttribPointer 函数,并将每个属性的编号分别传递给它们。
举个例子,假设我们有一个包含三维位置和两维纹理坐标的顶点数据(从这个条件我们可以知道步长为5个浮点数大小),可以使用以下代码配置顶点属性指针:

// 创建顶点缓冲对象
GLuint vbo;
glGenBuffers(1, &vbo);

// 绑定顶点缓冲对象
glBindBuffer(GL_ARRAY_BUFFER, vbo);

// 分配空间并存储顶点数据,我们假设vertices中已经存储了顶点数据矩阵
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// 配置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));

// 启用顶点属性
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

在这个例子中,我们使用了两个 glVertexAttribPointer 函数,分别配置了位置和纹理坐标的顶点属性。通过将编号传递给这些函数,我们可以指明当前属性是位置(编号 0)还是纹理坐标(编号 1)。
在使用 glVertexAttribPointer 配置顶点属性指针之后,还需要调用
glEnableVertexAttribArray 函数启用顶点属性。例如,在上面的例子中,我们调用了 glEnableVertexAttribArray(0) 和 glEnableVertexAttribArray(1) 来启用位置和纹理坐标的顶点属性。
启用顶点属性后,就可以使用 glDrawArrays 或 glDrawElements 绘制图元了。

例如,如果顶点数组存储的数据是 0-255 的无符号字节,并且你指定了 normalized 为 GL_TRUE,OpenGL 会将数据归一化到 0.0 到 1.0。

当 normalized 参数设置为 GL_FALSE 时,OpenGL不会对数据进行归一化处理,传入着色器的值会是原来的值.

归一化通常用于将不同范围的数据转换为标准化的范围,以便在着色器中进行运算。这对于某些着色器效果是必要的,如使用颜色纹理或计算顶点法向量时。


  1. 当 normalized 参数设置为 GL_TRUE 时,OpenGL 会将数据归一化到指定的范围内,通常是 -1.0 到 1.0之间。这意味着,即使顶点数组中存储的数据超出了该范围,OpenGL 也会将其“缩放”到该范围内。 ↩︎

你可能感兴趣的:(OpenGL,算法,c++,qt,python)