Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: davidgf en 19 de Agosto de 2008, 03:01:48 PM

Título: Stencil Buffer
Publicado por: davidgf en 19 de Agosto de 2008, 03:01:48 PM
Hola chicos! Sigo aqui dando guerra con el 3D.

Tengo una pregunta sobre OpenGL: Cómo saber si el buffer Stencil está soportado. Según  he visto eso depende sólo de la versión de OGL, que debe ser superior a 1.1. Pero es eso totalmente cierto? Pues vengo del D3D y allí había muchisimos CAPS dónde averiguar si algo estaba soportado y segun recuerdo iba un poco a lo loco.

Estoy programando con Linux y me da la impresión que la implementación de OpenGL de mi driver hace más cosas que el DX, cosa que me sorprende porque debería ser al revés, o no?

Por cierto uso GLEW para checkear las caracteristicas del GL y adaptar el render o las caracteristicas gráficas a la targeta.

Gracias!

David
Título: Re: Stencil Buffer
Publicado por: Prompt en 19 de Agosto de 2008, 10:07:18 PM
en D3D lo que no se soporta por hardware se simula con la CPU. Pero la tarjeta soporta por hardware solo unas cosas en ambos.

Para activar o desactivar el buffer stencil glEnable glDisable GL_STENCIL_TEST.

Efectivamente los buffers de patrón! :) están soportados desde OGL 1.1 que es la versión nativa que trae Windows XP, por lo cual no necesitarás usar glew para pedirle a windows el puntero a esa función de la dll de nVidia o ATI.

En Linux... lo tienes directamente disponible :) como si usaras glVertex3f.

Saludos!
Título: Re: Stencil Buffer
Publicado por: davidgf en 20 de Agosto de 2008, 12:08:33 PM
Gracias Prompt,

En resumen, si compruebo que tengo OGL 1.1 en el sistema puedo usar Stencil sin problemas.
Otra preguntilla: Si uso GLEW y lo inicializo nada más arrancar el programa, no hace falta que me preocupe de buscar punteros de función, él lo hace por mí no? Al menos eso en Fedora me funciona, ya veremos en Win.

Aprovecho para añadir una pregunta: SI estoy bajo Linux y quiero compilar para Win (suponinedo que el código es 100% portable) qué compilador uso? VS me da problemas (el 2005) con STL, Dev-cpp me hace el tonto, diría que por lecturas de ficheros que no son 100% compatibles con Win. Alguna sugerencia??

Gracias!!!

David

PD: Que diferencia hay entre GL_INCR_WRAP (OpenGL 1.4 o superiro) y INCR_WRAP_EXT (EXT_stencil_wrap)?? Hacen lo mismo no? Cuál de los dos debo usar?
Título: Re: Stencil Buffer
Publicado por: tamat en 20 de Agosto de 2008, 05:18:46 PM
sip, glew te asocia los punteros, de hecho una manera facil de sabir si una funcion la soporta la tarjeta del usuario es mirar si el puntero a la funcion vale null.

Sobre lo del compilador, mi consejo es que si ya compilas usando GCC en linux pues que siguas usando GCC para windows.

De lo ultimo ni idea.
Título: Re: Stencil Buffer
Publicado por: davidgf en 20 de Agosto de 2008, 05:29:03 PM
Edito por que he encontrado el error!!

Por cierto tamat, usar gcc en Win se hace con cygwin no? Y de dónde saco las librerias y tal? Sabes de alguna guía o me podrías pasar algun link de algun ejemplillo tonto? Muchas gracias por avanzado!

David
Título: Re: Stencil Buffer
Publicado por: Prompt en 20 de Agosto de 2008, 10:48:20 PM
Si quieres que tu codigo sea 100% igual que linux y funcione en windows necesitarás cygwin si. Con sus pro y sus contras.

Yo te recomiendo el compilador de microsoft y VS en windows y gcc en linux, el codigo de C++ será compatible, pero el uso de ciertas librerias no ANSI como la de sockets etc... no. Solo tienes que tener cuidado o usar librerias que sean multiplataforma.

Lo facil luego puede salirte caro :), no he visto aplicaciones complejas en cygwin en videojuegos vamos... no se si el layer de cygwin tendrá un efecto negativo en el rendimiento.

PD: en Linux y más aun en Mac, no hace falta glew ni punteros a funciones, según la version de tus drivers tendrás disponibles unas funciones y otras. El "problema" viene con windows XP y anteriores. En vista ya es equivalente a linux, ya que no se depende de microsoft y su extension de funcionalidad de la dll opengl32.dl v1.1.

Saludos
Título: Re: Stencil Buffer
Publicado por: davidgf en 21 de Agosto de 2008, 07:00:09 PM
Mmm Ya veo, gracias Prompt, pero aun tengo alguna pregunta más (y las que me quedan jeje)

Sabes cómo usar la extensión glStencilOpSeparateATI ? La he usado siguiendo las indicaciones de la documentación y más tarde viendo cómo lo hacía uno por internet (que era igual que la mía) y no me va, me dibuja lo mismo que si sólo hiciera una pasada (es decir incrementando o decrementando, no los dos a la vez). Y deshabilito el culling claro.

Otra pregunta de Win. Cómo es posible que Windows me de problemas con STL? Comparar un string con otro con == no me deja. Cómo lo hago y porqué se produce eso? Uso VS 2005.

Gracias por todo!

David
Título: Re: Stencil Buffer
Publicado por: Prompt en 22 de Agosto de 2008, 09:47:05 AM
Pues imagino que con

