Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Lightmaps En Sandra Engine

Iniciado por DraKKaR, 10 de Enero de 2005, 07:34:41 PM

« anterior - próximo »

DraKKaR

 Hace poco he conseguido mejorar el proceso de generación de lightmaps para escenarios de mi motor. Antes no se empaquetaban demasiado bien los polígonos en cada lightmap y eso provocaba algunos fallos, sobretodo en los bordes de los polígonos y a baja resolución. Ahora he conseguido solucionar ese error.

Con motivo de este avance he creado una nueva sección en la página del motor para mostrar capturas de algunos escenarios con lightmaps. Estan en la sección Galeria de la página del motor:

http://sandra.sf.net

Os dejo una de las capturas, pero para no engorronar el post, podeis ver el resto de capturas en la web.



Cuando exportas un escenario desde MAX o Blender (formato *.SGEMAP), éste no contiene información sobre iluminación precalculada. Para calcular los lightmaps existe una utilidad (que también forma parte del motor) selm, que calcula la iluminación para el mapa y la incrusta dentro del fichero *.SGEMAP. De esta forma el renderer ya puede usar esa información para dibujar la escena con la iluminación precalculada.

Lo que hace básicamente la utilidad selm es leer primero los datos del escenario. Después empaqueta los triángulos dentro de los lightmaps que hagan falta. Se le puede decir que los empaquete con mayor o menor densidad (jugando con la relación espacio/calidad). La utilidad se fija en si dos triángulos forman un cuadrado o si podrían empaquetarse juntos uno al otro para mejorar el expacio y la calidad final del lightmap.

Una vez empaquetados se "renderiza" cada lightmap con un motor de raytracing/radiosidad (PiscisRT) o que haga un cálculo de iluminación básico y rápido. Se pueden establecer algunas opciones como habilitar/deshabilitar las sombras, la intensidad de las luces, la densidad de los lightmaps...

Si a alguien le interesa, sería posible usar este generador de lightmaps para precalcular la iluminación de otros escenarios que no esten en formato del Sandra Engine. Teneis el código fuente (bajo GPL) en el CVS del motor. Tan solo haría falta sustituir las funciones de lectura y escritura de datos de la aplicación. Otra opción sería añadirle la funcionalidad de leer los datos de un fichero XML y escribir el resultado en otro XML y los lightmaps como JPGs o PNGs. De esta forma podría usarse como una herramienta más estándar de generación de lightmaps. Si hay mucha gente interesada en esto, puede que me anime  ;)


Eso es todo, ved las imágenes de la galeria. Espero opiniones. Si es necesario puedo subir la aplicación para ver los lightmaps en tiempo real.

Me gustaría que me pasaseis escenarios (pueden estar hechos en MAX o Blender) para probar los lightmaps en escenarios más complejos. Por ejemplo, Haddd, ¿podeis pasarme el escenario que usasteis en el video de la cripta?

Saludos.

Haddd

 Lo saqué del rar final, por error, porque Johelius, que es su creado, permite que se suba.  ;)

Cripta en MAX

Buen trabajo, es una pena que nosotros no utilicemos los lightmaps, pero quien sabe si en un futuro...  (ole)  

Lord Trancos 2

 
Citar
Antes no se empaquetaban demasiado bien los polígonos en cada lightmap...

Yo uso esta tecnica y me fue bastante bien:
http://www.blackpawn.com/texts/lightmaps/default.html

Aunque siempre se pierde algo de espacio.... el truco esta en evitar poligonos demasiado grandes.

Citar
La utilidad se fija en si dos triángulos forman un cuadrado o si podrían empaquetarse juntos uno al otro para mejorar el expacio y la calidad final del lightmap.

Jeje, yo tb usaba esa tecnica ;)

Otra que usaba era comprobar si un lightmap era todo de un mismo color (por ejemplo todos los pixeles negros); en ese caso le reducia la resolucion.

Y tambien comprobaba si habia lightmaps exactamente iguales en diferentes poligonos y los compartia (como por ejemplo todos los lightmaps con un mismo color que habia reducido).

Citar
Una vez empaquetados se "renderiza" cada lightmap con un motor de raytracing/radiosidad (PiscisRT) o que haga un cálculo de iluminación básico y rápido

Conye! Eso suena muy interesante.... :)
Significa eso que se puede usar radiosidad/global ilummination?

