Una tira triangular es una serie de triángulos conectados de la malla triangular , que comparten vértices , lo que permite un uso más eficiente de la memoria para gráficos por computadora . Son más eficientes que las listas de triángulos sin indexación, pero generalmente son igualmente rápidas o más lentas que las listas de triángulos indexados. [1] [2] La razón principal para usar bandas triangulares 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 3N a N + 2 , donde Nes 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, deberían almacenarse e interpretarse como cuatro triángulos separados: ABC, CBD, CDE y EDF. Sin embargo, utilizando una tira triangular, 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 el 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. .
Implementación de OpenGL
OpenGL tiene soporte incorporado para tiras triangulares. La función fija OpenGL (obsoleta en OpenGL 3.0) tiene soporte para tiras de triángulos usando el modo inmediato y las funciones glBegin () , glVertex * () y glEnd () . Las versiones más recientes admiten tiras de triángulos mediante glDrawElements y glDrawArrays .
Para dibujar una tira triangular usando OpenGL en modo inmediato, a glBegin () se le debe pasar el argumento GL_TRIANGLE_STRIP , que notifica a OpenGL que está a punto de dibujarse una tira triangular. La familia de funciones glVertex * () especifica las coordenadas para cada vértice en la franja triangular. Para obtener más información, consulte The OpenGL Redbook. [3]
Para dibujar la franja triangular en el diagrama usando el modo inmediato OpenGL, el código es el siguiente:
// Los vértices siguientes están orientados en el sentido de las agujas del reloj // La configuración predeterminada de glFrontFace es en el sentido contrario a las agujas del reloj glFrontFace ( GL_CW ); glBegin ( GL_TRIANGLE_STRIP ); glVertex3f ( 0.0f , 1.0f , 0.0f ); // vértice 1 glVertex3f ( 0.0f , 0.0f , 0.0f ); // vértice 2 glVertex3f ( 1.0f , 1.0f , 0.0f ); // vértice 3 glVertex3f ( 1.5f , 0.0f , 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 de OpenGL :
GL_TRIANGLE_STRIP
Dibuja una serie de triángulos (polígonos de tres lados) usando vértices v0, v1, v2, luego v2, v1, v3 (observe el orden), luego v2, v3, v4, y así sucesivamente. El ordenamiento es para asegurar que los triángulos estén todos dibujados con la misma orientación para que la tira pueda formar correctamente parte 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 pares, los vértices n + 1, n y n + 2 definen el triángulo n. Se dibujan N-2 triángulos.
El ejemplo de código y el diagrama anteriores demuestran los triángulos dibujados en el sentido de las agujas del reloj. Para aquellos que se consideren orientados al frente, es necesaria una llamada anterior a glFrontFace (GL_CW) , que de lo contrario tiene un valor inicial de GL_CCW (lo que significa que los triángulos dibujados en sentido antihorario están orientados al frente por defecto). [5] Esto es significativo si glEnable (GL_CULL_FACE) y glCullFace (GL_BACK) ya están activos ( GL_BACK por defecto [6] ), porque los triángulos orientados hacia atrás serán eliminados, por lo que no se dibujarán y no aparecerán en la pantalla en todas. [7]
Propiedades y construccion
De la definición se deduce que una subsecuencia de vértices de una tira triangular también representa una tira triangular. Sin embargo, si esta subtrip comienza en un vértice par (con conteo basado en 1), los triángulos resultantes cambiarán su orientación. Por ejemplo, una subtrip BCDEF representaría 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 franja tiene un número impar de vértices, la franja invertida representará triángulos con orientación opuesta. Por ejemplo, la inversión de una franja ABCDE dará como resultado una franja EDCBA que representa triángulos EDC, DBC, CBA).
Hasta hace poco, no era posible convertir una malla poligonal general en una sola franja larga. Por lo general, las tiras triangulares son análogas a un conjunto de bucles de borde , y los polos del modelo están representados por abanicos triangulares . Herramientas como Stripe [8] o FTSG [9] representan el modelo como varias tiras. La agrupación óptima de un conjunto de triángulos en tiras secuenciales ha demostrado ser NP-completo . [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" a 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 (triángulos degenerados marcados con cursiva). Observe cómo esta tira primero construye dos triángulos desde la izquierda, luego se reinicia y construye los dos restantes desde la derecha.
Si bien las discontinuidades en las franjas triangulares siempre se pueden implementar reenviando vértices, las API a veces admiten explícitamente esta característica. IRIS GL admitió Swaps (voltear dos vértices subsiguientes en una tira), una característica 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 usando la función de reinicio primitivo.
Referencias
- ^ https://developer.apple.com/library/ios/#DOCUMENTATION/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html
- ^ http://hacksoflife.blogspot.com/2010/01/to-strip-or-not-to-strip.html
- ^ El libro rojo de OpenGL
- ^ [1]
- ^ glFrontFace
- ^ glCullFace
- ^ OpenGL FAQ / 10 Clipping, Culling y Visibility Testing
- ^ Azanli, Elvir. Stripe , recuperado el 28 de marzo de 2007.
- ^ Xiang, Xinyu. FTSG , recuperado el 21 de enero de 2011 (el enlace ya no es válido)
- ^ Regina Estkowski, Joseph SB Mitchell, Xinyu Xiang. Descomposición óptima de modelos poligonales en franjas triangulares. En Actas del Simposio sobre Geometría Computacional'2002. pp.254 ~ 263 url = http://www.ams.sunysb.edu/~jsbm/papers/p151-mitchell.pdf url = http://portal.acm.org/citation.cfm?id=513431
Ver también
- Triángulo
- Abanico triangular
- Gráficos de computadora
- Tarjetas gráficas
- Optimización (informática)