清除 glVertexAttribPointer 参数的概念

Clearing the concept of glVertexAttribPointer parameters

本文关键字:参数 glVertexAttribPointer 清除      更新时间:2023-10-16

我见过一些OpenGL的例子,它们使用:

glVertexAttribPointer(0, 3, GL_FLOAT, false, Vertex.SIZE * 4, 0);

将数据传递到顶点着色器时,有些使用:

GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);

其中position是顶点着色器接收的第一个属性(我猜你可以说是管道本身的第一个属性)。

有什么区别?

是一回事吗?

如果我像第一个示例中一样在第一个参数中指定0,这是否意味着它将转到 OpenGL 管道的第一个属性?(这是顶点着色器中的"位置"),它只是第二个示例中执行代码的较短方式?

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

index参数对应于着色器中的layout(location = index)。在 glsl 中,您可以通过执行以下操作来指定输入变量的位置

layout(location = 12) in vec2 position;

然后你应该运行

glVertexAttribPointer(12, 2, GL_FLOAT, GL_FALSE, 0, 0);

如果未在着色器中指定layout(location),则将为输入变量分配默认布局位置。由于在您的情况下,position 是第一个输入变量,因此它会0获取位置。

glGetAttribLocation(shaderProgram, "position");查询输入变量position的布局位置。

更多信息可以在这里找到: https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)