Estaria muy bien tener una herramienta para generar lightmaps con radiosidad que fuera open source.  (uoh)
Ya esta el FSRad, pero esta un poco como abandonao, y es un poco enrevesao de usar.... :(

Citar
Eso es todo, ved las imágenes de la galeria. Espero opiniones.

A simple vista tiene buena pinta. No se ven artifacts y la iluminacion esta cuca. ;)
De todos modos en algunas fotos, preferiria que no hubiera texturas para percibir mejor los lightmaps.
En la foto que has puesto en el post, no se aprecian nada bien por culpa de las texturas.... :(

Citar
Si es necesario puedo subir la aplicación para ver los lightmaps en tiempo real.

Hombre, necesario no es.... pero mola mucho mas poner una demo que unas fotos  (uoh)

on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

DraKKaR

 Vaya, también se me habia olvidado decir que para cada triángulo/cuadrado en el lightmap se genera un "borde" que no podrá intersectar ningún otro triángulo ni su borde. Este borde es necesario por el arma de doble filo que es el filtro bilineal, que aunque suaviza las sombras, hace que se entremezclen téxeles.

Haddd, gracias por pasarme la crypta, pero no puedo abrirla con mi MAX 5, me dice:

"Unknown class, no stand-in: SuperID=0x9012, ClassID=(un numero en hex)

Después me dice que me faltan DLLs, parece que del Mental Ray, AcadBlcks y otros.Finalmente me escupe que no puede abrir el fichero. ¿Sería posible que te enviara el plugin exportador y me pasaras el archivo resultante?

Trancos, yo tb me basé en esa técnica que dices. Aunque tengo que mejorarlo un poco, porque a veces me deja unos huecos considerables  :D

CitarOtra que usaba era comprobar si un lightmap era todo de un mismo color (por ejemplo todos los pixeles negros); en ese caso le reducia la resolucion.

Es interesante, no habia caido en eso, aunque no debe ser muy fácil que todo el lightmap sea del mismo color (o parecido).

CitarConye! Eso suena muy interesante.... smile.gif
Significa eso que se puede usar radiosidad/global ilummination?

Sí, el raytracer que uso es de un amigo mio (http://piscisrt.sf.net) y soporta tanto raytracing, como photon mapping o patches, además de iluminación global. En el generador de lightmaps no está habilitada, en todas las imagenes uso Raytracing sin iluminación global. De todas formas haré pruebas a ver como aumenta la calidad final.


CitarDe todos modos en algunas fotos, preferiria que no hubiera texturas para percibir mejor los lightmaps.
En la foto que has puesto en el post, no se aprecian nada bien por culpa de las texturas....

Por eso he incluido las iamgenes del templo sin textura abse, solo con la iluminación, para que se aprecie bien. Las demás las he dejado con la textura base para que se vea el aumento de realismo que le da todo junto.

Subiré el programa visualizador para que podais navegar por los escenarios, así supongo que se podrá apreciar mejor todo.

Haddd

 Claro, pásame el exportador. La escena está hecha en MAX 6

DraKKaR

 Haddd, aquí está el exportador, espero que no tengas problemas, ya que está hecho par MAX 4/5 (nnuca lo he probado en MAX 6).

Exportador de mapas para Sandra Engine

Haddd

 No funciona, dice que no es una versión correcta!!  :(  

BeRSeRKeR

 Habría que compilarlo para MAX6 supongo.

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

egf

 enorabuena por el tabajo.  :D

alguna opcion en el futuro de que te pases a maya?  

DraKKaR

 Haddd: maldicion, da igual, si alguna vez pasa por mis manos el MAX 6 lo compilaré y probaré. Otra opción si alguien se aburre es bajarse el exportador del CVS e intentar compilarlo  :D

egf: una vez tuve maya, e intenté hacer un exportador, pero ví el API de Maya mucho más difícil que le de MAX y (como ya tenia el de MAX) lo dejé. Si alguien me pasa el código fuente de un exportador funcional, de forma que solo tenga que añadirle lo realmente necesario para escribir mi formato de fichero *.SGEMAP, entonces lo haré.

Pogacha

 Drakkar esta muy bueno, al menos no encontre ningun error, pero te doy un consejo para mejorar la escena, yo cuando usaba lightmaps usaba multisample, o sea tenia el doble de resolución para la creacion de los lightmaps y cuando los terminaba los reducia a la mitad con un filtro bilineal logrando un efecto de mayor realizmo, puedes usar 4x o mas pero yo con la mitad tenia para rato, tambien debes tener cuidado con el borde cuando apliques la reduccion ;).
No se si estas usando raytracing o shadowvolumes, si es la primera puedes usar jitering ( la forma mas facil es que a cada luz la transformes en 6 o 7 luces dispuestas a una distancia x de la luz original simulando una luz volumetrica) esto tambien aumentara el realizmo si es que utilizas multisample, si usas shadow volumes puedes crear los volumenes de penumbras que son un estilo de proyectores donde guardas informacion en los vertices del volumen de la intensidad de la luz e interpolas sobre la textura, esto es igual de complicado que usar los shadowvolumes, pero tiene la ventaja de que puedes aprovechar el arbol bsp al maximo.
Y por sobre todo Radiosidad (aun que no se si tienes ganas, pero es muy divertido implementarlo), que consiste en transformar a cada texel de los lightmaps aplicados a la texturas difusa en una luz, calculas todas las luces y vuelves a hacer otra pasada y así reiteradas veces, una cosa facil que se puede hacer es un render de bajo detalle ( 32x32 o 64x64) en un  hemicubo ( es como un cube map partido al medio) por cada texel, debes tambien aplicar la regla de los cosenos Lambert y de atenuacion, integras la informacion del hemicubo y le sumas dicha informacion a texel para la proxima pasada, esta tecnica es lentisima de todos modos pero tiene alto realismo.
Saludos y suerte

DraKKaR

 Gracias Pogacha. Ya habia leido sobre el multisample, pero lo de los bordes de los triangulos es algo delicado y no se si al aplicar el resampleado se entremezclarían los colores de forma incorrecta.

Estoy usando raytracing, de hecho el renderer de raytracing no lo he implementado yo, sino que uso el de un amigo que está bastante bien. Este renderer implementa raytracing, radiosidad, iluminación indirecta, jittering, luces volumétricas y muchas más cosas (http://piscisrt.sf.net). Lo que pasa es que todas estas cosas no están activadas en el generador de lightmaps, lo único que tengo que hacer es activarlas para que se usen en el render, por lo que no sería muy costoso implementarlo.

De todas formas, esto del lightmapping era más bien un reto personal. Siempre había querido implementar una manera de hacerlo sólido y sin errores. Me daba rabia que el Quake I ya lo hacía muy bien hace tantos años y yo no era capaz de conseguirlo. Ahora que he conseguido generar esos lightmaps sin errores (al menos conocidos) ya me siento saciado. Se podría mejorar desde muchos flancos, pero, si a la gente no le interesan mis lightmaps ni mi utilidad de lightmapping (el interés de la gente anima mucho en esto), creo que entraré en técnicas más "nuevas" como iluminación por píxel y todo tipo de efectos a nivel shader.

Pogacha

 Se lo que es la implementacion de utilidades de lightmaps por eso se valorar la claridad de lo que has conseguido, a mi me costo mucho hacer algo parecido a lo que tu tienes, cuando implemente radiocidad me dio mucha bronca lo lento que era y todo el trabajo que tenia que hacer para mejorarlo y con mi nueva placa quede deslumbrado con la iluminacion por tiempo real y lo abandone.
Escucho sobre el tema de los triangulos para lightmappings y me parece que es errado ese camino, muchas herramientas hablan de triangulos, he visto tutoriales de lm en dx y tambien, yo implementaba superficies, o sea poligonos planos y de esta manera el compartir se vuelve mucho mas sencillo al igual que la optimizacioón del empaquetado, pues ya no es plano sino que tienes que meter poligonos en una caja, y si el algoritmo de "bin packing" funca adecuadamente tendras resultados muchos mejores.
No tires a bajo los lightmappings, yo cuando empece con iluminacion en tiempo real en un ataque de locura, borre todo, absolutamente todo sobre lightmapping y ahora me arrepiento, busque en backups anteriores y no encontre nada que sirva. No cometas el mismo error!
Saludos.

DraKKaR

 Trankilo Pogacha que mi código fuente es prácticamente imperdible: tengo subida la última versión del código fuente de todo en el CVS de la página de sourceforge de mi motor (http://cvs.sourceforge.net/viewcvs.py/sandra/). Puedes ojear el código fuente del generador de lightmaps dentro del directorio selm/src.

Es verdad que le lightmapping va pasando de moda y cada vez se usan más técnicas de iluminación completamente en tiempo real, pero todavía pueden dar algo de sí (creo que Half Life 2 todavía usa lightmaps para la iluminación estática). De todos modos ya he dixo ke era una pelea a nivel personal lo de los lightmaps...

Pogacha

 He ojeado tu motor dos o tres veces en un año, y la verdad es que me encanta con la claridad con que esta escrito  (ole).
Tampoco debes pensar que unicamente borrando el codigo de los lightmaps los perderas, tambien se te pueden perder si no le das continuidad y soporte en futuros arreglos del motor, cuando te quieres acordar será mas facil empezar todo de nuevo que empezar arreglar para que vuelvan a  funcionar.
Saludos.






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.