Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Volumenes Y Stencil Shadows

Iniciado por DraKKaR, 23 de Julio de 2003, 12:59:01 PM

« anterior - próximo »

DraKKaR

 Holas. Estoy implementando sombras con stencil buffer en mi motor. Lo mas dificil de esto es el calcular la silueta del objeto respecto a la fuente de luz y extruirla para generar el volumen de la sombra. He usado una tecnica que genera correctamente los volumenes de objetos cerrados, como cubos, esferas, toroides, nudos toroides, y cualquier objeto que este CERRADO.

Lo que intentaba ahora es extender la tecnica de generacion de volumnens para que valga para cualquier tipo de geometria.

Me gustaria saber sia lguno de vosotros ha implementado esto alguna vez, y su opinion y resultados sobre las tecnicas que ha usado.

Gracias peña.

Haddd

 Yo no usuaría ya el Stencil. Hay unas técnicas muy interesantes con pixel shaders que permiten además tener soft shadows e incluso resolvemos el problema de hasta cuanto debemos extrusionar una sombra(ya sabes que si tienes una pared, la sombra sigue su extrusión hasta el límite que tu le pongas y esto que el efecto sea chungo)

La técnica es renderizar desde el punto de vista de la luz y almacenar en un pixel shader la distancia a la luz. Entonces volvemos a hacer otra pasada, pero esta vez comparando la distancia que está pregrabada con la real. Si el valor es el mismo, no hay sombra, pero si no, ¡está en sombra! La técnica me pareció tan trivial y simple que creo que es la mejor que se puede utilizar, además funciona con todo. Bueno, tiene sus pegas, claro, pero tiene más ventajas que pegas.

Mírate la web de esta fiera:http://esprit.campus.luth.se/~humus/3D/index.php

Yo voy a hacer algo parecido, pero de momento estoy con el efecto del mar. Ahora que tengo una tarjeta 100% DX9, estoy explotando sus beneficios. (uoh)

Bueno, si tienes más dudas, ya tu sabes!!

DraKKaR

 Te agradezco la opinion, pero mi meta es no usar todavia pixel shaders ni nada de eso, quiero usar el stencil. Mi problema no es el stencil, sino la creacion del volumen de la sombra. Me gustaria saber que tecnicas usais.

MChiz

 Hola Drakkar:

Yo no hace mucho tiempo me encontraba como tu : )

Supongo que estas utilizando el Carmack's Reverse, no? Porque el metodo convencional sirve para objetos cerrados y abiertos.

El problema con el Carmack's Reverse es que has de poner unas 'tapas' al Shadow Volume, para que sea cerrado. Con un objeto abierto puedes conseguir esas tapas de una manera muy muy sencilla.
Supongo que ahora creas la tapa superior ( la cercana a la luz ) con las caras que miran hacia la luz y la tapa inferior ( la extruida ) la creas con las caras que NO miran hacia la luz. Bien, el problema se resuelve utilizando SIEMPRE las caras que miran hacia la luz para crear ambas tapas. La superior la creas como ahora, no hay ningun cambio, pero la inferior la creas a partir de las mismas caras ( las que miran hacia la luz ) cambiandole el sentido al enviar los vertices ( en sentido horario ). Espero haberme explicado bien.

El problema que comenta Haddd ( el de 'capar' los Shadow Volumes ) no existe si haces que todo el mundo proyecte sombra. Es costoso, si, pero es a lo que van los juegos : )

