Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Preprocesamiento de mallas

Iniciado por tiutiu, 10 de Abril de 2003, 04:08:35 AM

« anterior - próximo »

tiutiu

                                He leido el thread q hay mas abajo, 'Sobre lightmaps' en el cual se cuentan un metodo de preprocesamiento de una malla antes de exportar las listas de vertices, texcoords y normales indexadas.

Mi caso es el siguiente: he hecho un cubo, sin textura ni nada para probar el exporter q acabo d hacer. Un cubo son 12 triangulos, 8 vertices, 36 indices... hasta aqui todo perfecto, pero entonces he visto otro numero mas... 24 normales, 3 por cada vertice  :-?
Ahi ya me he quedao un poco pillao, asi q mi pregunta es, como dejo esa malla para poder usar arrays de vertices (indexado todo)?

Luego he hablado con Ithaqua y me ha dicho q el max tb me puede dar 8 vertices y 15 texcoords, con lo cual creo q en esos casos ya no se puede aprovechar lo de los vertex arrays, me equivoco??

He leido todo el thread de 'sobre lightmaps', asi q no me digais q lo vuelva a leer xD

PD: el problema no son los lightmaps, sino el como preprocesar la malla para no tener esas 24 normales                                
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

BeRSeRKeR

                                Supongo que la cosa es construir los vértices según las listas de índices de coordenas de vértice, coordenadas de textura, etc de MAX. Una vez hecho esto, ir mirando cuáles son repetidos y quedarse sólo con uno de ellos e ir creando una nueva lista de índices para la malla optimizada...el problema de esto es que creo que sería un proceso lento sobre todo si hablamos de mallas con muchos vértices.

La otra opción, si no te quieres complicar la vida, es utilizar Flexporter que ya te calcula la malla optimizada...

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

jal

                                No se si acabo de entender bien tu problema, pero creo que el motivo por el que te da las 24 normales, 3 por vertices, es por que te retorna las normales de las caras que comparten ese vertice, para que tu luego puedas calcular la normal que quieres que tenga ese vertice. Una posible forma de conseguir esa normal seria sumando las 3 normales y volviendo a normalizar el vector resultante. De esta forma tendrias una normal por vertice y no necesitarias reprocesar la malla.


Un saludo                                

BeRSeRKeR

                                El problema es que MAX te puede devolver más coordenadas de textura que de vértice o normales...por eso hay que procesar la malla para que sea digerible por el API 3D

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

tiutiu

                                Ahi ahi! eso es a lo q me refiero berserker xD

He pensado que deberia recorrer la malla cara a cara y duplicar los vertices que tengan que usar mas de 1 tvert, pero no se me ocurre como hacerlo, no se si hoy estoy empanao, pero weno. A ver si a alguien se le ocurre un pseudocodigo.

Hoy he hablao con ithaqua un momentillo y me ha dicho q ella lo hace, asi q hacerse se puede ;)

Enga un saludo                                
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

Ithaqua

                                Ella?

Berserker: Dices que flexporter te hace ese procesado ya? y luego hace algún tipo de optimización de malla para cache TnL?                                
thaqua^Stravaganza
http://ithaqua.stravaganza.org

BeRSeRKeR

                                En la lista de características de Flexporter se habla de Mesh Consolidation y Mesh optimization. La consolidación debe ser precisamente la solución al problema del que se habla aquí (eliminación de vértices redundantes) mientras que la optimización no tengo ni idea, pero debe ser algún tipo de generación de triangle strips/fans ahí donde se pueda, pero realmente no tengo ni idea...

En la página oficial de Flexporter hay código sobre ello. Concretamente la parte de la consolidación

http://www.codercorner.com/Flexporter.htm

el link directo es

http://www.codercorner.com/Consolidation.zip

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

mallrat

                                en el caso que comentas al final tendras un buffer de 24 vértices (4 vértices por cada lado) puesto que no se pueden compartir más vértices que esos (a menos que pienses dibujar un cubo "suavizado" lo cual sería una cutrez hoy en dia), o puede que termines teniendo aun mas vértices si alguno de los dos triángulos de cada cara tiene un mapeado de texturas diferente (lo cual es raro para un cubo, pero supongo que tu quieres un algoritmo de proposito general, no sólo para cubos...).

En principio tienes dos opciones:

a) empezar con lo mínimo: 8 vertices (limpios, sin coordenadas de textura ni normales, con lo cual no hay que duplicar ninguno). A partir de ahi recorres las lista de coordenadas de textura de cada cara, y se la asignas a sus vertices asociados. Si no coincide, lo duplicas. Luego haces lo mismo con las normales.

B) empezar con lo máximo: creas los 12*3 vértices y les rellenas la información de coordenadas de textura y de normales. Luego los reordenas de forma que los que son exactamente iguales los tendrás uno al lado del otro, asi los puedes eliminar rapidamente y actualizar los indices de la malla. Es un método mas burro pero se puede hacer muy rapido (ordenandolos con qsort, por ejemplo).

Por supuesto, todo esto en memoria de sistema, luego te creas los buffer de vertices en memoria de video y les vuelcas lo que has calculado. Al final tendras una lista de vertices con la mínima cantidad de vértices para pintar correctamente la malla, y su lista de indices correspondiente. Luego estas listas se pueden optimizar reordenandolas de tal forma que se aproveche bien la cache de vértices que tienen las tarjetas con T&L por hardware... aunque yo dejaría eso para una optimización posterior (muy posterior).                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.