#include <string>

Se solucionará todo :P

Te hago yo una pregunta, por qué usas sombras de stencil ? por tener una compatibilidad con tarjetas muy antiguas?

Las sombras de estencil son sombras muy precisas y duras, vertex dependent, o lo que es lo mismo, que contra más vertices tengas en la escena usando sobras de stencil / patrón ( por aquello de "recortar" ) peor irá tu aplicación.

Sobre los detalles, con esa información no te puedo ayudar, encima tampoco le dí mucha caña al stencil. Si te puedo decir, que es posible que en la demo que si te funcione puede que estén configurando algo que tu no, es lo que suele pasar, hate un ejemplo lo más sencillo posible con tu motor.
Título: Re: Stencil Buffer
Publicado por: davidgf en 22 de Agosto de 2008, 12:52:58 PM
Sí en principio por la compatibilidad que tienen y por que las demás no me convencen. Los Shadow Maps tienen una calidad bastante mala en principio, los lightmaps los usé para el proyecto que hice en la escuela (Tàrraco) y quedan bien, pero necesitas programas engorrosos o bien calculartelos tu que es un rollazo. Además con un Octree me evito bastante geometría y el fillrate intentaré evitarlo con double sided stencil, que veo que está bastante soportado por muchas targetas.

Si tienes alguna sugerencia más aquí estoy. Ah si, tengo previsto usar projective texturing para las sobras de los objectos como follaje, cristales, etc. A ver qué tal.

Por cierto, he descubierto lo que le pasaba al maldito VS, en la web de MS dicen que incluya : #include "iso646.h" ya que las STL no estan bien implementadas del todo en esa versión de VS. Me parece que si tienes el SP1 no lo notas para nada.

Saludos y muchas gracias!

David
Título: Re: Stencil Buffer
Publicado por: tamat en 22 de Agosto de 2008, 04:23:54 PM
pero qué leches, no necesitas cygwin, no hablo de emular linux en windows, hablo de usar directamente el mismo compilador, en su version windows.

El Devcpp lo usa, bajatelo y echale una ojeada.
Título: Re: Stencil Buffer
Publicado por: Marci en 22 de Agosto de 2008, 05:11:48 PM
En windows tienes que solicitar el stencil buffer cuando creas el contesto mediante ChoosePixelFormat() y le pasas el PIXELFORMATDESCRIPTOR con los datos que tu solicitas, en concreto en el campo cStencilBits. Si no está soportado ChoosePixelFormat() devolvería cero.

Para linux tendrias que hacer algo similar, pero utilizando la función glXChooseVisual() y solicitando ahi un stencil buffer.
Título: Re: Stencil Buffer
Publicado por: davidgf en 23 de Agosto de 2008, 12:12:42 AM
Y si uso SDL??? yo no he especificado nada y funciona, ya lo probaré en windows....

Título: Re: Stencil Buffer
Publicado por: Marci en 24 de Agosto de 2008, 12:24:23 PM
Yo de SDL no controlo. A ver si alguien lo puede confirmar pero creo que tienes que llamar a SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1) antes de llamar a SDL_SetVideoMode y despues comprobar que te devuelve SDL_SetVideoMode
Título: Re: Stencil Buffer
Publicado por: davidgf en 29 de Agosto de 2008, 04:42:34 PM
Gracias Marci, aunque sin la llamada funciona igual, la pondré para asegurarme que dispongo de buffer stencil.

Una preguntilla más, spotlights con stencil shadows es posible o me lo estoy inventando yo???

Gracias por todo!

David
Título: Re: Stencil Buffer
Publicado por: Prompt en 30 de Agosto de 2008, 10:11:37 PM
Si lo estas haciendo por fixed pipelines las sombras stencel, debes tener en cuenta que las luces, tienen un componente de angulo siempre, normalmente asignado por defecto a 180, de 0 a 180 son los valores asignables.

U sea se, que todas las luces son spotlight. Lasluces omnidireccionables se simulan con un "cubo" de luces, o 6 render a textura para crear un shadow map. Si no hay otras tecnicas menos agresivas...
Título: Re: Stencil Buffer
Publicado por: davidgf en 07 de Septiembre de 2008, 11:25:40 PM
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ítulo: Re: Stencil Buffer
Publicado por: Prompt en 08 de Septiembre de 2008, 01:41:37 PM
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!
Título: Re: Stencil Buffer
Publicado por: davidgf en 08 de Septiembre de 2008, 01:57:06 PM
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ítulo: Re: Stencil Buffer
Publicado por: Prompt en 08 de Septiembre de 2008, 02:52:21 PM
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.
Título: Re: Stencil Buffer
Publicado por: davidgf en 11 de Septiembre de 2008, 01:29:39 AM
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ítulo: Re: Stencil Buffer
Publicado por: Prompt en 11 de Septiembre de 2008, 01:50:17 AM
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! :)
Título: Re: Stencil Buffer
Publicado por: davidgf en 11 de Septiembre de 2008, 04:12:29 AM
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ítulo: Re: Stencil Buffer
Publicado por: davidgf en 12 de Septiembre de 2008, 01:54:50 AM
Yeah!

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

(http://img178.imageshack.us/img178/9743/stencilqj2.th.png) (http://img178.imageshack.us/my.php?image=stencilqj2.png)

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ítulo: Re: Stencil Buffer
Publicado por: Prompt en 29 de Septiembre de 2008, 02:25:02 PM
Enhorabuena!

:) esperamos impacientes tus avances.