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

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

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!

davidgf

#2
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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

tamat

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.
Por un stratos menos tenso

davidgf

#4
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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

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

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

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.

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

tamat

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.
Por un stratos menos tenso

Marci

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.

davidgf

Y si uso SDL??? yo no he especificado nada y funciona, ya lo probaré en windows....

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

Marci

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

davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

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...






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.