¿Cuál es el uso principal de los objetos Vertex Buffer?

8

Por lo que he leído, parece que los VBO son puramente por rendimiento.

Estoy trabajando en un proyecto de aprendizaje muy rudimentario en lwjgl y solo estoy tratando de descubrir qué características más avanzadas de la biblioteca debería profundizar y cuál es su uso.

Tengo entendido que los VBO permiten a una persona mantener vértices en VRAM mientras no se dibujan en una escena. En mi caso, solo estoy dibujando quads y el rendimiento probablemente no sea una preocupación en absoluto, pero estoy tratando de reconstruir lo que sucede debajo del capó. Si estoy dibujando quads directamente, estoy dibujando desde la memoria de la CPU, ¿correcto? Además, si no estoy haciendo ninguna verificación de visibilidad, ¿eso significa que estoy representando absolutamente todo en la "escena", independientemente de si está a la vista? ¿Son los VBO una forma de almacenar objetos y solo representar lo que se necesita?

sensae
fuente

Respuestas:

10

Nota pedagógica: No hay tal cosa en OpenGL como un "objeto de búfer de vértices". Simplemente hay objetos de memoria intermedia . Un objeto de búfer es simplemente una matriz lineal de memoria de GPU que puede asignar, llenar con datos, leer y usar de varias maneras. Una de las cosas que puede hacer con los objetos de búfer es almacenar datos de vértices en ellos y usarlos como matrices de origen para la representación. Pero también tienen muchos otros usos .

Los objetos de almacenamiento intermedio no son una forma de evitar el sacrificio de frustum u otras construcciones de estilo gráfico de escena. Cuando se usan para datos de vértices, los objetos de búfer simplemente almacenan datos de vértices. Sin ellos, sus glDrawElements/Arrays/etcllamadas extraerán datos de las matrices almacenadas en los búferes de miembros de la CPU. Cuando se utilizan objetos de búfer para renderizar, las matrices se extraen del contenido de los objetos de búfer.

De dónde provienen los datos de vértice es la única diferencia entre renderizar con objetos de búfer y renderizar sin ellos. Por lo tanto, no hay sacrificio de sacrificio. Sin gestión de gráficos de escena. Nada. Se trata de dónde se almacenan los datos de vértices.

Nicol Bolas
fuente
1
Podría aclarar un poco y mencionar que la optimización real que hace al usar VBO se relaciona con el bus entre la CPU y la GPU, que es relativamente lento (y polémico). Si esta velocidad del bus fuera insignificante, prácticamente no habría diferencia entre usar un VBO y usar una matriz de flotadores del lado de la CPU.
notlesh
1
También vale la pena señalar que su controlador es libre de almacenar objetos de almacenamiento intermedio donde lo desee, incluso en la memoria de la CPU.
Maximus Minimus
Aparte de eso, construir un VBO / VAO y simplemente llamar a drawarrays es (en mi humilde opinión) más fácil que tener que hacer un bucle de funciones de tubería fijas para todos los vértices / caras. Es como decirle a la tarjeta gráfica "ve a pasar esta caja de triángulos a través de ese sombreador" en lugar de "Ve a tomar ese vértice, ese vértice y eso, y haz un pequeño triángulo feliz allí. Ahora toma el siguiente ...". Oh, espera, ahora me estoy metiendo en los sombreadores más que en los VBO.
Exilyth
2

Los búferes de matriz OpenGL (= lo que llamamos VBO) tienen un único propósito: mantener sus datos de geometría dentro de la memoria de la GPU, no en la memoria del cliente, para que no tenga que volver a enviarlo cada fotograma.

Tan simple como eso :-)

Kos
fuente