Uso de Objetos de Matriz de Vértices y Objetos de Búfer de Vértices


Estoy tratando de entender estos dos, cómo usarlos y cómo están relacionados. Digamos que quiero crear un terreno simple y un cubo texturizado. Para ambos objetos tengo la matriz de triángulos vértices y para el cubo tengo una matriz que contiene los datos de la textura. Mi pregunta es: ¿cómo uso VAOs y VBOs para crear y renderizar estos dos?

  1. ¿Tendría que crear un VAO y un VBO para cada objeto?
  2. o debería crear un VAO para el VBO de cada objeto (vértices, datos de textura, etc.)?

Hay muchos tutoriales y libros, pero todavía no tengo la idea de cómo estos conceptos deben ser entendidos y utilizados.

Author: Cor_Blimey, 2014-04-26

2 answers

Fundamentalmente, necesitas entender dos cosas:

  1. Los objetos de matriz de vértices (VAOs) son conceptualmente nada más que envoltorios de estado finos.

  2. Los objetos de búfer de vértices (VBOs) almacenan datos reales.

Otra forma de pensar sobre esto es que los VAOs describen los datos almacenados en uno o más VBOs.

Piense en los VBOs (y los objetos de búfer en general) como matrices no estructuradas de datos almacenados en la memoria del servidor (GPU). Puede diseñar su vértice datos en varios arrays si lo desea, o puede empaquetarlos en un solo array. En cualquier caso, los objetos de búfer se reducen a ubicaciones donde almacenará datos.

Los objetos de matriz de vértices rastrean punteros a la memoria VBO necesaria para los comandos de dibujo.

Son un poco más sofisticados que los punteros, como los conocerías en un lenguaje como C, sin embargo. Los punteros de vértices realizan un seguimiento del objeto buffer que estaba enlazado especificado, el desplazamiento en su espacio de direcciones, paso entre los atributos de vértice y cómo interpretar los datos subyacentes (por ejemplo, si se deben mantener los valores enteros o convertirlos en punto flotante [0.0,1.0] normalizando al rango del tipo de datos).

Por ejemplo, los datos enteros generalmente se convierten en punto flotante, pero es el comando que usa para especificar el puntero de vértice(glVertexAttribPointer (...) vs.glVertexAttribIPointer (...)) que determina esto comportamiento.

Los objetos Vertex Array también rastrean el objeto buffer actualmente enlazado a GL_ELEMENT_ARRAY_BUFFER.

GL_ELEMENT_ARRAY_BUFFER es donde el comando: glDrawElements (...) sources its list of indices from (assuming a non-zero binding) and there is no glElementArrayPointer (...) comando. glDrawElements (...) combina el comando puntero y dibujar en una sola operación, y utilizará el enlace almacenado en el objeto de matriz de Vértices activo para lograr esto.


Con eso fuera del camino, a menos que sus objetos comparten datos de vértices generalmente necesitará un conjunto único de VBOs para cada uno.

Puede usar una sola VAO para todo su software si lo desea, o puede aprovechar el hecho de que cambiar la VAO enlazada cambia casi todo el conjunto de estados necesarios para dibujar diferentes objetos.

Por lo tanto, dibujar su terreno y cubo podría ser tan simple como cambiar el VAO encuadernado. Es posible que tenga que hacer más que eso si necesita aplicar diferentes texturas a cada uno de ellos, pero el VAO se encarga de toda la configuración relacionada con los datos de vértices.

 48
Author: Andon M. Coleman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-26 22:10:23

Su pregunta no es fácilmente respondible aquí, sino más bien en un tutorial. Probablemente ya conoces estos dos sitios web, pero si no, te dejo las referencias.

OGLDEV

OpenGL-Tutorial.org

Ahora tratando de aclarar sus preguntas, un objeto de Matriz de Vértices es un objeto OpenGL diseñado con el objetivo de reducir la sobrecarga de API para llamadas de dibujo. Se puede pensar en él como un contenedor para un búfer de Vértices y sus estados asociados. Algo similar tal vez a las antiguas listas de visualización. Normalmente, hay una relación de 1 a 1 entre un VAO y un VBO; es decir, cada VAO contiene un VBO único. Pero esto no es estrictamente necesario. Podrías tener varios VAOs haciendo referencia al mismo VBO.

La forma más sencilla de modelar esto en código, creo, sería tener una clase/tipo VAO y un método para adjuntarle un VBO. A continuación, dar una instancia de VAO a cada malla. La malla a su vez puede tener una referencia a un tipo VBO que puede ser propio o compartido.

 8
Author: glampert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-26 19:06:30