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