Sat*_*own 5 c++ opengl render vbo
我正在将我的顶点数组函数转移到VBO,以提高我的应用程序的速度.
这是我原来的工作顶点数组渲染函数:
void BSP::render()
{
glFrontFace(GL_CCW);
// Set up rendering states
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].u);
// Draw
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices);
// End of rendering - disable states
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
Run Code Online (Sandbox Code Playgroud)
工作得很好!
现在我将它们转移到VBO中,我的程序实际上导致我的显卡停止响应.我的顶点和索引上的设置完全相同.
新设置:
vboId在bsp.h中设置如下:GLuint vboId [2];
我刚刚运行createVBO()函数时没有出错!
void BSP::createVBO()
{
// Generate buffers
glGenBuffers(2, vboId);
// Bind the first buffer (vertices)
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Now save indices data in buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}
Run Code Online (Sandbox Code Playgroud)
以及VBOS的渲染代码.我很确定它就在这里.只想像在顶点数组中那样在VBO中渲染什么.
渲染:
void BSP::renderVBO()
{
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]); // for vertex coordinates
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]); // for indices
// do same as vertex array except pointer
glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr
// draw the bsp area
glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
glDisableClientState(GL_VERTEX_ARRAY); // deactivate vertex array
// bind with 0, so, switch back to normal pointer operation
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
Run Code Online (Sandbox Code Playgroud)
不确定错误是什么,但我很确定我的渲染功能错了.希望有一个更加统一的教程,因为有一堆在线但他们经常互相矛盾.
如果您在不使用 VBO 时将相同的数据传递给 glDrawElements,并将相同的数据传递给 VBO 缓冲区。那么,无论您使用过没有 FBO 的情况,GL_UNSIGNED_SHORT还是使用过 FBO 的情况,参数几乎没有什么不同GL_UNSIGNED_BYTE。所以我认为 VBO 调用应该是这样的:
glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_SHORT, 0);
Run Code Online (Sandbox Code Playgroud)
另请参阅本教程,其中对 VBO 缓冲区解释得非常好。