Use un Vertex Buffer Object para glDrawArrays (ignorando IBO) y glDrawElements (con un IBO).
Tengo un objeto de búfer de vértices (VBO) que suelo usar (con un VAO adecuado) para dibujar puntos con líneas entre ellos a través de dos llamadas a glDrawArrays
(una con GL_POINTS y otra con GL_LINE_STRIP).
Ahora estoy interesado en deshacerme de GL_LINE_STRIP y dibujar líneas entre índices específicos en el VBO al definir un objeto de búfer de índices (IBO) y usar glDrawElements
.
Sin embargo, cuando creo el VBO y luego creo y lleno el IBO, ¡mi llamada a glDrawArrays(GL_POINTS,...)
no hace nada! Si simplemente comento la línea que llama a glBufferData(GL_ELEMENT_ARRAY_BUFFER,...)
, la llamada a glDrawArrays
vuelve a funcionar. Supuse que agregar un IBO simplemente sería ignorado por la llamada a glDrawArrays
, pero al parecer no lo es.
Entonces, ¿es posible usar un solo VBO para renderizar usando glDrawArrays
y (a través de un IBO) glDrawElements
?
Una confusión para mí es cómo se vincula el IBO con el VBO y/o el VAO y, por lo tanto, con el comando de dibujo actual. Por ejemplo, ¿es posible usar un solo VBO y luego enlazar dos IBO diferentes para diferentes llamadas a glDrawElement
? (por ejemplo, ¿qué pasa si quiero dibujar triángulos con índices 0, 1, 2 y 1, 2, 3; pero luego quiero dibujar líneas entre los índices 0, 1 y 1, 3).
Los pasos que estoy siguiendo en el código para conectar el IBO con mi VAO son los siguientes:
- Crear los IDs del búfer tanto para el VBO como para el IBO
- Enlazar y llenar el VBO
- Crear el ID para el VAO
- Enlazar el VAO (
glBindVertexArray
) y configurar el/los atributo(s) (usandoglEnableVertexAttribArray
,glVertexAttribFormat
,glVertexAttribBinding
yglBindVertexBuffer
) - Enlazar y llenar el IBO
- Desenlazar el VAO (
glBindVertexArray(0)
)
¿Hay algo más que necesite usar (o un orden de acciones diferente) para asociar el IBO con el VAO?
Gracias.
EDITAR – Encontré mi error en el código:
Cuando generé mis búferes, generé 4 de una vez en una única matriz (para usar con este y otros búferes de OpenGL en el código). Sin embargo, cuando asigné los IDs a nombres de variables específicos, utilicé el índice 0 (cero) tanto para el VBO como para el IBO (luego utilicé los índices 2 y 3 para otros búferes). Básicamente, accidentalmente omití el índice 1 y, por lo tanto, sobrescribí mi VBO cuando llené mi IBO. Como se menciona en un comentario a continuación, este ejercicio al menos ayudó a solidificar mi comprensión de cómo se usan los IBO en el contexto de los VBO. Gracias.
davy.ai
Sí, es posible utilizar un VBO para renderizar utilizando
glDrawArrays
yglDrawElements
a través de un IBO. El IBO se vincula al VBO y/o VAO mediante la funciónglBindBuffer
con el parámetroGL_ELEMENT_ARRAY_BUFFER
para vincular el IBO al estado actual del VAO.Para responder a la segunda pregunta, sí es posible utilizar un VBO y luego vincular dos IBOs diferentes para diferentes llamadas de
glDrawElements
. Simplemente puedes vincular un IBO diferente conglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO_ID)
antes de cada llamada aglDrawElements
.En cuanto a los pasos que has realizado para conectar el IBO con tu VAO, el orden de las acciones parece correcto. Sin embargo, asegúrate de llamar a
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO_ID)
después de haber vinculado tu VAO (glBindVertexArray
) y configurado tus atributos de vértice.En tu caso, dado que comentar la llamada
glBufferData(GL_ELEMENT_ARRAY_BUFFER,...)
hace queglDrawArrays(GL_POINTS,...)
funcione de nuevo, es probable que el problema esté en cómo generas y asignas IDs a tus buffers. Asegúrate de no sobrescribir la ID del VBO con la ID del IBO, ya que esto puede provocar un comportamiento inesperado.¡Espero que esto te ayude!