Por otro lado, me parece mejor algoritmo los Shadow Maps ( no los he implementado ). Lastima que tengan el problema de la resolucion. Como algoritmo en si, es muchisimo mas general, y no tienes que estar con siluetas ni nada. Ademas, como es cuestion de hacer renders, la cosa esta muy acelerada. Lo malo es cuando quieres hacer una luz omni x( Aunque la ventaja mas significativa que yo le veo a este algoritmo, en comparacion al de las Stencil Shadows, es que si por ejemplo tenemos una verja, valla, rejilla o similares, en los juegos se representan como un quad con textura ( os imaginais todo eso en poligonos? ). Bien, pues eso con las Stencil Shadows no proyectaria sombra; con Shadow Maps si.

Bueno, creo que ya he rallado suficiente por hoy :b

talogo!!

DraKKaR

 Miuvhas gracias por responder Mchiz, a decir verdad he empezado por implementar el metodo convencional de zpass, no el de carmack. Mi problema reside en estos puntos:

1 - Al crear el volumen, como puedo hacer para saber en ke orden tengo que crear los vertices para que las normales del volumen apunten hacia "afuera". Lo he estado intentando estudiando la normal de la arista de donde proviene el volumen pero nada.
2 - de la forma que hago para calcular la silueta (solo kedarme con las aristas tales que tienen una cara que ve la luz y la otra que no) hace que solo funcione con objetos deonde los triangulos tengan todos 3 vecinos.

Me gustaria saber como resolveis vosotros estos problemas, es lo unico que me atormenta.

MChiz

 De nada Drakkar : )

El primer punto de que me das no lo entiendo muy bien... tan solo tienes que pintar los triangulos ( o el quad ) del Shadow Volume en sentido anti-horario. Lo que tienes que hacer es una pasada pintando con el BackFaceCulling activado, y luego tienes que hacer otra pasada pintando con el FrontFaceActivado. Si no me has entendido, explicame paso por paso como haces tu los Shadow Volumes.

La solucion para el segundo paso es muy facil. Las aristas que proyectan sombra son aquellas que estan entre un triangulo iluminado y uno que NO esta iluminado ( este ya lo sabias ). Otra posibilidad es que la arista NO tenga ningun triangulo vecino. De esta forma un simple quad proyectaria sombra. Piensalo y veras que es asi : ) De esta forma no te obliga a tener la geometria en 2-manifold.

Ten cuidado tambien en los casos donde una arista tiene mas de 2 triangulos. Este caso es raro, pero puede darse. La solucion facil que aplique yo a este problema es simplemente ignorar uno de sus 3 vecinos. Es una cochinadilla, pero funciona :b

Ya me diras a ver que tal

talogooo!!

DraKKaR

 Te voy a explicar el primer punto para que nos entendamos.
Imagina que tengo una arista con 2 puntos (p y q) que SE que va a formar parte de la silueta. Tengo que extruir esa arista para formar un quad. Vale, con el vector a la luz calculo el punto pinf y qinf, que no son mas que los 2 puntos de antes extruidos en direccion a la luz, muy lejos. Ahora tengo que formar el quad, pero.. en que orden le paso los vertices?

p -> pinf -> qinf -> q

ó

p -> q -> qinf -> pinf

Segun en que orden los debo especificar para que el volumen salga bien.

La solucion que me das ya la habia probado pero creo que algo fallaba, lo volvere a intentar a ver que tal, me equivocaria en algo.

El tercer caso que me dices, con mi metodo de deteccion de silueta consideraria que no tiene vecino y por lo tanto se resolveria por el metodo anterior directamente.

MChiz

 Lo que yo hago es:

p -> pinf -> qinf -> q

hmm... ahora que me doy cuenta... fijate que las dos formas de hacerlo que me dices te deberian servir. Una pinta en sentido horario y la otra en sentido anti-horario. Como tienes que hacer 2 pasadas ( una con backFace y otra con frontFace ) te daria igual, porque acabaras pintado TODAS las caras del Shadow Volume por ambos lados. Perdona que insista, pero mejor asegurarse: Haces estas dos pasadas??

Aunque aun no entiendo el problema. Al principio decias que ya generas sombras para objetos 2-manifold... porque estamos discutiendo la forma de calcular el Shadow Volume? :bbb En teoria solo te hace falta utilizar el metodo que te he explicado anteriormente, para objetos abiertos.

Eres de Barcelona? Lo digo porque si te vienes a la quedada del domingo, lo podemos hablar OnLine :bb

