使用索引VBO

时间:2016-05-22 10:42:39

标签: c++ opengl

我正在研究一个简单的3D引擎。我目前有一个带有多个VAO的工作设置,我可以在渲染循环期间切换,但它们都没有使用索引缓冲区。

我现在正在尝试添加一个由4个VBO组成的新VAO:垂直位置,颜色,法线和索引。

所有内容都编译并运行,但是第二个VAO(带索引顶点)的绘图调用不会呈现。我确定我的设置存在问题,因此我添加了此代码,其中包括所有VAO和VBO代,调用和使用。这段代码中的任何内容都显示错误,这是设置它的正确方法吗?

VAO1有3个缓冲区:位置,颜色,法线

VAO2有3个缓冲区:位置,颜色,法线和顶点索引

//Initalize vaos and vbos
GLuint vao1, vbo1[3];
GLuint vao2, vbo2[4];

//Generate Vertex arrays:
glGenVertexArrays(1, &vao1);
glGenVertexArrays(1, &vao2);

//Generate Buffers:
glGenBuffers(3, vbo1);
glGenBuffers(4, vbo2);

//Initalize Bufferdata vectors:
vector<GLfloat> VertPosBuffer1Vector;
vector<GLfloat> VertNormalBuffer1Vector;
vector<GLfloat> VertColorBuffer1Vector;

vector<GLfloat> VertPosBuffer2Vector;
vector<GLfloat> VertNormalBuffer2Vector;
vector<GLfloat> VertColorBuffer2Vector;
vector<GLuint> VertIndexBuffer2Vector;

//Fill Buffers:
//(not included but all vectors are filled with data)

//VAO 1
glBindVertexArray(vao1);

//Vertex position buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo1[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer1Vector.size(), &VertPosBuffer1Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);

//Vertex color buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo1[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer1Vector.size(), &VertColorBuffer1Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);

//Vertex normal buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo1[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer1Vector.size(), &VertNormalBuffer1Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(2);

//VAO 2
glBindVertexArray(vao2);

//Vertex position buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo2[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer2Vector.size(), &VertPosBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);   

//Vertex color buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo2[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer2Vector.size(), &VertColorBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);   

//Vertex normal buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo2[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer2Vector.size(), &VertNormalBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(2);

//Vertex index buffer:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo2[3]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*VertIndexBuffer2Vector.size(), &VertIndexBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(3);

//unbind vao
glBindVertexArray(0);
//bind first vao
glBindVertexArray(vao1);

//RENDERLOOP

//render objects from vao1 using:
glDrawArrays(GL_TRIANGLES, start, size);

//switch vao
glBindVertexArray(0); 
glBindVertexArray(vao2);

//render objects from vao2 using:
glDrawElements(
   GL_TRIANGLES,        
   start,           
   GL_UNSIGNED_INT, 
   (void*)0         
);

我已检查过缓冲区中的数据是否正确。

着色器没有接收任何索引信息是否正确?着色器将与我没有使用索引缓冲区相同吗?

谢谢

1 个答案:

答案 0 :(得分:2)

索引不是顶点属性。所以你需要做的就是删除这两行:

glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(3);

我还注意到你使用变量“start”作为glDrawElements的count参数。我不知道start和size的值,但我假设你应该使用“size”作为glDrawElements中的第二个参数。