Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sombras En Engines Modernos

Iniciado por tiutiu, 03 de Enero de 2006, 06:41:58 PM

« anterior - próximo »

tiutiu

 Bueno, estaba pensando en que metodo usar para hacer sombras en el motor que estoy diseñando. Supongo que utilizare shadow mapping, ya que puedo reutilizar mucho codigo de mi ultimo proyecto (aunque habria que refactorizarlo un poco).

Despues de pensar un rato, me he dado cuenta de que las cosas han cambiado mucho. La mayoria de documentacion sobre algoritmos de sombras o iluminacion es bastante vieja, y no suele tener muy en cuenta los grandes (enormes) avances a los que se ha llegado con las GPUs actuales.
Vamos a discutir un poco sobre los metodos para hacer sombras, con sus ventajas e inconvenientes.

Shadow mapping.
- Es un algoritmo rapido, ya que solo requiere una pasada extra por cada luz y puede hacer sombras de modelos muy teselados sin demasiada sobrecarga.
- Self-shadowing automatico.
- Sufre de aliasing, que puede ser subsanado con una transformacion de perspectiva. Hay varias implementaciones: PSM, LiSPSM, TSM. Suelen ser un poco complicadas de implementar, aunque dan buenos resultados.
- Con el uso de un pixel shader se puede acelerar la construccion del depth map.
- Las nuevas tarjetas con sus extensiones (como FBO en OpenGL) permiten evitar la copia a memoria del render para tener un depth map en una textura. Se puede compartir directamente, disminuyendo el coste de los renders extra para los depth maps.

Shadow volumes.
- Depende mas de la geometria que proyecta la sombra, ya que hay que calcular el contorno y luego extruirlo.
- El self-shadowing creo que no funciona tan bien como con los shadow maps.
- No sufre de aliasing
- Puede acelerarse la extrusion (y busqueda) del contorno para proyectar la sombra.
(No se mucho mas sobre shadow volumes, asi que alguien mas podria ir completando la lista con lo que falte).

Pues bien, en mi opinion creo que los shadow maps son un algoritmo genial, ya que de cada dia los modelos estan mas teselados, aunque no se hasta que punto beneficia la GPU en la extrusion del contorno. Eso si, hay que implementar algun tipo de correccion de la perspectiva (LiSPSM y TrapezoidSM parecen dar muy buen resultado, aunque la ultima diria que quieren patentarla).
Ademas, ahora casi todas las tarjetas graficas (al menos dentro de 6 meses a 1 año) tienen las extensiones/caracteristicas necesarias.
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

zupervaca

 A mi lo que me gustaria saber es como tienen pensado los gurus hacer las sombras cuando se creen vertices en el propio shader.

BeRSeRKeR

 Yo creo que los shadow maps se irán imponiendo. Además de las ventajas que has mencionado, también está el tema de que te permite tener geometría con alpha test y el shadow map manejaría la situación perfectamente.

Una de las desventajas que yo le veo, aparte del aliasing, es el tener que utilizar un offset para que las sombras salgan bien, me refiero al "z bias". Nosotros lo resolvemos renderizando las caras posteriores en vez de las frontales en el depth map. De esta forma podemos utilizar un zbias de 0. Pero hace poco he leído una técnica que se utilizó en una película utilizando RenderMan, que lo que hace es renderizar en el depth map las caras frontales, las caras posteriores y luego hace una media entre ambas y ese depth map es el que se utiliza. Evidentemente tiene la desventaja de que son dos pasadas. La media se podría calcular en el pixel shader.

En cuanto al tema de la geometría creándose en el geometry shader, el geometry shader devuelve la nueva geometría generada para poder ser leída; por ejemplo, desde la aplicación. Me imagino que no será un problema generar un shadow map con la geometría calculada en la GPU.

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

tiutiu

 
QUOTE (zupervaca)
A mi lo que me gustaria saber es como tienen pensado los gurus hacer las sombras cuando se creen vertices en el propio shader.[/quote]

Ya lo hacen, mediante shadow mapping. Hace un tiempo vi un tio en los foros de OpenGL que habia hecho un shader de relief mapping dibujando los contornos. Sencillamente genial, pero muy costoso, claro.
De una esfera de menos de 100 caras saco detalle como si tuviese varios miles, incluyendo la sombra. Si el algoritmo es en image-space, lo que cuenta es que pillas los datos de la imagen final, y eso incluye la geometria añadida en la pipeline.

EDIT: Aqui y aqui se habla de la tecnica que te digo, aunque los screenshots no funcionan (una pena, eran muy buenos para ilustrar el caso)
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

tiutiu

Cita de: "BeRSeRKeR"Una de las desventajas que yo le veo, aparte del aliasing, es el tener que utilizar un offset para que las sombras salgan bien, me refiero al "z bias". Nosotros lo resolvemos renderizando las caras posteriores en vez de las frontales en el depth map. De esta forma podemos utilizar un zbias de 0. Pero hace poco he leído una técnica que se utilizó en una película utilizando RenderMan, que lo que hace es renderizar en el depth map las caras frontales, las caras posteriores y luego hace una media entre ambas y ese depth map es el que se utiliza. Evidentemente tiene la desventaja de que son dos pasadas. La media se podría calcular en el pixel shader.
¿No teneis problemas cuando mirais el modelo desde atras? Es decir, si dibujas las caras de atras, cuando mires el modelo desde atras (en sombra) esa zona tiene la misma profundidad que la guardada en el depth map, asi que puedes tener tambien flickering en la sombra que hace sobre si mismo, con lo cual deberias usar un bias, ¿no? Sino, ¿que ventaja tiene dibujar las caras de delante? todo el mundo dibujaria las de atras :huh:
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

