清除glVertexAttribPointer参数的概念

时间:2017-01-18 00:48:00

标签: c++ opengl

我看过一些使用的OpenGL示例:

numpy.linalg.eig

将数据传递给顶点着色器时,以及一些使用:

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,就像在第一个例子中一样,这是否意味着它会转到OpenGL管道的第一个属性? (这是顶点着色器中的'位置'),它只是在第二个示例中执行代码的一种较短方式?

1 个答案:

答案 0 :(得分:1)

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)