2011-05-31 14 views
8

Soy nuevo en la programación opengl. Actualmente estoy haciendo una animación de la formación del túnel de la cueva. Tengo un conjunto de coordinaciones para los perfiles del eje a lo largo del eje z. Mi plan es hacer una malla 3D a partir de estos datos y para hacer eso he decidido usar TRIANGLE_STRIPS. La forma en que hice esto fue que yo he creado múltiples tiras de esta manera:OpenGL: Problema con bandas triangulares para malla 3d y normales

 
11----12 5------6 
| /| | /| 
|/ | |/ | 
9-----10 3------4 
| /| | /| 
|/ | |/ | 
7------8 1------2 

Mis preguntas son:

  1. es esta la forma correcta de hacerlo? Porque ahora tengo problemas con las normales. Me gustaría utilizar el sombreado GL_SMOOTH y para eso, según tengo entendido, necesito calcular normales de vértices. Pero en mi cas, los vértices 10 y 3 son iguales, ¿entonces habría dos normales? ¿Es eso un problema? ¿Y hay alguna otra forma de crear múltiples tiras?

  2. ¿Y hay alguna otra manera de crear varias tiras? ¿O la solución con tiras quizás no sea la mejor?

  3. Otro problema es que estas tiras no son de la misma longitud. Algunos son más cortos que otros. Gracias por su ayuda :)

Respuesta

2

En primer lugar, en la imagen, las diagonales son en realidad volteado, si los números representan el orden de los vértices (pero eso es un error de presentación menor de edad).

  1. Este es el enfoque más fácil y suficiente para despojar a una grilla de vértices más o menos uniforme. Tienes razón, en ese 10 y 3 necesitas la misma normalidad, por lo que debes darles la misma normalidad para que se enciendan correctamente. En este caso, la indexación es tu amigo. Solo use un solo vértice para 3 y 10 (con una normal correspondiente) y use una tira de triángulo indexado, donde los índices 3 y 10 hacen referencia al mismo vértice. Esta es la forma estándar para resolver las ambigüedades de los vértices. Si no sabes a qué me refiero, ahonda un poco más en la programación en 3D y OpenGL en general, especialmente en las matrices de vértices e índices.

  2. Para las redes regulares, las tiras son a menudo una buena idea, ya que se pueden construir con bastante facilidad. En el caso de las mallas más complejas, ya no se necesita en la actualidad, ya que a menudo es más importante reducir el número de llamadas al sorteo.

  3. Deben tener al menos una longitud razonable en comparación con el número total de triángulos; de lo contrario, la sobrecarga de dibujar una sola tira supera el tiempo ahorrado por el procesamiento de vértices ligeramente más rápido, pero los números reales dependen en gran medida de la implementación. Deberías usar arreglos/búferes de vértices de todos modos, aléjate de comenzar/terminar si te preocupa el rendimiento.

En realidad se puede combinar múltiples bandas en una sola mediante la introducción de triángulos degenerados que no se representan (para reducir el número de llamadas de sorteo). Su ejemplo se puede representar de la siguiente manera única tira:

1, 2, 3, 4, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12

Pero de nuevo , ten en cuenta la respuesta 3. Las tiras deben tener un tamaño razonable para que los triángulos degenerados no superen demasiado a los triángulos reales.

6

Primero, no use tiras triangulares. Es un viejo concepto de hardware antiguo. Use listas simples de triángulos indexados. Es más fácil (al principio) y más rápido. Para sus preguntas:

1) Cada vértice tiene una normal. Es tan único e importante como el puesto. Si dos vértices tuvieran una posición diferente, serían vértices diferentes. Lo mismo se aplica a las normales: hay vértices con la misma posición pero con diferentes normales. Pero son vértices diferentes. Piensa en cómo los vértices de una esfera son diferentes a los vértices de un cubo.

2) listas de uso (glDrawElements). No use tiras. Hay formas óptimas de ordenar esas listas para el almacenamiento en caché, nvidia y ati tienen un montón de código de ejemplo en sus secciones de desarrollador.

3) No te preocupes por eso todavía. Una buena malla tendrá triángulos de área aproximadamente iguales. Los índices se ordenan para alcanzar un caché de vértice (generalmente al menos 16 entradas) la mayor parte del tiempo. Las tiras son una forma de optimizar un caché de vértices de 2 entradas.

+1

Sí: no use tiras triangulares. Las tiras triangulares no son especialmente "para hardware antiguo", o más lentas, pero te vas a meter en problemas al usarlas. +1 para usar triángulos indexados simples. Y el caché de vértices suele ser 24, por lo que importa. – Calvin1602