En gráficos de computadora , una tira de triángulos es un subconjunto de triángulos en una malla de triángulos con vértices compartidos , y es un método más eficiente en términos de memoria para almacenar información sobre la malla. Son más eficientes que las listas de triángulos no indexadas , pero generalmente igual de rápidas o más lentas que las listas de triángulos indexadas . [1] [2] La razón principal para usar tiras de triángulos es reducir la cantidad de datos necesarios para crear una serie de triángulos. El número de vértices almacenados en la memoria se reduce de 3 N a N + 2 , donde N es el número de triángulos que se dibujarán. Esto permite un menor uso del espacio en disco , además de hacer que se carguen más rápido en la RAM .
Por ejemplo, los cuatro triángulos del diagrama, sin utilizar tiras de triángulos, se tendrían que almacenar e interpretar como cuatro triángulos separados: ABC, CBD, CDE y EDF. Sin embargo, utilizando una tira de triángulos, se pueden almacenar simplemente como una secuencia de vértices ABCDEF. Esta secuencia se decodificaría como un conjunto de triángulos con vértices en ABC, BCD, CDE y DEF, aunque el orden exacto en que se leen los vértices no será de izquierda a derecha, ya que esto daría como resultado triángulos adyacentes orientados en direcciones alternas.
OpenGL tiene soporte integrado para tiras de triángulos. La función fija OpenGL (obsoleta en OpenGL 3.0) tiene soporte para tiras de triángulos utilizando el modo inmediato y las funciones , , y . Las versiones más nuevas admiten tiras de triángulos utilizando y .glBegin()
glVertex*()
glEnd()
glDrawElements
glDrawArrays
Para dibujar una tira de triángulos utilizando el modo inmediato de OpenGL, se debe pasar el argumento , que notifica a OpenGL que se va a dibujar una tira de triángulos. La familia de funciones especifica las coordenadas de cada vértice de la tira de triángulos. Para obtener más información, consulte The OpenGL Redbook. [3]glBegin()
GL_TRIANGLE_STRIP
glVertex*()
Para dibujar la franja triangular en el diagrama utilizando el modo inmediato OpenGL, el código es el siguiente:
//Los vértices a continuación están orientados en el sentido de las agujas del reloj. //La configuración predeterminada para glFrontFace es en sentido contrario a las agujas del reloj. glFrontFace ( GL_CW ); glBegin ( GL_TRIANGLE_STRIP ); glVertex3f ( 0.0f , 0.0f , 0.0f ); //vértice 1 glVertex3f ( 0.0f , 0.5f , 0.0f ); //vértice 2 glVertex3f ( 0.5f , 0.0f , 0.0f ); //vértice 3 glVertex3f ( 1.0f , 0.5f , 0.0f ); //vértice 4 glEnd ();
Tenga en cuenta que solo se necesita un vértice adicional para dibujar el segundo triángulo. En OpenGL, el orden en el que se especifican los vértices es importante para que las normales de la superficie sean consistentes.
Citando directamente de la Guía de programación OpenGL :
TIRA DE TRIÁNGULOS GL
Dibuja una serie de triángulos (polígonos de tres lados) utilizando los vértices v0, v1, v2, luego v2, v1, v3 (observe el orden), luego v2, v3, v4, y así sucesivamente. El orden es para garantizar que todos los triángulos se dibujen con la misma orientación para que la tira pueda formar parte correctamente de una superficie.
Es aún más claro en las páginas del manual: [4]
Dibuja un grupo de triángulos conectados. Se define un triángulo para cada vértice presentado después de los dos primeros vértices. Para n impar , los vértices n , n + 1 y n + 2 definen el triángulo n . Para n par , los vértices n + 1 , n y n + 2 definen el triángulo n . Se dibujan n – 2 triángulos.
Tenga en cuenta que n comienza en 1. El ejemplo de código y el diagrama anteriores muestran triángulos dibujados en sentido horario. Para que se consideren que están orientados hacia el frente, es necesaria una llamada anterior a , que de lo contrario tiene un valor inicial de (lo que significa que los triángulos dibujados en sentido antihorario están orientados hacia el frente de manera predeterminada). [5] Esto es significativo si y ya están activos ( de manera predeterminada [6] ), porque los triángulos orientados hacia atrás se descartarán , por lo que no se dibujarán y no aparecerán en la pantalla en absoluto. [7]glFrontFace(GL_CW)
GL_CCW
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)
GL_BACK
De la definición se desprende que una subsecuencia de vértices de una franja de triángulos también representa una franja de triángulos. Sin embargo, si esta subfranja comienza en un vértice par (contando desde 1), los triángulos resultantes cambiarán su orientación. Por ejemplo, una subfranja BCDEF representaría los triángulos: BCD, CED, DEF.
De manera similar, la inversión de los vértices de las tiras dará como resultado el mismo conjunto de triángulos si la tira tiene un número par de vértices (por ejemplo, la tira FEDCBA representará los mismos triángulos FED, ECD, DCB, CAB que la tira original). Sin embargo, si una tira tiene un número impar de vértices, la tira invertida representará triángulos con orientación opuesta. Por ejemplo, la inversión de una tira ABCDE dará como resultado la tira EDCBA, que representa los triángulos EDC, DBC, CBA.
Hasta hace poco, no era posible convertir una malla poligonal general en una única tira larga. Normalmente, las tiras de triángulos son análogas a un conjunto de bucles de aristas y los polos del modelo se representan mediante abanicos de triángulos . Herramientas como Stripe [8] o FTSG [9] representan el modelo como varias tiras. Se ha demostrado que la agrupación óptima de un conjunto de triángulos en tiras secuenciales es NP-completa . [10]
Alternativamente, un objeto completo puede describirse como una tira degenerada , que contiene triángulos de área cero que el software o hardware de procesamiento descartará. Los triángulos degenerados introducen efectivamente discontinuidades o "saltos" en la tira. Por ejemplo, la malla en el diagrama también podría representarse como ABCDDFFEDC, que se interpretaría como triángulos ABC CBD CDD DDF DFF FFE FED DEC (los triángulos degenerados están marcados en cursiva). Observe cómo esta tira primero construye dos triángulos desde la izquierda, luego reinicia y construye los dos restantes desde la derecha.
Si bien las discontinuidades en las tiras de triángulos siempre se pueden implementar reenviando los vértices, las API a veces admiten esta función explícitamente. IRIS GL admitía Swaps (cambio de dos vértices subsiguientes en una tira), una función en la que se basaban los primeros algoritmos, como el algoritmo SGI . Recientemente, OpenGL/DirectX puede renderizar múltiples tiras de triángulos sin triángulos degenerados mediante la función Primitive Restart.