Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Shadowmap

Iniciado por Haddd, 13 de Enero de 2005, 12:41:59 AM

« anterior - próximo »

BeRSeRKeR

 Yo jamas he implementado stencil shadows pero por lo que he leído, al iniciar la aplicación se calcula la conectividad entre vértices y después, en cada frame (o si la luz o el objeto se mueve, supongo) se calcula el contorno desde el punto de vista de la luz y se extruye (que esto se puede hacer en un vertex shader) una cierta distancia. En el caso de modelos animados por bones, la conectividad se podría calcular sobre el modelo en pose inicial y como la conectividad no varía a lo largo de la vida del modelo pues es algo que no hay que recalcular. Después la silueta supongo que teniendo el modelo transformado por lo bones, calcularla será como cualquier otro modelo y la extrusión del shadow volume pues supongo que más de lo mismo. Evidentemente esto depende de si el skinning lo haces en la CPU o en la GPU. Si lo haces en la GPU estamos ante un problema ya que además de hacer el skinning en la GPU para el render, también trendríamos que hacer el skinning por software para calcular el contorno, pero si lo haces a través de la CPU como nosotros, no debería haber problemas.

Yo viendo los resultados del shadow mapping veo que si no utilizas un tamaño de shadow map aceptable, la sombra produce mucho aliasing más el añadido del shadow bias que rara vez queda 100% bien. Siempre aparecen pixels en lugares que no debería. Sin contar que si variamos el far plane de la luz, el shadow bias que tuviéramos funcionando en una situación, no valdrá para ésta. Supongo que utilizando una técnica como puedan ser los perspective shadow maps podría solventarse parte de estos problemas.

Así que tal vez una solución híbrida podría ser interesante. Stencil shadows para la geometría estática y depth shadow maps para los personajes. Algo así es lo que parece que hace Unreal Engine 3.

La verdad es que no hay ninguna técnica que nos satisfaga al 100%. :D

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

Lord Trancos 2

 Como mola el video  (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)

 El tema de las sombras es arduo y complejo, sin dua. Me estube pegando de ostias para hacer un sistema de stencil shadows volumes. Tiene 2 inconvenientes clave:
1) Acceder al stencil buffer es un proceso muy lento para tarjetas k estén por debajo de una gForce3, es decir, no intentar en gf1, 2MX, 4MX, 8500, 9200 o similares.
2) Aunk se puede extruir la geometría por vertex shader, la composición de la silueta se tiene k hacer por soft.

