Efectos visuales renderizando en texturas

He conseguido algunos avances en el motor 3d del Antares, como poder ver una cámara en un display del cockpit, bloom y environment mapping. Todo ello con la misma técnica, RTT.

RTT (Render To Texture) consiste en hacer que OpenGL dibuje sobre una textura en vez de sobre la pantalla principal. Después se puede usar esa textura libremente, y se pueden conseguir muchos efectos.

Por ejemplo, si representas la escena vista por una cámara del juego, la textura obtenida se puede usar al dibujar un display, de forma que tienes un circuito cerrado de televisión simulado.

Pero también se pueden conseguir muchos otros efectos, por ejemplo efectos a pantalla completa tipo blur o bloom (crear un halo en las zonas más iluminadas de la pantalla). Esto se consigue representando lo que vas a ver en una textura, y luego usando esa textura en el programa shader del efecto, se genera la imagen final en pantalla. La imagen siguiente muestra un efecto de bloom (se nota el halo en los botones encendidos), aunque no está muy conseguido. Normalmente para hacer el bloom se usa una máscara de los objetos que quieres que tengan halo, pero yo la máscara la he cogido de la pantalla, escogiendo los pixels con luminosidad alta.

1 bloom

Otro efecto muy chulo que se puede hacer con RTT es el environment mapping, o sea el emulado de reflexiones reales. Supongo que sabrás que cuando te miras en un espejo plano, éste muestra la imagen de una “cámara virtual” situada por detrás del espejo, “en el mundo del espejo”, a la misma distancia que tú, y mirando hacia afuera. Pues si usamos esto con la RTT, podemos situar esa cámara virtual en el juego, detrás del espejo, y representar la escena en la textura. En un programa shader se usa luego esa textura para representar la superfície del espejo, teniendo en cuenta la posición del espejo, la cámara real y la textura renderizada, se consigue por ejemplo reflejos en la superfície del agua.

Este efecto de reflexiones en un espejo plano se puede usar incluso para agua con olas en relieve, con lo que varía la orientación de la superfície (su vector normal). Obviamente la reflexión ya no será completamente real, pero la desviación no es mucha ya que la variación de distancia de las olas con respecto a un objeto flotando, por ejemplo, es pequeña. Y parece mentira lo bien que puede quedar.

Incluso se puede extender este concepto y usarlo en objetos enteros, no sólo superfícies más o menos planas. Se hacen para esto no una, sino seis representaciones de cámaras virtuales, formando un cubo que envuelve el objeto espejo. Esto obviamente repercute en el framerate, bajando de 120 frames/s a 30 frames/s con un objeto reflectivo.

En la siguiente imagen de Antares y en el vídeo se puede ver la implementación que he hecho en Antares.

En esta imagen uno de los “chasis” es reflectivo y el otro no. Aunque el objeto en sí no es muy adecuado para verlo por los ángulos que tiene, se puede ver el objeto verde reflejado en el de la derecha.

3 environmentmapping

Para el vídeo he cogido un modelo de Internet del Halcón Milenario, fue cuestión de dos minutos importarlo. Quería encontrar el modelo de la nave de El vuelo del Navegante, pero no la encontré. En el cockpit de la nave, en el panel derecho, se ve la imagen de la cámara externa de la nave. Lo más bonito es cuando sales al espacio… (ponlo a pantalla completa, está en HD)

Hasta la próxima!