es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

  1. Crear los IDs del búfer tanto para el VBO como para el IBO
  2. Enlazar y llenar el VBO
  3. Crear el ID para el VAO
  4. Enlazar el VAO (glBindVertexArray) y configurar el/los atributo(s) (usando glEnableVertexAttribArray, glVertexAttribFormat, glVertexAttribBinding y glBindVertexBuffer)
  5. Enlazar y llenar el IBO
  6. 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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible utilizar un VBO para renderizar utilizando glDrawArrays y glDrawElements a través de un IBO. El IBO se vincula al VBO y/o VAO mediante la función glBindBuffer con el parámetro GL_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 con glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO_ID) antes de cada llamada a glDrawElements.

    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 que glDrawArrays(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!

Comments are closed.