Haddd

 Recordaros que el algoritmo de shadow maps con trapezoides está PATENTADO. Eso creo... :(

Shadow Maps tienen muchísimas ventajas, salvo el maldito problema de la resolución. La mejor es la de que si tienes un objeto en una habitación, no tienes los problemas con stencil de extrusión y que la sombra aparezca en la otra habitación.

Además, puede utilizarse esa información en otro pasos, como en el caso de light shafts.

Sin embargo, lo mejor es raytracing...A ver si ya nos vamos acercando de una vez...

BeRSeRKeR

 Aquí hay un paper que explica diferentes métodos para evitar el problema del "z bias". Uno de ellos creo que es la de "mid-point shadow maps" que debe ser la que he mencionado.

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


tiutiu

 Haddd, si esta patentado el TSM, o al menos pendiente de patentar, pero diria que solo en EEUU (al menos no en Europa aun) se pueden patentar metodos o algoritmos, y que aqui no se reconocen dichas patentes. Es el mismo caso que con la patente del Carmack's Reverse para sombras.
Ademas, si no vas a hacer algo para el mercado multinacional de millones de dolares no creo que tengas problemas con dichas patentes :)

He estado mirando el capitulo de nVIDIA GPU Gems 2 sobre PSM. Han hecho varias modificaciones para que corra en la GPU y subsanar algunos fallos que habia en el paper original. Da buenos resultados a juzgar por los screenshots.
A ver si me miro otras implementaciones, como TSM (creo que es el mas facil de todos y el que da mejores resultados) o LiSPSM (aun no he visto comentarios en ningun sitio, pese a que tiene muy buena pinta y no parece tan dificil de implementar).
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

AK47

 Yeup!
Solo commentar que he leido por ahi que no se recomienda usar los Perspective Shadow Maps (creo que era nVidia y algún que otro más que lo decía). Aunque no se si se decía de la versión original y la última versión ya arregla los problema que pudiera tener.

tiutiu

 Si, es nvidia la que recomienda no usarla. De hecho hay una frase que dice "friends don't let friends use PSM" o algo asi :lol:
Es que si os mirais el paper es un jaleo entenderlo y mas aun implementarlo, ademas que tiene fallos de concepto que aun hacen que sea mas dificil. Por eso decia que lo mejor es implementar TSM (conozco mas casos que lo han implementado satisfactoriamente) o LiSPSM (de este ultimo creo recordar que hay una demo en su web).

Haddd, ¿tu crees que hacer sombras por raytracing en al GPU sera una buena opcion? creo que se comeria demasiados recursos como para usarlo en juegos (creo que el relief mapping con siluetas usa algun tipo de raytracing y es costosisimo, aunque queda impresionante).
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

AK47

 Yepa otra vez
Pues si, el LiSPSM tiene buena pinta y en su web tienen una demo (un poco cutrillo, creo yo  :() y un video que creo yo tiene buena pinta. Es mas, se comparan 3 tecnicas: shadow maps uniformes u homogeneos (creo que es el shadow map "pelao"), el PSM y el LiSPSM.
Estaria muy bien implementarlo en el juego (genial). Lo malo es que necesita de Geforce 3 para arriba (lo de siempre, pixel shaders), y no se si con eso se hace una criba demasiado estricta.


tiutiu

Cita de: "AK47"Yepa otra vez
Pues si, el LiSPSM tiene buena pinta y en su web tienen una demo (un poco cutrillo, creo yo  :() y un video que creo yo tiene buena pinta. Es mas, se comparan 3 tecnicas: shadow maps uniformes u homogeneos (creo que es el shadow map "pelao"), el PSM y el LiSPSM.
Estaria muy bien implementarlo en el juego (genial). Lo malo es que necesita de Geforce 3 para arriba (lo de siempre, pixel shaders), y no se si con eso se hace una criba demasiado estricta.
Hombre, el SM lo veo muy eficiente a partir de tarjetas con shaders, ya que puedes aprovechar mucho las posibilidades que te da. Si no tienes una GF3 (incluso GF4 Ti) deberias olvidarte de los shadow maps y esperar que tu CPU sea suficiente potente para extraer (y extruir) los shadow volumes. O sino te conformas con un circulo proyectado a modo de sombra (twist)
Las sombras de calidad necesitan hardware un poco decente (las GeForce 4 o FX deberian ser un estandar ya, valen cuatro duros... lo mismo digo con ATi).

Supongo que al final implementare TSM o LiSPSM, aunque antes tendre que estudiarme los papers a ver si encajan bien en mi proyecto. Segun he visto por los videos de TSM (son 2 ficheros comprimidos de 60MB cada uno), da buenisimos resultados. Se ven comparativas entre varios algoritmos (BB, PSM, TSM) de los mismos walkthroughs por distintos escenarios y la verdad que TSM machaca al resto. Me hubiese gustado ver una comparativa de TSM vs LiSPSM.
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

Haddd

 Nada de raytracing por GPU, es una locura. Me refiero a que las tarjetas gráficas sean simple y llanamente "trazadoras de rayos". ;)






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.