OpenGL - 组合顶点数组对象和索引缓冲区(GL_ELEMENT_ARRAY_BUFFER)

时间:2015-12-16 14:27:57

标签: c++ opengl

我确实希望将Index Buffer(GL_ELEMENT_ARRAY)与Vertex数组对象一起使用。我有以下代码:

// Set stuff up
glGenVertexArrays(1, &VertexArrayObjectId);
glBindVertexArray(VertexArrayObjectId);

glGenBuffers( 1, &ArrayBufferId );
glBindBuffer( GL_ARRAY_BUFFER, ArrayBufferId );
glBufferData( GL_ARRAY_BUFFER, sizeof(float) * finalData.size() , finalGPUData, GL_STATIC_DRAW ); 

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (GLvoid*) 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_TRUE, sizeof(float) * 8, (GLvoid*) 12);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (GLvoid*) 20);

glGenBuffers(1, &IndexBufferId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, finalIndices.size() * sizeof(unsigned int), finalGPUIndices, GL_STATIC_DRAW);

glBindVertexArray(0);
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

//Render 
//Set up shader etc
glBindVertexArray(VertexArrayObjectId);
//glBindBuffer( GL_ARRAY_BUFFER, ArrayBufferId );
//glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (GLvoid*) 0);
//glVertexAttribPointer(1, 2, GL_FLOAT, GL_TRUE, sizeof(float) * 8, (GLvoid*) 12);
//glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 8, (GLvoid*) 20);
glDrawElements(GL_TRIANGLES, finalIndices.size(), GL_UNSIGNED_INT, (void*) 0 );

据我所知,没有必要注释4行代码,因为这些信息存储在VAO中。 (我的意思是,保存这些调用是VAO的目的)但是,如果我运行此代码,它只会在原点而不是正确的顶点位置绘制几个三角形。但是,如果我包含这些行,则所有内容都会正确绘制。显然,GL_ELEMENT_ARRAY_BUFFER信息正确存储在VAO中,但顶点属性却没有。我的理解是错误的还是我的代码中只是错误?

非常感谢任何帮助。

0 个答案:

没有答案