El buffer de Stencil - 01/06/2007, 21:27

Entre antier y ayer estuve jugando con el buffer stencil de OpenGL, en realidad el uso de este buffer es muy sencillo y se puede usar para muchas cosas, por ejemplo, sombras y efectos de iluminación, o para efectos de cortinilla, para simular el reflejo de una superficie, etc.

Sin embargo, yo me topé con un bug de SDL. De hecho, me pasó exactamente igual que con el buffer de profundidad: no es que yo fuera demasiado bobo como para hacer un tetrahedro correctamente, lo que pasó esa vez es que se veía raro porque no tenía prueba de oclusión por profundidad y se dibujaba todo como se le daba la gana.
En este caso lo que sucedió es que, debido al bug, el buffer del Stencil sólo se habilitaba si se le daba la instrucción de hacerlo ANTES de crear por primera vez la superficie de dibujado con SDL_SetVideoMode(). Sin embargo, parece que han reparado el error del buffer de profundidad.

Así que aquí les va un ejemplo con el buffer stencil, para simular el efecto cortinilla que tanto nos ha entretenido todos esos sábados por la mañana:





El código se encuentra aquí:

lidsol/stencil-cortinilla-opengl.zip

El código va explicado paso a paso. Básicamente lo que se hace es que se emplea el buffer stencil para permitir visibilidad sólo a travez de una región definida por un polígono que se trata de hacer parecido a un círculo.

- Se deshabilita la escritura al buffer de color para evitar ver el polígono seudocircular
- Se dibuja primero sobre el buffer stencil dicho seudocírculo, marcando la región dentro del polígono con números 1
- Se habilita nuevamente el buffer de color para pintar la textura
- Se establece el modo de operar del buffer de stencil de manera que no sea modificado y que sólo permita que los pixels dentro del área que tiene números 1, sea visible
- Se dibuja la textura como usualmente se realiza
- El resultado de operar contra el buffer stencil es el mostrado en las figuras, ya que el polígono se hace más pequeño conforme pasa el tiempo (la animación se repite una y otra vez)

Para usar en GNU/Linux y FreeBSD:
- Revisar que el sistema posea SDL
- Descomprimir el archivo y establecer construir_lunix.sh dentro de pc_sdl como un ejecutable
- Correr construir_lunix.sh dentro de una terminal

Para usar en Windows:
- Revisar que Dev-CPP tenga instalado SDL
- Abrir el proyecto .dev con Dev-CPP
- Reconstruir todo y correr

(Cómo instalar SDL: lidsol/I)

El tutorial que tiene efectos de reflexión, en el cuál me basé para aprender a usar el buffer Stencil, es la lección 26 de NeHe. También hay una versión que emplea directamente SDL y C++, pero no la logré encontrar de nuevo :S



< Back to blog

This site doesn't use cookies, does not log IPs and does not track you in any way.