28 de abril de 2008

SSAO Again, nueva demo finiquitada y un chino ladrón

Hoy me he decidido a colgar el artículo sobre SSAO. Creo que aclara algunas cosillas importantes (sobre todo en el tema del cálculo de la dirección de visión), aunque quizás debería haber metido algún esquema más sobre los vectores que se calculan como me recomendaron. Lo malo es que no sabía qué esquemas hacer y cómo hacerlos (no encontré la manera de representar algo útil), así que he preferido no meter nada por si acaso lo lío más. Se puede leer AQUÍ.

Por otro lado ya he terminado la demo de nubes volumétricas. Esperaré un par de días o tres para colgarla y así dejo algo de tiempo para que se vean las cosas nuevas que se han subido. Mientras, he grabado un video de la versión casi-final (el skybox no es el definitivo, pero ya se ve cómo es el efecto).



Y por último, relacionado con este tema, hay un chino cabrón que me ha robado el video para hacer publicidad de una página guarra! Es cierto que suena de lo más bizarro, y cuando lo he visto me he quedado tal que así -> o_O Parece que por ahora no le ha servido de mucho...

Actualización: el chino ladrón ha borrado el video. Casi me apena...

24 de abril de 2008

Pa la saca!

Eso es lo que he dicho al pillarme el GPU Gems 3, el Shader X5 y el Shader X6, tres buenos libros sobre técnicas gráficas y otras pijerías para hacer con shaders. Son un poco caros, pero espero que sean los primeros de una buena colección. ^^ A ver si no tardan mucho en llegar y así pillo ideas para nuevas demos.

Y ahora a lo interesante. La demo sobre nubes volumétricas (resulta que hay un artículo en Shader X5 explicando esta técnica) ya casi está terminada. Hoy le he puesto una skybox para que tenga un aspecto más pulido, pero poca cosa más. Todavía no la voy a colgar porque el código está muy guarro y quiero optimizarlo un poco, pero ya queda poca cosa que hacer.


Por otro lado, ya tengo un primer borrador del artículo sobre SSAO. Supongo que mañana ya lo colgaré, espero que haya quedado suficientemente claro. Empieza así:

¿Qué es Ambient Occlusion?

Ambient Occlusion es una técnica de sombreado que simula la atenuación local de la luz debido a la propia geometría de la escena. Es decir, es una aproximación bastante bruta de los métodos de iluminación global que se pueden usar en visualizaciones que no son en tiempo real. Esta técnica se ha hecho popular gracias a que los resultados que proporciona son bastante realistas (provocando una mejor percepción de las formas 3D que se intentan representar) y el coste de cálculo la hace muy interesante para, por ejemplo, visualizar prototipos de animaciones o como un método para mejorar el aspecto del render sin tener que esperar mucho tiempo para pintar la imagen.

Aún así, el tiempo que se necesita para representar correctamente este efecto seguía siendo prohibitivo para juegos u otras aplicaciones interactivas, hasta ahora.

22 de abril de 2008

Que no decaiga

Esta tarde ha sido productiva, el nuevo ejemplo ya va cobrando forma y creo que ya tiene un aspecto lo suficientemente bueno como para enseñar algo:


Se trata de una técnica muy astuta y sencilla para pintar nubes (o explosiones, o humo, o similar) volumétricas con un coste muy bajo. La idea la encontré navegando por ahí en el blog de Kyle Hayward, mientras buscaba nuevos efectos a estudiar. No había ningún código de ejemplo, pero las diapositivas originales que explican el proceso son sobradamente claras para poder implementarla. Los resultados son muy buenos (pese a tener varios problemas), así que recomiendo a todo el mundo echarle un vistazo.

Como se puede observar he copiado la escena de demostración que aparece en las diapositivas, pero es que no voy sobrado de creatividad precisamente, y la escena es buena... ^^U

Screen-Space Ambient Occlusion, toma ya

