miércoles, 16 de junio de 2010

VISION 2.99 D

Alguien se acuerda de la revista billiken, cuando venía con los anteojos 3d?
En fin...cada tanto años la moda del 3d, como todas las modas, vuelve, esta vez renovada con las nuevas tecnologías, de la mano de películas como Avatar y de hardware especial que prometen una revolución en la forma en que vemos las imágenes.







Para no quedarse atras, y hacerle la competencia a Avatar (bueno mejor a la revista billiken de hace 20 años), queremos implementar el sistema de visión 3d, pero en un monitor común, con una placa de video común y con unos anteojos de cartón y plástico.

Primero hay que entender como funciona la sensación de profundidad en el sistema de visión humano (el fundamento de la vision estereoscópica).
Para ello: http://en.wikipedia.org/wiki/Stereoscopy

Resumiendo, la sensación 3D se produce porque el cerebro recibe una imágen distinta de cada ojo. Ambas imágenes levemente desfazadas se interpretan como información de profundidad. Para poder meter en la pantalla 2 imágenes distintas al mismo tiempo y que una vaya al ojo izquierdo y otra al derecho, se usan diferentes técnicas, una de las más comunes y baratas se llama "Complementary color anaglyphs", que consiste en generar 2 imágenes en colores complementarios, y eso combinado al filtro que tienen los lentes, permite que una imágen llegue a un ojo y la otra al otro ojo.

Implementación en DirectX

Nota: mis lentes de carton tienen el lado izquierdo rojo (R), y el otro cyan (GB = menos rojo). Hay otros que son azul y menos azul, etc..

El algoritmo es sumamente simple:


1- Hay que dibujar toda la escena desde el pto de vista del ojo izquierdo, eso se logra moviendo levemente la cámara unos "centímetros" para la izquierda, (se puede apuntar al mismo lugar o mover también el look at, yo estoy moviendo también el look at). Esta escena se dibuja a una textura, que la llamamos Imagen_Izq.
2- Despues, hay que hacer lo mismo pero para el ojo derecho, también en una textura que llamamos Imagen_Der
Hasta aca no dibujamos nada en la pantalla.
3- Por último, dibujamos 2 triángulos que ocupan toda la pantalla, a los efectos de que se llame un pixel shader especial, que ahora les muestro. Esta técnica de dibujar 2 triángulos tiene numerosas aplicaciones, especialmente en el procesamiento de imágenes 2d: detección de bordes, anti-aliasing, aplicar filtros etc. Los triángulos tienen que estar bien definidos de forma que cubran toda la pantalla, y que el shader se llame para cada punto. Como necesitamos la posición de pantalla, la podemos pasar como coordenadas uv de la textura.

// pixel shader para separar imagen ojo izquierdo / derecho
float4 LRSep(float2 screen_pos : TEXCOORD0) : COLOR
{
// separo en L/R
float4 color;
color.r = tex2D(Imagen_Izq, screen_pos).r;
color.gb = tex2D(Imagen_Der, screen_pos).gb;
color.a = 0;
return color;
}

La idea del PS es que en cada punto se combina el canal R de la imagen que va al ojo izquierdo con el canal GB de la otra imagen.

No hay comentarios:

Publicar un comentario