studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones opengl buffer vbo vertices vao

opengl - reales - Uso de Objetos de matriz vértice y Objetos de memoria intermedia vértice



libro de android studio en español pdf (2)

Fundamentalmente, debes entender dos cosas:

  1. Objetos de matriz vértice (VAO) son conceptualmente nada más que envoltorios de estado delgado.

  2. Objetos de búfer vértice (VBO) almacenan datos reales.

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

Piense en los VBO (y en los objetos de memoria intermedia en general) como conjuntos de datos no estructurados almacenados en la memoria del servidor (GPU). Puede diseñar sus datos de vértice en múltiples matrices si lo desea, o puede empacarlos en una sola matriz. En cualquier caso, los objetos del búfer se reducen a ubicaciones donde almacenará datos.

Vertex Array Objects sigue los punteros reales a la memoria VBO necesaria para los comandos de dibujo.

Sin embargo, son un poco más sofisticados que punteros ya que los conocerías en un lenguaje como C. Los punteros de vértice realizan un seguimiento del objeto de búfer que estaba vinculado cuando se especificaron, el desplazamiento en su espacio de direcciones, zancada entre atributos de vértice y cómo interpretar los datos subyacentes ( por ejemplo, si conservar valores enteros o convertirlos a punto flotante [ 0.0 , 1.0 ] al normalizar el rango del tipo de datos).

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

Vertex Array Objects también realiza un seguimiento del objeto de búfer enlazado actualmente a GL_ELEMENT_ARRAY_BUFFER .

GL_ELEMENT_ARRAY_BUFFER es donde el comando: glDrawElements (...) su lista de índices (suponiendo un enlace distinto de cero) y no existe el glElementArrayPointer (...) . glDrawElements (...) combina el puntero y el comando draw en una sola operación, y usará el enlace almacenado en el Objeto Vertex Array activo para lograr esto.

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

Puede usar un solo VAO para todo su software si lo desea, o puede aprovechar el hecho de que cambiar el VAO encuadernado 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 ocupa de toda la configuración relacionada con los datos de los 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 entiendo cómo estos conceptos deben ser comprendidos y utilizados.


Su pregunta no es fácil de responder aquí, sino más bien en un tutorial. Probablemente ya conozcas estos dos sitios web, pero si no, dejo las referencias.

OGLDEV

OpenGL-Tutorial.org

Ahora, tratando de dilucidar sus preguntas, un Objeto Vertex Array es un objeto OpenGL diseñado con el objetivo de reducir la sobrecarga API para llamadas al sorteo. Puede considerarlo como un contenedor para un Vertex Buffer 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. Puede tener varios VAO que hagan referencia al mismo VBO.

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