El punto 2 es el k sin duda toca más las pelotas. Lo lógico sería pensar k lo mejor es currarse un buen algoritmo k te sake la silueta con el menor número de vertices posible. Sin duda esto es mejor a la hora de extruir, ya que a menos vertices menos extrusiones. Pero la verdad es k al final me di cuanta de k lo mejor era un algoritmo RAPIDO a la hora de sacar la silueta aunk el número de vertices y caras obtenido fuera mayor. Doom3 por ejemplo lo k hace es sacar la mitad del objeto a extruir (por mitad se entiende la parte del objeto k no está iluminada por la luz, o lo k es lo mismo, las caras en las k su dot contra el vector luz sea menor o igual k 0 (creo k era así). Apartir de ahí lo único k tienes k hacer es duplicar ESA geometría obtenida y extruirla (extruir solo la parte duplicada), generando un index buffer para conectar 2 faces (un quad) por cada 2 vertices extruidos (o por cada edge, lo mismo es), entre la parte original y la parte duplicada. Parace un tanto loco, pero si lo probaís vereis k el rendimiento aumenta bastante, ya que la silueta se computa muy rápidamente. Sin embargo, este algoritmo es poco óptimo para objetos de alto poligonaje, ya que obtendríais volumenes de sombra muy complejos, y por lo tanto, lentos de pintar (más usando el stencil). El hecho de que Doom3 lo haga así es k si nos fijamos los modelos son low poly total (entre 1000 y 1400 polys como mucho, a una media de 800 vertices cada modelo).  Luego está el tema de crear volumenes de sombra para el escenario. Akí ya no entro, xq aunk la base es la misma, algo tiene k ser diferente y eso lo desconozco XD.

Yo  creo k el futuro está en las stencil shadow volumes con una especie de fragment program para disimular los hard edges. El shadow map es bueno cuando el render target es jodidamente grande. El shadow volume se ve igual, sea cual sea la posición de la luz con respecto al objeto, y el objeto con respecto al escenario.
Enga, espero k haya servido de algo!!
Salud2

Pogacha

 El doom3 calcula el frame segun los bones del modelo en un vertex-stream usando software, luego calcula la silueta tambien por software y lo estruja por hardware, obviamente seria mas rapido aplicar la animacion por bones por hardware, pero no se si no se puede con el hardware target o queda mas lento.
Sobre la geometria de la esceba se usan los SVBSP que todavia no los logro implementar, pero seguramente los veran en el Enigne 2 prebeta 4, ademas corta los volumenes de sombra con el arbol bsp transformandolos en algo que llama interacciones (volumenes de luz?), lo cual no termino de entender.
Y no se me ocurre como softear los stencil con un FP, exepto usando jittering o alguna tecnica igual de costosa o usando el alpha buffer para ir acumulando el sombreado y cosas así, por ahora poco practicos.
Saludos.

BeRSeRKeR

 Evidentemente las soft-shadows son posibles con los shadow volumes aunque es un proceso lento y que necesita obligatoriamente una aceleradora con soporte para pixel shaders 2.0 o superior. De todas formas se puede realizar en tiempo real a un frame rate decente. Por ejemplo aquí tenéis un buen documento sobre el tema. Es la tesis de Casper Fauerby (aka Telemachos) y en ella explica muy bien la generación de soft-shadows utilizando shadow volumes y penumbra wedges. Hay otro documento anterior por Tomas Akenine-Möller que se menciona en el texto de Telemachos.

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

AgeR

 Hmmm y una curiosidad sobre los shadow volumes. De normal, cuando generas un volumen, suele extederse hasta el "infinito" o bueno, hasta donde "se quiera". Pero ahí aparece el problema de que el volumen... "atraviesa paredes". No sé si me explico. Si un bicho proyecta su sombra en el suelo, ésta también se proyectará en el piso de abajo (entiendase la idea que estoy espeso XD).

Sabéis cómo solucionar esto? Lo más obvio es ver dónde intersecta la extrusión de cada vértice y parar ahí dicha extrusión, pero es lento de cojones y no creo que pueda ser permisible a no ser que haya muy poca geometría (no lo he probado, así que hablo de teoría).

Hay algún truco o algo que se me haya pasado? La verdad es que parece mentira con toda la información que hay sobre el problema con la cámara, y que no haya nada al respecto de esto (o igual sí).

BeRSeRKeR

 
Cita de: "AgeR"Hmmm y una curiosidad sobre los shadow volumes. De normal, cuando generas un volumen, suele extederse hasta el "infinito" o bueno, hasta donde "se quiera". Pero ahí aparece el problema de que el volumen... "atraviesa paredes". No sé si me explico. Si un bicho proyecta su sombra en el suelo, ésta también se proyectará en el piso de abajo (entiendase la idea que estoy espeso XD).
En Doom3 seguramente utilizan lo que ha dicho Pogacha para conseguir lo que dices:

CitarSobre la geometria de la esceba se usan los SVBSP que todavia no los logro implementar, pero seguramente los veran en el Enigne 2 prebeta 4, ademas corta los volumenes de sombra con el arbol bsp transformandolos en algo que llama interacciones (volumenes de luz?), lo cual no termino de entender.

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

Pogacha

 
CitarHmmm y una curiosidad sobre los shadow volumes. De normal, cuando generas un volumen, suele extederse hasta el "infinito" o bueno, hasta donde "se quiera". Pero ahí aparece el problema de que el volumen... "atraviesa paredes". No sé si me explico. Si un bicho proyecta su sombra en el suelo, ésta también se proyectará en el piso de abajo (entiendase la idea que estoy espeso XD).
Yo y Carmack los extuimos hasta el infinito, por simple comodidad y tambien por que  las luces que tienen un alcanze mayor al que son restringidas por la geometria. Otros tipos de atenuacion como la de 1-(D^2/r^2) permiten tener mayor intensidad de luz en un sector mas concentrado y así es posible estrujar hasta el radio de alcanze de la luz tan solo.
Pero carmack un paso adelante mio utiliza SVBSP "shadow volumes BSP" (o alguna tecnica parecida, me confunde con el nombre "Interaction" parece que el en si define volumenes de luz en vez de sombras) que sirven para eso mismo, crear un arbol bsp de shadow volumes y así mezclado al BSP de la geometria se logra un arbol capaz de optimizar esto, saber que esta a la luz o a la sombra de un solo tiron.

CitarEvidentemente las soft-shadows son posibles con los shadow volumes aunque es un proceso lento y que necesita obligatoriamente una aceleradora con soporte para pixel shaders 2.0 o superior. De todas formas se puede realizar en tiempo real a un frame rate decente. Por ejemplo aquí tenéis un buen documento sobre el tema. Es la tesis de Casper Fauerby (aka Telemachos) y en ella explica muy bien la generación de soft-shadows utilizando shadow volumes y penumbra wedges. Hay otro documento anterior por Tomas Akenine-Möller que se menciona en el texto de Telemachos.

Ese articulo esta bueno  :) , ya conocia los penumbra-volumes, casi que lo implemento para mi motor antes de tener la placa de video nueva, pero no sabia para nada que se podia hacer en tiempo real e inclusive todavia tengo mis dudas, voy a darle un vistaso mas tarde.

Saludos

PD:
CitarYo y Carmack
XD, uno se la cree, siganle la corriente, de todas formas que esos dos personajes no pueden ir en la misma linea.

AgeR

Cita de: "BeRSeRKeR"En Doom3 seguramente utilizan lo que ha dicho Pogacha para conseguir lo que dices:
Bueno, pero a mí lo que haga el Doom3 me la trae floja  :P . Quiero decir, la gente normal, a la que no le apetezca eso de los SVBSP cómo se las apaña?

