我刚刚阅读了有关顶点数组对象和顶点缓冲区对象的教程,我无法通过以下代码解决OpenGL如何知道第一个VBO(vertexBufferObjID[0]
)表示顶点坐标,以及第二个VBO(vertexBufferObjID[1]
)表示颜色数据?
glGenBuffers(2, vertexBufferObjID);
// VBO for vertex data
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[0]);
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// VBO for colour data
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[1]);
glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), colours, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
编辑:感谢Peter的回答,我发现以下两行代码将每个VBO与着色器连接起来(索引0和1与VBO索引相关):
glBindAttribLocation(programId, 0, "in_Position");
glBindAttribLocation(programId, 1, "in_Color");
答案 0 :(得分:1)
它没有,你必须告诉它哪个是着色器。
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
void main()
{
/* ... */
}
答案 1 :(得分:0)
glVertexAttribPointer
仅用于着色器。因此,作为着色器编写者,您始终知道每个属性索引应该做什么,因为它映射到顶点着色器中的某个变量。您可以使用命令glBindAttribLocation
或glGetAttribLocation
或GLSL内的特殊关键字将索引控制为变量映射。
如果您只是使用固定功能管道(默认着色器),那么您不想使用glVertexAttribPointer
。相反,对于固定功能管道,等效命令为glVertexPointer
和glColorPointer
等。请注意,这些是不推荐使用的命令。
另请注意,对于固定功能,glEnableVertexAttribArray
将替换为glEnableClientState
。