Necesito dibujar muchos polígonos que consisten en 6 vértices (dos triángulos).
Sin coordenadas de textura, normales, etc., ambos enfoques dan como resultado 72 bytes. En el futuro, definitivamente también necesitaría coordenadas de textura y normales, lo que haría que el dibujo de índice consumiera menos memoria. Aunque no mucho.
Entonces mi pregunta es: para VAO con pocas superposiciones de vértices, ¿qué enfoque es más rápido? No me importa la memoria extra que consume el dibujo sin índice, solo la velocidad.
Editar: para que quede claro.
Enfoque no indexado:
float[18] vertices = {
//Triangle 1
1,1,0,
1,0,0,
0,0,0,
//Triangle 2
1,0,0,
0,1,0,
0,0,0,
};
Enfoque del índice:
float[12] vertices = {
1,1,0,
1,0,0,
0,0,0,
0,1,0,
};
int[6] indices = {
//Triangle 1
0,1,2,
//Triangle 2
0,3,2
};
Respuestas:
Intento responder la pregunta. Creo que deberías ir con índices, por algunas razones:
1) En cualquier caso, la indexación es una operación gratuita en el lado de la GPU, no se penalizan allí. (agregado) Por supuesto, los índices son operaciones de acceso aleatorio y pueden dañar el rendimiento de la memoria caché de la GPU.
2) La indexación puede permitir que el caché de vértices de GPU realice esas pocas optimizaciones para vértices superpuestos.
3) Una huella de memoria más pequeña en el lado de la GPU muchas veces significa un mejor rendimiento, ya que el ancho de banda de la memoria es uno de los cuellos de botella y porque muchas veces las operaciones de extracción (por ejemplo, 10_10_10_2 -> 4 x flotante) no tienen costo.
La diferencia de velocidad probablemente no se note si no hay vértices superpuestos en los que se pueda mejorar la velocidad. Pero realmente no tengo hechos concretos que respalden mi opinión (para ir con índices).
Mira también esto:
/programming/17503787/buffers-indexed-or-direct-interlaced-or-separate
fuente
Si las posiciones son siempre las mismas, incluso puede prescindir de cualquier almacenamiento intermedio almacenando la matriz en el sombreador y utilizando
gl_VertexID
para seleccionar el vértice en el sombreador de vértices.fuente
como con todas las cosas de rendimiento, no adivine, perfílelo para descubrirlo.
variará según el hardware y muchos factores complicados. medirlo mediante un perfil considerará automáticamente todas estas cosas para usted sin que necesite saber nada sobre ellas.
fuente
Mi suposición es que usar la indexación para vértices sería más lento.
No entendí bien la pregunta original, pero aquí está la respuesta para la indexación de color. Supongo que se aplicarían las mismas reglas para la indexación de vértices (sin pérdida de precisión), pero eso es solo una suposición.
Pero...
72 bytes es tan pequeño que probablemente sería más eficiente en memoria no indexarlo.
Algunas reglas generales: la indexación es más eficiente en memoria. La indexación pierde precisión de color. No indexar es más rápido.
Esto puede hacer que desee nunca usar la indexación, pero el intercambio de memoria es bastante significativo para imágenes de tamaño decente. La precisión del color es imperceptible.
La forma en que funciona la indexación es que cuando se va a dibujar un píxel, se le asigna un índice y debe buscar el color en una tabla de un tamaño predeterminado. (Digamos 256 bytes, por lo que está limitado a 256 colores). Luego dibuja ese píxel. Ninguna indexación almacena los datos de píxeles directamente, por lo que no hay límites de color a 256. Pero en una imagen de 100x100, su imagen de 400 bytes ahora es de 10000 bytes.
Descargo de responsabilidad, estoy sacando estos números de mi sombrero.
fuente