Me di cuenta de que a menos que vuelva a llamar a VertexAttribPointer, no hay entradas para los sombreadores después de un BindBuffer. ¿Es eso necesario? Los sombreadores no pueden cambiar por escrito, sino solo los almacenamientos intermedios utilizados.¿Se necesita VertexAttribPointer después de cada BindBuffer?
Respuesta
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).
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
- 1. ¿Por qué se necesita reiniciar CruiseControl.NET después de GetCcNetConfigFiles?
- 2. ¿Cada vista nueva necesita un nuevo layoutparams?
- 3. mysql - ¿Se necesita FLUSH TABLE?
- 4. ¿Por qué cada proceso necesita su propia tabla de páginas?
- 5. Vim a menudo necesita Redraw después de dividir
- 6. Agregar espacio después de cada cuarto signo +
- 7. Redibujar UIScrollVer contenido después de cada zoom
- 8. ¿Debo hacer pop después de cada binmode?
- 9. Insertar tr después de cada tercer ciclo
- 10. ¿Todavía se necesita rmic?
- 11. ¿Cuándo se necesita NSCopying?
- 12. ¿Se necesita bscmake con Visual Studio 2010?
- 13. Qué filtro de Kalman se necesita
- 14. ¿Se necesita proguard.cfg para proyectos de biblioteca?
- 15. ¿Se necesita punto y coma después de una asignación literal de objeto en JavaScript?
- 16. ¿Se puede configurar el registrador Ruby estándar para que se descargue después de cada mensaje?
- 17. ¿Para qué se necesita SynchronizationContext.IsWaitNotificationRequired?
- 18. ¿Se necesita más memoria intermedia?
- 19. ¿Cuándo se necesita realmente 'Rendimiento'?
- 20. ¿Por qué se necesita typeof?
- 21. teniendo que reconstruir en VS 2010 después de cada modificación
- 22. ¿Por qué se necesita NotificationCompat?
- 23. ContentControl with DataTemplateSelector - se necesita ayuda
- 24. Congelación de VisualStudio 2010 después de cada compilación
- 25. Se necesita asesoramiento en el diseño de bases de datos
- 26. Pinging Google sitemap después de cada nueva presentación de artículo?
- 27. . Paralelo sucesivo de .NET para - Bloqueo después de cada
- 28. Evitar que se cierren las opciones de autocompletado de Jquery después de cada selección
- 29. ayuda con Regex - necesita hasta 3 números después del punto (.)
- 30. Se necesita tutorial de RestKit ObjectMapping 2.0