使用 OpenGL 的 VBO 的问题

Posted

技术标签:

【中文标题】使用 OpenGL 的 VBO 的问题【英文标题】:Problem with using OpenGL's VBO 【发布时间】:2009-08-02 13:10:44 【问题描述】:

我刚刚尝试使用 VBO 渲染第一个红皮书示例(白色 Quad)。 它适用于立即模式和顶点数组。

但是当使用 VBO 时,屏幕保持黑色。我想我一定错过了一些重要的事情。

初始化:

unsigned int bufIds[2];
glGenBuffers( 2, bufIds );
GLfloat vertices[] = 
  0.25, 0.25, 0.0,
  0.75, 0.25, 0.0,
  0.75, 0.75, 0.0,
  0.25, 0.75, 0.0
;
glBindBuffer( GL_ARRAY_BUFFER, bufIds[0] );
glBufferData( GL_ARRAY_BUFFER, 12, vertices, GL_STATIC_DRAW );
glBindBuffer( GL_ARRAY_BUFFER, 0 );

glClearColor( 0, 0, 0, 1 );
glColor3f( 1, 1, 1 );
glOrtho( 0.0, 1.0, 0.0, 1.0, -1.0, 1.0 );

VBO 的渲染循环(不工作):

glClear( GL_COLOR_BUFFER_BIT );
glEnableClientState( GL_VERTEX_ARRAY );
glBindBuffer( GL_ARRAY_BUFFER, bufIds[0] );
glVertexPointer( 3, GL_FLOAT, 0, 0 );
glDrawArrays( GL_QUADS, 0, 12 );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glDisableClientState( GL_VERTEX_ARRAY );

顶点数组的渲染循环(工作):

glClear( GL_COLOR_BUFFER_BIT );
glEnableClientState( GL_VERTEX_ARRAY );
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glVertexPointer( 3, GL_FLOAT, 0, vertices );
glDrawArrays( GL_QUADS, 0, 12 );
glDisableClientState( GL_VERTEX_ARRAY );

【问题讨论】:

【参考方案1】:

啊,我只是通过尝试读回缓冲区的内容才弄明白的:

我需要用 12 * sizeof( GLfloat ) 而不是只有 12 来分配缓冲区

glBufferData( GL_ARRAY_BUFFER, 12 * sizeof( GLfloat ), vertices, GL_STATIC_DRAW );

我的回读代码

GLfloat vertices2[12];
glBindBuffer( GL_ARRAY_BUFFER, bufIds[0] );
glGetBufferSubData ( GL_ARRAY_BUFFER, 0, 12 * sizeof( GLfloat ), vertices2 );
glBindBuffer( GL_ARRAY_BUFFER, 0 );

for ( int i = 0; i < 4; i ++ ) 
    LOG_DEBUG << "point " << i << ": " << vertices2[ i * 3 + 0 ] << " / " << vertices2[ i * 3 + 1 ] << " / " << vertices2[ i * 3 + 2 ];

【讨论】:

+1 太棒了!我遇到了完全相同的问题,非常感谢!

以上是关于使用 OpenGL 的 VBO 的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 的 VBO 的问题

OpenGL:用 VBO 画线

使用带索引的 VBO 的 OpenGL

OpenGL:VAO/VBO 混淆

OpenGL - 会使用多个 VBO 减慢渲染速度吗?

OpenGL VBO 绘图