Si es que no paro. Me levanto pronto, voy a trabajar, vuelvo a casa a comer en media hora, tiro pal curro otra vez, llego a casa a las 7 de la tarde, y entonces empieza mi tiempo libre... Y me pongo a programar, a hacer alguna demo porque es lo que me gusta, y el tiempo pasa rapidísimo y acaban siendo las 12 como ahora sin que realmente haya hecho demasiadas cosas... Bueno, la verdad es que sí, que he avanzado un buen trozo de una nueva cosilla que posiblemente quede bastante bien. ^^

Pero bueno, estos días han sido bastante interesantes. Publiqué una demo en XNACommunity mostrando unas de las técnicas más nuevas que se pueden ver hoy en día (sólo hay un juego comercial que lo implemente, y es el Crysis), el Screen-Space Ambient Occlusion. Resumiendo mucho, la técnica intenta simular en espacio imagen la atenuación de la luz ambiental debida a la propia geometría de la escena.

Aunque así no quede muy claro vale la pena echarle un vistazo, porque bien usada puede aumentar el realismo de la imagen de manera espectacular. Como ejemplo, AQUÍ hay un video mostrando la técnica tal y como se ha puesto en práctica en el juego de Crytek.

Y bueno, a continuación dejo un enlace a mi versión, que incluye el código fuente para que cualquiera pueda trastearlo o mejorarlo.


Aún así, como parece que para algunas personas el código no queda muy claro y al haber una ausencia casi absoluta de documentos que expliquen la técnica, estoy preparando un pequeño artículo explicando con cierto detalle los detalles de la implementación que he usado.

16 de abril de 2008

El siempre molón Motion Blur

Hace tiempo que sentía curiosidad por este efecto. Su definición según Wikipedia es:
Motion blur o "trazo confuso de movimiento" es el aparente movimiento a gran velocidad de objetos en una imagen quieta (fotografía) o una secuencia de imágenes como una película o animación.

Es decir, el típico difuminado que el ojo humano percibe al ver cosas que van muy rápido. Una cosa tan "tonta" puede hacer que una visualización que funciona a una tasa de 30 imágenes por segundo con motion blur tenga un aspecto mucho más realista que la misma funcionando a 60 sin este efecto.

Cuando empecé a mirarme cómo implementarlo, vi algunos métodos un poco "arcaicos" como por ejemplo guardar en una textura los frames anteriores al actual y hacer blending para ir mezclándolos entre ellos o usar el búfer de acumulación para conseguir un efecto parecido, pero los resultados eran bastante... feos.

Hoy en día, gracias a los ahora tan habituales shaders, se pueden conseguir efectos más sofisticados y con un resultado mucho más realista, sin que necesariamente eso signifique un coste de cálculo alto.

Precisamente el ejemplo que pondré más adelante aplica la técnica explicada en la presentación titulada "Stupid OpenGL Shader Tricks", de Simon Green. Este documento es bastante antiguo (2003) y creo que hoy en día hay técnicas que dan resultados mucho mejores (si no me equivoco, usando el Geometry Shader), pero el algoritmo que se explica es muy, muy sencilo y muy fácil de implementar.

Básicamente se trata de usar las matrices Model y View del frame actual y del anterior para generar un vector de velocidad en el vertex shader. Este vector se transforma al espacio imagen y se pasa al pixel shader para efectuar el blur en la dirección que marque. Sin más rollos (y además el código es bastante claro), el ejemplo lo podéis bajar haciendo click en la siguiente imagen:



En el ejemplo no se hace así, pero he comprobado que una manera de aplicar el efecto que queda bastante bien en muchas situaciones es guardar todas las velocidades de todos los objetos de la escena en una textura y hacer todo el blur como un paso de post-proceso sobre toda la pantalla (y creo que queda mejor haciendo el blur desde el pixel que se trata hacia el exterior, y no como se hace en la demo).


12 de abril de 2008

el g0e strikes back!

He vuelto! Hace tiempo que abrí este blog para poner las cosas que iba aprendiendo, pero lo dejé abandonado por culpa del proyecto de fin de carrera, el trabajo, y otras cosas que pertenecen a la llamada Vida Real™.

Ahora me he vuelto a poner en serio, e intentaré actualizar de forma periódica con demos y ejemplos que realizo en mi escaso tiempo libre.

Espero que sean de ayuda para alguien.