¿Cuál es el propósito de los índices en renderizado 3D?

11

Suponga que está creando un cubo 3D en OpenGL. Implementa los datos de vértice necesarios para el objeto (cubo). ¿Cuál sería el punto de usar índices?

v

 void CreateCube()
        {
            const Vertex VERTICES[8] =
            {
                { { -.5f, -.5f,  .5f, 1 }, { 0, 0, 1, 1 } },
                { { -.5f,  .5f,  .5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f,  .5f, 1 }, { 0, 1, 0, 1 } },
                { {  .5f, -.5f,  .5f, 1 }, { 1, 1, 0, 1 } },
                { { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
                { { -.5f,  .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
                { {  .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
            };

            const GLuint INDICES[36] =
            {
                0,2,1,  0,3,2,
                4,3,0,  4,7,3,
                4,1,5,  4,0,1,
                3,6,2,  3,7,6,
                1,6,5,  1,2,6,
                7,5,6,  7,4,5
            };

    //....

    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

En el ejemplo anterior, se crea un cubo con los vértices necesarios en el espacio mundial. ¿Cuál es la relevancia para los índices?

Sad CRUD Developer
fuente
1
En muchos lugares verás personas llamándolos caras. Y eso es lo que son. Cada cara generalmente está compuesta por 3 vértices, para formar un triángulo. Por lo tanto, cada 3 índices corresponden a un triángulo en la malla final. Se llaman índices porque son principalmente desviaciones de dónde está la información del vértice real en la matriz de vértices. Es todo lo que necesitas saber sobre índices, supongo :)
Grimshaw

Respuestas:

24

Existen índices para reducir la huella de memoria requerida para representar un modelo 3D, de la misma manera que las paletas de colores se pueden usar para reducir la huella de memoria de una imagen 2D.

La indexación le permite evitar la repetición de una definición completa de un vértice si tiene que duplicar los datos de ese vértice, como generalmente debe hacer para un modelo complejo.

Las API 3D modernas se procesan con triángulos; cada cara de un cubo requiere dos triángulos:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

Para especificar esa cara sin índices, debe especificar los vértices A, B, D, A, D, C. Se repiten dos vértices ( Ay D) en el búfer de vértices.

Sin embargo, con los índices, puede tener un búfer de vértices que contiene sólo los vértices necesarios ( A, B, C, y D) y seis índices: 0, 1, 3, 0, 3, 2. Dado que los índices son generalmente mucho más pequeños que los vértices y muchos vértices generalmente se repiten en modelos prácticos, esto puede ser un importante ahorro de espacio.

Tenga en cuenta que algunos vértices solo compartirán atributos parciales. Por ejemplo, cuando se renderiza un cubo con mapeo de textura, generalmente se desean coordenadas de textura únicas por cara, por lo que tendrá múltiples vértices con la misma posición y diferentes coordenadas de textura. Esa cantidad de duplicación es aceptable y necesaria; es cuando duplica un conjunto completo de atributos de vértice que comienza a ver los beneficios de la indexación.

Si, de hecho, todos sus vértices de malla son 100% distintos, no hay ningún beneficio para los índices (de hecho, usaría más espacio en el consumo del búfer de índice redundante). Sin embargo, esto no siempre ocurre.


fuente
1
¿Debería ser 0,1,3, 0,1,2 en su lugar?
Sad CRUD Developer
0, 1, 3, 0, 3, 2 en realidad, gracias (basado en A = 0, B = 1, C = 2, D = 3). Actualicé la respuesta.
quizás valga la pena mencionar que en una malla triangular el número promedio de triángulos adyacentes a un vértice es 6.
Arne
7

El uso de índices tiene tres propósitos principales:

  • Reducir los requisitos de memoria al permitir que se eliminen los vértices duplicados de la malla original.
  • Reducir los cálculos de sombreador de vértices al permitir que los vértices duplicados se transformen solo una vez.
  • Concatenar primitivas lo que le permite reducir las llamadas de extracción.

De estos, el primero es obvio porque puede medirlo directamente en su propio código: si una malla tenía, digamos, 50k vértices pero si 30k de ellos eran duplicados, entonces tiene un ahorro de memoria.

El segundo y el tercero no son tan obvios: ya debe haber tomado la decisión de usar índices, y debe perfilar su código y aislar el rendimiento "antes" y "después" para poder medirlos.

Para el segundo, el hardware puede almacenar en caché el resultado de vértices recientemente transformados. Si aparece el mismo vértice que el que se transformó recientemente, la versión en caché se puede usar en lugar de tener que realizar los cálculos nuevamente. El hardware utiliza el índice para identificarlos, por lo que los índices son absolutamente necesarios para obtener este comportamiento.

Para el tercero, cada llamada de sorteo que realice tiene una sobrecarga de la CPU, independientemente de cuánto trabajo de GPU deba hacer. Si todo lo demás es igual, dibujar una malla de 50k en 1 llamada de sorteo será mucho más rápido que dibujarlo en 10k llamadas de sorteo. Pero si su malla está compuesta por múltiples tiras, o (aún peor) una combinación de tiras y ventiladores, no puede hacerlo en una sola llamada de dibujo sin (1) usar índices o (2) introducir triángulos degenerados. Pero debido a que los índices son mucho más pequeños que los vértices, se prefiere usar índices en el caso general.

Maximus Minimus
fuente
0

Los índices dicen qué grupos de tres vértices juntos forman las caras del cubo. No todos los conjuntos de tres vértices del triángulo son caras del triángulo.

Puede usar cada vértice exactamente una vez, y simplemente repetir muchas veces los que se usan en más de un triángulo, pero eso significaría transformaciones de vértice adicionales. Con los índices, transforma los vértices solo una vez y los usa tantas veces como sea necesario.

ggambett
fuente
Cuando te refieres a triángulo?
Sad CRUD Developer
El hardware de gráficos moderno representa todo como triángulos.
1
Si realmente quiere entender lo que está sucediendo, obtenga papel cuadriculado, dibuje los vértices 3D y dibuje líneas entre los vértices especificados por INDICES.
ggambett