C++ 清除glvertexattributepointer参数的概念

C++ 清除glvertexattributepointer参数的概念,c++,opengl,C++,Opengl,我已经看到一些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); 将数据传递到顶点着色器时,以及一些使用: glVertexAttri

我已经看到一些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);
将数据传递到顶点着色器时,以及一些使用:

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
参数对应于着色器中的
布局(位置=索引)
。在glsl中,可以通过执行以下操作指定输入变量的位置

layout(location = 12) in vec2 position;
那你应该跑了

glVertexAttribPointer(12, 2, GL_FLOAT, GL_FALSE, 0, 0);
如果未在着色器中指定
布局(位置)
,则将为输入变量指定默认布局位置。因为在您的例子中,
position
是第一个输入变量,所以它获取位置
0

glGetAttriblLocation(着色器程序,“位置”)查询输入变量的布局位置
位置

更多信息可在此处找到: