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
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!
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?
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.
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
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
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
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.
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
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.
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.
Y si uso SDL??? yo no he especificado nada y funciona, ya lo probaré en windows....
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
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
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...
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
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!
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
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.
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
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! :)
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
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
Enhorabuena!
:) esperamos impacientes tus avances.