2017-01-18 27 views
0

我已经看到了使用一些OpenGL的例子:清除glVertexAttribPointer的概念参数

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管道的第一个属性? (这是顶点着色器中的“位置”),它只是在第二个示例中执行代码的一种较短的方式?

回答

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)