使用OpenGL的VBO出现问题

6

我刚刚尝试使用VBO(顶点缓冲对象)来呈现第一个红皮书例子(白色四边形)。

使用立即渲染模式和顶点数组可以正常工作。

但是,当使用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个回答

5

啊!我刚刚通过尝试读取缓冲区的内容弄清楚了:

我需要分配一个大小为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 太棒了!我也遇到了同样的问题,非常感谢你! - Piotr Justyna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接