¿Sigue habiendo ventajas al usar gl_quads?

10

OK, entiendo que gl_quads están en desuso, y por lo tanto no se supone que los usemos más. También entiendo que una PC moderna cuando ejecuta un juego usando gl_quads en realidad está dibujando dos triángulos.

Ahora, he escuchado por eso que un juego debería escribirse usando triángulos. Pero me pregunto si, debido a los detalles de cómo OpenGL convierte ese quad en dos triángulos, ¿es ventajoso usar quads todavía?

Específicamente, actualmente estoy representando muchos quads no conectados de objetos de búfer bastante grandes. Una de las áreas que debo tener cuidado es qué tan grande es el vector de flotadores que estoy usando para hacer / actualizar estos objetos de búfer (tengo bastantes valores de flotador adicionales por vértice y muchos vértices en un búfer: el los amortiguadores más grandes son de aproximadamente 500 KB).

Por lo tanto, me parece que si cambio mis objetos de búfer para dibujar triángulos, estos datos de vértice serán un 50% más grandes (seis vértices para dibujar un cuadrado en lugar de 4), y la CPU tardará un 50% más en generarse.

Si gl_quads sigue funcionando, ¿estoy obteniendo un beneficio aquí, o todavía se está utilizando el 50% de memoria adicional y tiempo de CPU en la conversión automática de OpenGL a dos triángulos?

usuario27018
fuente
55
Estoy seguro de que OpenGL admite algún tipo de búfer de vértices indexados, lo que significa que almacena solo los mismos 4 vértices para un quad, y en lugar de repetir vértices completos para formar los dos triángulos, solo repite los índices: [0,1,2] , [2,3,0]
Gran respuesta aquí
bobobobo
Creo que la especificación GL todavía estipula algunos casos en los que dibujar como un quad es importante, por ejemplo, con glPolygonMode (..., GL_LINE).
Maximus Minimus

Respuestas:

5

Pon a prueba tu juego real. Si los quads son más rápidos, úselos. Si no, no lo hagas.

Uno puede razonar que son más lentos en algunos casos porque algún hardware no admite quads, por lo que el controlador tiene que hacer mucho trabajo para "arreglar" las llamadas de extracción cuádruple. Algunos hardware admiten quads, haciendo la división en triángulos en algún paso de ensamblaje de entrada de función fija, por lo que funciona sin una sobrecarga significativa. También hay preguntas con respecto a cómo se envían los quads indexados frente a los no indexados, según ha planteado, y qué aprovecha mejor el ancho de banda de transferencia de bus limitado y el tiempo de generación de CPU. La sabiduría popular dice que evite los cuádriceps, lo cual es un buen consejo si parte de la nada, tal vez no tanto si su código ya funciona. La sabiduría popular dice que muchas cosas asesinan el rendimiento a pesar de los juegos reales y de buen rendimiento que hacen esas cosas.

En resumen, prueba. No asumas y no le pidas a Internet consejos de rendimiento. Es posible que tengamos razón algunas veces, pero con mayor frecuencia le proporcionaremos datos desactualizados, datos basados ​​en alguna circunstancia específica en la que no se encuentre, o basura directa que nosotros mismos adquirimos de segunda mano de Internet o colegas (quienes no pueden tener experiencia de primera mano).

Sean Middleditch
fuente
3

Cuales son las alternativas? Bueno, una alternativa es usar Geometry Shaders , pasando un GL_LINES_ADJACENCYprimitivo (4 vértices) y haciendo que el GS convierta este primitivo en una tira triangular. Sin embargo, será más lento de renderizar, porque uno debería asumir que los sombreadores de geometría siempre son más lentos de renderizar.

Un mejor método es usar renderizado indexado. Aquí, tiene dos alternativas: GL_TRIANGLESy GL_TRIANGLE_STRIPcon reinicio primitivo. Este último dará como resultado un búfer de índice ligeramente más corto (un índice por cada quad). Puede reutilizar el mismo búfer de índice para cualquier representación cuádruple, por lo que no necesitará actualizar o modificar el búfer de índice.

También sugeriría usar cortos sin signo como tipo de índice. Si necesita renderizar más de 16384 quads a la vez, haga múltiples llamadas de renderizado, usando glDrawElementsBaseVertex para compensar los índices.

Nicol Bolas
fuente
Algunas evaluaciones comparativas recientes que he hecho muestran que glMultiDrawArrays ahora es un camino rápido tanto en NV como AMD (no se molestó con Intel), por lo que hay otra opción: glMultiDrawArrays con ventilador o tira.
Maximus Minimus
@ mh01: Esto requiere una matriz de comandos de dibujo del lado del cliente. Tendría glMultiDrawArraysIndirectque hacerlo en el lado de la GPU. Lo que puedes hacer, pero limita el hardware.
Nicol Bolas