Tras un período de semi-abandono del blog (¿alguien me puede vender algo de tiempo libre?), he terminado y documentado de una vez por todas la primera de una serie de demos en la que llevo trabajando unas semanas.
Uno de los aspectos que más me gusta de XNA que al incorporar una capa de abstracción a bajo nivel, evita perder tiempo en tareas tediosas como la programación de cargadores, gestores de recursos y demás parafernalia, permitiendo centrar el proceso de desarrollo adecuadamente.
Aprovechando este potencial, y con cierta curiosidad por conocer las diferencias entre HLSL y GLSL, me he decidido a dejar de lado OpenGL una temporada (¡y eso que soy un fan acérrimo!) y continuar empleando XNA para la programación de shaders. El primer resultado os lo traigo hoy, en forma de un shader de bloom basado en los métodos descritos en la sección “Making Your Whites Whiter and Your Brights Brighter” del libro OpenGL SuperBible, 4ª edición, páginas 630-638.
El proceso para obtener este efecto consiste en renderizar la escena a un RenderTarget2D, y a partir de esta copia realizar sucesivas acciones. En primer lugar se reescala hasta obtener una textura de 2×2 píxeles de la que se extrae la luminancia media de la escena; este valor se emplea para descartar los píxeles demasiado oscuros, y mediante sucesivas operaciones de reescalado y desenfoque gaussiano, se obtienen cuatro imágenes que superpuestas dan el resultado final. A continuación hay un diagrama que explica el proceso con más claridad (porque una imagen vale más que mil palabras 😉 ).
El código fuente del proyecto lo podéis descargar de este enlace. En el archivo comprimido se incluye una explicación de los controles para manejar el programa y una copia de la licencia: GPL v3 para el código y Creative Commons by-sa para el contenido (modelo de la esfera y textura).
¡Espero que os sea útil!