1

我刚刚阅读了有关顶点数组对象和顶点缓冲区对象的教程,但我无法从以下代码中弄清楚 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);

编辑:感谢彼得的回答,我发现以下两行代码将每个 VBO 与着色器连接起来(索引 0 和 1 与 VBO 索引相关):

glBindAttribLocation(programId, 0, "in_Position");
glBindAttribLocation(programId, 1, "in_Color");
4

2 回答 2

1

它没有,你必须告诉它哪个是着色器中的哪个。

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;

void main()
{
    /* ... */
}
于 2012-09-02T16:35:36.707 回答
0

glVertexAttribPointer仅用于着色器。因此,作为着色器编写者,您总是知道每个属性索引应该做什么,因为它映射到顶点着色器中的某个变量。glBindAttribLocation您可以使用命令或glGetAttribLocation或从 GLSL 中的特殊关键字控制变量映射的索引。

如果您只是使用固定功能管道(默认着色器),那么您不想使用glVertexAttribPointer. 而对于固定功能管道,等效命令是glVertexPointerandglColorPointer等。请注意,这些是不推荐使用的命令。

另请注意,对于固定功能glEnableVertexAttribArray将替换为glEnableClientState.

于 2012-09-02T16:35:11.777 回答