No me imagino en un juego ver la sombra de un enemigo en una pared donde tú estás cuando el bicho está dentro de la habitación de al lado. Algo tiene que haber para no extender la sombra más allá de lo necesario.

Igual se hace lo que había dicho yo de comprobar los rayos, pero se me antoja bastante lento. Igual me equivoco  :huh:  

BeRSeRKeR

 Bueno en la mayoría de los casos, el problema que mencionas se solucionaría a través de un sistema de visibilidad. Se supone que no vas a calcular una luz que esté en otra habitación y no es visible.

Mírate el documento que he mencionado. En él no sólamente se habla de cómo conseguir soft shadows sino que además da consejos para optimizar los shadow volumes que es común para cualquier sistema que utilices.

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

Pogacha

 AgeR:
Por supuesto!, no entendiste que la sombra de la escena tapará la sombra del personaje, en teoria los shadows-volumes son para determinar donde no afectará la luz, no para dibujar la sombra, por al contrario, proyectando sombras se llaman sombras proyectadas y en realidad es un metodo todo lo contrario, la luz se dibuja por todos lados y luego se dibujan las sombras encima de esto oscureciendo.
Saludos

Pogacha

 El metodo de los stencil-shadow es mas o menos así:

Color ambiente:
1º pasada - Dibujas la escena con color ambiente, lo importante es llenar el z-buffer.
Desactivas la escritura de z-buffer

Por cada luz:
*  Desactivas la escritura en el color (no se como se hace con DirectX) o sea solo permites la escritura en el stencil buffer.
 * borras el stencil buffer
 * Activas el stencil en sumar 1 cuando pasa el z-test, y pones cullface(front_face).
   1º pasada -  estrujas cada borde de las caras al infinito ( o al menos mas haya del alcance de la luz).
 * Activas el stencil en restar 1 cuando pasa el z-test, y pones cullface(back_face).
    2º pasada -  estrujas cada borde de las caras al infinito.
 * Desctivas la escritura del stencil
 * Activas la escritura del color modo suma.
 * Activas el stencil test de manera que dibuje cuando sea 0.
  3º pasada -  dibujas cada cara de la geometria afectada con la luz per pixel.

Para el zfail o carmack reverse lo que se hace es, primero que todo ponerles tapas a los volumenes de sombra  y es lo mismo pero en vez de sumar y restar cuando pasa el z-test se suma y resta cuando falla en el z-test.

El primer metodo falla cuando el ojo se encuentra cerca  del volumen de sombra (en realidad lo que importa es el plano de proyeccion), el de carmack no falla nunca pero es mucho mas costoso y lo que yo hago al menos es usar el primer metodo(zpass ) cuando no estoy en un volumen de sombra y el zfail en caso contrario.

Saludos.

KaMuY

 Oye... puede que os parezca tonto.. pero.... como se hace un extrude por hardware? De donde puedo sacar información o algún tutoría? Es que hace tiempo para practicar programe sombras volumétricas.. pero por software... y la parte del extrude estaría genial hacerla por hardware....

Y ya que estamos... información sobre shader... que nunca se como se usan ni que son exactamente... Por que siempre son ejemplos muy muy largos, raros y muy muy diferente entre unos y otros.. Yo tenia entendido que es algo así como un procesador de vértices que tu programas, que estoy tan seguro de eso como de que la ley de la gravedad se aprobó en el parlamento... :P no seáis muy duros con mi ignorancia :P

:D  

AgeR

 Ya que el tema es sobre shadowmaps y stencil shadows, casualmente en gamedev hay un nuevo artículo sobre soft shadows aquí.

Parece que el tema está en hacer un blur de los resultados en el stencil (lo he mirado por encima, así que no sé si es correcto lo que digo XD).

PD: La sombra que se obtiene rockea muxo  (genial)  

Pogacha

 Shader, puede ser de vertices o de pixeles, pero el primero y con menos requerimientos por ahora es el de vertices, la funcion del vertex-shader es de programar la transformacion del vertice y de sus propiedades, el pixel shader tiene la funcion de combinar las texturas y/o generar un color final procedural para el pixel.

Sobre los shaders tendras que buscar dependiendo si son de OpenGL o DX y debes asegurarte que tu placa de video tenga las posibilidades, para que te anden los Vertex Shaders (nombre de DX) o Vertex Program (nombre de OpenGL) tu placa tiene que decir que tiene capacidades de T&L.

Para extrujar por hardware, debes saber un poco de matematica, se puede hacer de varias formas, su puede hacer por vertice externo a un triangulo o sea tomas el segmento de la silueta y le agregas un tercer vertice correspondiente a la posicion de la luz pero lo conviertes en externo para que el triangulo se "fugue" de este tercer punto hacia el infinito, otro metodo es duplicar los vertices crear cuadrados con dos vertices in-place y dos extrujados.

Y para una extrucion de vertice a distancia finita, solo haces:

V_Entrada=Vertice;
L=Luz;
D=V-L;
N=|D|;
V_Salida = V_Entrada + N * ( Alcance_de_La_Luz + D.Longitud() );

Estos documentos de NVidea te cuenta todo esto en detalle.

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.