Un saludo!

DraKKaR

 Vale, ya tengo el problema, todo lo hacia bien (XDD). El problema era del exportador que he escrito del 3dstudio que no exportaba bien las normales y al calcular la silueta se hacia la picha un lio. Gracias de todas maneras, he cogido mas seguridad en todo esto.

Ya va perfectamente sobre objetos cerrados. Uso la tecnica de zpass. Voy a probar sobre objetos abiertos, no deberias er chungo implementarlo.

PD: No soy de barcelona, y no tenia pensado ir, me para muy lejos (soy de castellon). Aunque me molaria ir a hablar con la peña de stratos.. a ver para cuando se hace una quedada en castellon XD.

MChiz

 Me alegro tio : )

Pues si tienes cualquier duda sobre el tema, y te puedo ayudar, por aqui estare

Un saludote

< Carlos >

Schaffer

 
Citarsi por ejemplo tenemos una verja, valla, rejilla o similares, en los juegos se representan como un quad con textura ( os imaginais todo eso en poligonos? ). Bien, pues eso con las Stencil Shadows no proyectaria sombra; con Shadow Maps si.

No se si me equivoco, pero a no ser que hagas un alpha test (que siempre lo he creido muy costoso),
un fragmento, aunque completamente transparente, se almacena igual en el z-buffer.

MChiz

 Hola Schaffer:

El alphaTest no es muy costoso. En ocasiones te puede dar mayor rendimiento ( si vas a hacer alpha blending, se sobreentiende ).

Creo que te confundes. Cuando pintas con alpha blending, aunque sea alpha 0, se pinta en el ZBuffer, pero con alphaTest, si no pasa, no pasa. Que alguien me corrija si me equivoco, pero creo que no.

Un saludote!


Schaffer

 
CitarCreo que te confundes. Cuando pintas con alpha blending, aunque sea alpha 0, se pinta en el ZBuffer, pero con alphaTest, si no pasa, no pasa. Que alguien me corrija si me equivoco, pero creo que no.

¿Esto no es lo que yo he dicho?

CitarEl alphaTest no es muy costoso. En ocasiones te puede dar mayor rendimiento ( si vas a hacer alpha blending, se sobreentiende ).

Tienes razon he estado buscando por ahi y parece que ya no es muy costoso, o que nunca lo ha sido y me falla la memoria.

Aun asi, creo que se pueden malgastar unos pocos poligonos haciendo la reja o la barandilla, el efecto es mucho mejor, sin contar las self-shadows.

MChiz

 
Citar¿Esto no es lo que yo he dicho?

Si, perdona :b Estaba empanao

CitarAun asi, creo que se pueden malgastar unos pocos poligonos haciendo la reja o la barandilla, el efecto es mucho mejor, sin contar las self-shadows

Estoy de acuerdo con que el efecto conseguido por las Stencil Shadows es mejor, pero meterle poligonos a una reja... y el Shadow Mapping no tiene Self-Shadowing? Yo juraria que si.

Sigo pensando que Shadow Mapping, COMO ALGORITMO, es mejor. El tema de la silueta no me gusta nada. Ademas, si Pixar utiliza Shadow Mapping... el cine siempre tiene razon : )

talogo!

Schaffer

 El shadow mapping si que tiene self-shadowing, pero al ser un simple poligono la sombra es recta no se adapta a la forma y queda peor.

Y como algoritmo, que quieres que te diga, hacer un render completo desde la luz (o 6 para una omni) y guardarse el z-buffer en una textura y volver a renderizar todo, no me parece muy buen algoritmo.

Y no me compares lo que hace Pixar, nada de tiempo real, con el Doom 3  (genial)  (genial)  (genial)  o el S.T.A.L.K.E.R.  (genial)  (genial)  (genial)

Como ejemplo de buen uso de Shadow Maps te acepto los nuevos Unreal  (genial)  (genial)  (genial)

See ya!






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.