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?
Respuestas:
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).
fuente
Cuales son las alternativas? Bueno, una alternativa es usar Geometry Shaders , pasando un
GL_LINES_ADJACENCY
primitivo (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_TRIANGLES
yGL_TRIANGLE_STRIP
con 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.
fuente
glMultiDrawArraysIndirect
que hacerlo en el lado de la GPU. Lo que puedes hacer, pero limita el hardware.