2010-09-08 10 views

Respuesta

24

tibur ya respondió a la pregunta real, pero pensé que iba a agregar algo de contexto.

glBindBuffer(GL_ARRAY_BUFFER, ...) por sí solo no hacer cualquier cosa. Piense en ello como un argumento adicional al glVertexAttribPointer.

Recuerde, puede enlazar múltiples buffers a diferentes atributos (por ejemplo attrib 0 utiliza vbo 1, mientras que attrib 1 y 2 utilizan vbo 2). ¿Qué orden de API verías para esa configuración?

Con la API actual, es algo así como:

glBindBuffer(GL_ARRAY_BUFFER, 1); 
glVertexAttribPointer(0, ...) 
glBindBuffer(GL_ARRAY_BUFFER, 2); 
glVertexAttribPointer(1, ...) 
glVertexAttribPointer(2, ...) 

glDraw*(...) 

¿Por qué el trabajo de especificación de esa manera? Bueno, es la compatibilidad con versiones anteriores alzando su cabeza. Cuando se introdujeron VBO, glVertexPointer et al. no tenía ningún parámetro para pasar qué objeto de búfer usar. O bien, eran muchos puntos de entrada nuevos para cada semántica (VertexPointer/NormalPointer/TexCoordPointer ...), o era un punto de entrada adicional por sí mismo, que solo actuaba como un parámetro adicional para * Pointer Calls. Eligieron este último (como nota al margen, esta es también la razón por la que tiene que pasar un desplazamiento dentro del búfer como un puntero).

13

acuerdo con OpenGL OpenGL specifications, página 51 (Tampón objeto de estado), el estado correspondiente a los punteros de matriz almacena el ID buffer. Eso significa que si desea cambiar el objeto de memoria intermedia para dibujar, usted necesita para recuperar la función glVertexAttribPointer.

glBindBuffer(1); 
glVertexPointer(...); 
glDrawArrays(...); /// Drawing will use buffer 1 

glBindBuffer(2); 
glDrawArrays(...); /// Drawing will still use buffer 1 

glVertexPointer(...); 
glDrawArrays(...); /// Drawing will now use buffer 2 
Cuestiones relacionadas