muestra:¿Se puede usar objetivos múltiples con un solo VBO?
1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
Así que generan un mango genérica VBO, y luego se unen usando "GL_ARRAY_BUFFER". La unión parece que tiene 2 propósitos:
- Debemos obligar a la memoria intermedia antes de poder copiar los datos a la GPU a través de
glBufferData
- Debemos obligar a la memoria intermedia antes de que podamos añadir atributos a ella a través
glVertexAttribPointer
Y creo que esas son las únicas 2 veces que necesita vincular el VBO. Mi pregunta es, ¿hay algún escenario en el que el objetivo (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER o GL_PIXEL_UNPACK_BUFFER) sea diferente en las líneas 2 y 3? ¿O quisiéramos volver a vincularlo a un objetivo diferente antes de la línea 4?
¿Podemos vincular múltiples destinos de almacenamiento intermedio a un solo VBO?
¡Oooh! ¡Gracias! Esto tiene mucho más sentido ahora. Fue mi pensamiento retrospectivo lo que me estaba tirando. – mpen
En realidad, con respecto al párrafo 3, estás diciendo que 'glBufferData' toma un objetivo para que sus operaciones funcionen ... ¿entonces estás diciendo que esencialmente está usando 'GL_ARRAY_BUFFER' como un búfer de trabajo temporal? ¿Por qué tenemos que vincular el objeto buffer al objetivo y luego especificar el objetivo nuevamente en 'glBufferData'? Básicamente intenté cambiar las líneas 2 y 3 en mi pregunta, y el programa ya no funciona. Intento entender por qué tendrías que especificar el objetivo dos veces, a menos que estén haciendo algo diferente. – mpen
No importa ... Creo que lo descubrí. Vinculamos el objeto del búfer al objetivo y, luego, alimentamos esencialmente los datos a ese objetivo y, por lo tanto, indirectamente al objeto del búfer. Entonces ambos son necesarios. ¿Estoy pensando en esto correctamente? Los datos se vinculan al objeto de memoria intermedia, por lo que podemos borrar 'GL_ARRAY_BUFFER' inmediatamente después de llamar a glBufferData sin perder nada. Supongo que funciona igual que los punteros de atributo. – mpen