Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Stencil Buffer

Iniciado por davidgf, 19 de Agosto de 2008, 03:01:48 PM

« anterior - próximo »

davidgf

Perdona prompt, es que no me he enterado de nada.

Otra cosilla más, alguien sabe como usar separatestencil de ATI y compañía?? Es que me gustaría implementar-las para mayor velocidad en diferentes targetas.

Gracias chicos!

David
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

Cita de: davidgf en 07 de Septiembre de 2008, 11:25:40 PM
Perdona prompt, es que no me he enterado de nada.

Perdona, intento contestar rapidamente porque suelo tener poco tiempo.

OpenGL FAQ
18.060 How can I make a spotlight work?

    A spotlight is simply a point light source with a small light cone radius. Alternatively, a point light is just a spot light with a 180 degree radius light cone. Set the radius of the light cone by changing the cutoff parameter of the light:

        glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 15.f);

    The above call sets the light cone radius to 15 degrees for light 1. The light cone's total spread will be 30 degrees.

    A spotlight's position and direction are set as for any normal light.

Vamos que si añades la propiedad GL_SPOT_CUTOFF será una luz tipo foco y no una "point light".

Cita de: davidgf
Otra cosilla más, alguien sabe como usar separatestencil de ATI y compañía?? Es que me gustaría implementar-las para mayor velocidad en diferentes targetas.

Gracias chicos!

David

Pues no he investigado nunca que es esto, no puedo opinar pero ya nos contarás de que va :)

Un saludo!

davidgf

Ah era eso, es que me parece que no leiste bien el post.

Mi objectivo era hacer un spot light usando Stencil Shadows. Se hacer omni i paralel y se me había ocurrido que las spot las podía hacer con una omni i añadiéndole una esfera con agujero alrededor (invisible al usuario). No?
Lo que pasa es que me obligaría a usar ZFail en todas las escenas.

I por cierto, para hacer un switch suave entre ZPass y ZFail se me había ocurrido usar interseccion entre bounding boxes, pero me parece que acabaré usando ZFail para todo y punto.

Gracias de nuevo!

David
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

Cita de: davidgf en 08 de Septiembre de 2008, 01:57:06 PM
Se hacer omni i paralel y se me había ocurrido que las spot las podía hacer con una omni i añadiéndole una esfera con agujero alrededor (invisible al usuario). No?

posi, no es mala idea.

davidgf

Hey!

Una preguntilla más... (No paro eh?)

Me gustaria poder hacer omni lights con decaimineto de luz, range, etc.
Se me había ocurrido (y he leído por ahí en algún ejemplo) usar per pixel lighting (o fixed pipeline si me conviene) para las luces i en el moment del stencil test hacer:

Si cae fuera de la sombra: lo pinto con glEnable(LIGHT...)
Si cae dentro de la sombra pos glDisable(LIGHT...)

De esta manera quedará bonito, las sombras quedarán correctamente adaptadas al rango de la luz.
Pero y si quiero más de un foco??? entonces cómo lo hago? Se me ocurren chapucerías como basarme el la información del stencil, y creo que funcionarían. Y a vosotros se os ocurre algo??

Gracias!

David
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

Esto ya es un tema complicadillo, creo que quieres tener en cuenta que se crucen por ejemplo varias sombras no?

Cuidado con "sumar" sombras :D

Sobre lo de basarte en la información que hay en el stencil, por supuesto, hazlo. No es una basura, la información "está ahi dentro" :P

Ya nos contarás que tal rinde todo! :)

davidgf

#21
Bueno no lo sé, mi idea era la siguiente:

Renderizar por cada luz la información del stencil. De manera que con la primera luz me quede 0 en las zonas con luz y un numero mayor o igual a 1 en las zonas donde hay sombra. Ahora necesitaría una función que me pasara todo lo igual o mayor a 1 a 1, para tener 0 o 1 en función de si hay sombra o no.
Esto lo haria con glStencilFunc(GL_GEQUAL,1,~0); (para que coja lo mayor o igual a 1) y entonces un glStencilOp(GL_KEEP,GL_REPLACE,GL_REPLACE); para cambiar todo por la ref, que es 1, en caso que haya un numero >= 1.
Renderizo un quad que ocupe toda la pantalla para asegurarme que se modifica todo el stencilbuffer enterito.
I esto lo repito por cada luz cambiando el 1 por 2 elevado al numero de luz que use de manera que la info del stencil seria:

XXXXXXXX bits donde 0 significa todo iluminado y cada bit una luz activa.
000001001 area con sombra de la luz 1 i la luz 4.

Entonces durante el render activaría cada luz segun el bit que le toque o una de sus combinaciones.
Es muy engorroso ademas de ser una paja mental importante... Alguien sabe que usan los motores comerciales que son cools y mola mas que esta chapuza??

Esto vale si se usa una luz (cuya solucion es trivial y me ahorro todo el proceso) o bien con dos, que lo puedes controlar bastante (sobretodo el tema del wrap y el clamp del stencil con pocos bits).

Gracias

David
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

davidgf

Yeah!

1a Misión conseguida. Esto es con la fixed (se nota el plano cortado a cachitos pequeños)



Ahora implementaré per pixel lighting. Y me olvidaré de más luces. Esto ya retrasa bastante el render ya que renderizo 3 veces: depth, sombra y no sombra. Aunque también tiene su ventaja: Si uso este foco de luz para las escenas nocturnas sólo he de sacar los shadow volumes de los objetos que tengo cerca de la luz, cosa que reduce mucho el fillrate provocado por los volumes.

El siguiente paso es implementar realtime volume shadows que combinado con esto y per pixel lighting me irá de coña para las escenas nocturnas. Para el día usaré lo de siempre (mask con blending) que es más rápido para una luz direccional.

En fin muchachos, si sabéis dónde encontrar un buen sitio donde se explique el uso de ARB_fragment_program me lo decís! Paso de usar GLSL para esto que es tan básico... ya tendré tiempo de experimentar.

Saludos y gracias!!

David
Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

Enhorabuena!

:) esperamos impacientes tus avances.






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.