OpenGL如何知道每个顶点缓冲区对象的类型?

时间:2012-09-02 16:22:46

标签: opengl vertex-buffer vertex-array

我刚刚阅读了有关顶点数组对象和顶点缓冲区对象的教程,我无法通过以下代码解决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");

2 个答案:

答案 0 :(得分:1)

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

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

void main()
{
    /* ... */
}

答案 1 :(得分:0)

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

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

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