¿El dibujo indexado es más rápido que el dibujo no indexado?

8

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
};
KaareZ
fuente
1
... ¿por qué no solo medir ambos enfoques para su aplicación específica en su hardware objetivo y descubrirlo de manera concluyente?
Sean Middleditch

Respuestas:

4

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

MaKo
fuente
1
re 1) ¿qué pasa con la optimización del orden del índice para el rendimiento de la memoria caché? Hay algoritmos para esto incluso. como reordenamiento de k-cache. re 3) ¿qué pasa con la sobrecarga del búfer de índice en sí? a veces, la eliminación de tres puntos da como resultado menos datos para cargar ... aunque no es el caso común.
jheriko
1

Si las posiciones son siempre las mismas, incluso puede prescindir de cualquier almacenamiento intermedio almacenando la matriz en el sombreador y utilizando gl_VertexIDpara seleccionar el vértice en el sombreador de vértices.

#version 330 core

const vec3 data[4] = vec3[]
(
//Triangle 1
vec3(1,1,0),
vec3(1,0,0),
vec3(0,0,0),

//Triangle 2
vec3(1,0,0),
vec3(0,1,0),
vec3(0,0,0)
);

void main()
{
  gl_Position = vec4( data[ gl_VertexID ], 1.0);
}
monstruo de trinquete
fuente
Y cuando se procesa con instancias, puede establecer un punto, rotación y escala por instancia.
Lasse
@ratchet freak Las posiciones no siempre serán las mismas, ya que esto es para el terreno (y no puedo usar triangle_strips, ya que sería muy difícil de implementar de manera adecuada, ya que está basado en voxel). Simplemente necesito saber si debo usar un dibujo indexado o no indexado. O incluso las antiguas listas de visualización, si eso fuera más rápido.
KaareZ
@KaareZ Todavía puedes usar uniformes para cambiar la posición. O use la instancia para pasar datos por cara.
monstruo de trinquete
0

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.

jheriko
fuente
-1

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...

  • Como regla general, sugiero indexación.
  • La indexación es más lenta.
  • No indexar es más rápido.
  • La indexación es más eficiente en memoria.
  • No indexar es menos eficiente en memoria.
  • La indexación pierde precisión de color.
  • No indexar no pierde precisión de color.

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.

Evorlor
fuente
No pregunté sobre la compresión de color.
KaareZ
Respuesta súper corta: la indexación siempre es más lenta. Enterré mi respuesta allí, pero la agregué a la primera línea ahora que entré en compresión de color, porque eso es lo que es la indexación.
Evorlor
Estoy hablando de la indexación de los vértices, no de la compresión de texturas. Por ejemplo, tienes v0, v1, v2 y v, 3. Para dibujar dos triángulos, especifique los siguientes índices: 0, 2, 3, 0, 2, 4
KaareZ
Oh mi error En ese caso no lo sé, pero supongo que se aplicarían las mismas reglas
generales