2009-08-02 12 views
6

Acabo de intentar renderizar el primer ejemplo de redbook (el Quad blanco) usando VBO.
Funciona bien con modo inmediato y matrices de vértices.Problema al usar el VBO de OpenGL

Pero al usar VBO, la pantalla permanece en negro. Creo que me he perdido algo importante.

init:

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); 

renderloop para VBO (no funciona):

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); 

renderloop para las matrices de vértices (de trabajo):

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); 

Respuesta

5

argh yo sólo lo descubrió por tratando de leer el contenido del buffer:

que necesito para asignar la memoria intermedia con 12 * sizeof (GLfloat) en lugar de sólo el 12

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

mi leer de nuevo código

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 ]; 
} 
+0

+1 impresionante! Tenía exactamente el mismo problema, ¡muchas gracias! –

Cuestiones relacionadas