Originalmente ordenado por The Guardian
Mig, creo ke ya tenés una tarea más sobre el tema de DOOM III, o no? Investigá y nos contás.
Suertex
A partir de la documentación del SDK de Direct3D, he construido esta breve exposición de como se obtiene la iluminación en las aplicaciones 3D en tiempo real, no es nada del otro mundo, seguro muchos ya saben todo esto, pero es una explicación con dibujitos!
En la naturaleza, cuando la luz es emitida desde una fuente, esta es reflejada por millones de objetos antes de llegar al ojo humano, y en cada ocasión algo de esa luz es absorvida por la superficie en particular, enviada en direcciones aleatorias o dirigida hacia otras superficies. Obviamente, los cálculos requeridos para simular perfectamente el comportamiento de la luz consumen demasiado tiempo para los gráficos 3D en tiempo real.
En vez de eso, se trabaja con un acercamiento diferente: se determina para cada superficie que luces se reflejan en ella, y luego el color de cada la luz interactua matemáticamente con la superficie misma para crear el color que finalmente es colocado en la pantalla.
De hecho se trabaja con dos tipos de luces: las luces ambientales (que están en todo lugar) y las luces directas (provienen de una fuente y pueden crear sombras). Cada luz tiene diferentes propiedades, al igual que cada superficie, que también deben ser tenidas en cuenta.
Para no entrar en detalles, la parte más importante al calcular el color final en la pantalla es obtener el angulo entre la normal de la superficie (el vector que indica hacia donde está orientada) y el rayo de luz incidente. (Ver Dibujo 1)
Cuando el angulo es menor, la luz es más "fuerte" (afecta más el color final), y cuando el angulo es mayor, la luz es más "débil".
La forma más simple para obtener esa normal de la superficie, es que cada polígono tenga la suya propia. (Ver Dibujo 2). Esto provoca que todos los pixeles a lo largo de cada polígono tengan la misma intensidad de la luz, lo que no es muy realista.
Una variante más sofisticada, que se ha venido utilizando desde hace mucho rato, es que cada vertice (los puntos extremos de los polígonos) tuviera su propia normal, y así se calcula la iluminación para cada extremo. (Ver Dibujo 3)
¿Cómo se obtiene entonces la intensidad de luz para cada pixel dentro del polígono? Esta se obtiene mediante interpolación, es decir, de acuerdo a la distancia del pixel a cada uno de los vertices.
Ahora viene lo bueno. Desde casi el origen de los gráficos 3D en tiempo real, las texturas se han venido utilizando para agregar más detalle a los polígonos, en forma de imágenes que se "dibujan" encima (por decirlo de algún modo) de estos. Pero ... ¿qué tal si además de guardar el color de cada pixel en la textura, guardamos la normal de la superficie en ese punto? Pues eso mismo son los bump maps!. De este modo, prácticamente lo que estamos haciendo es guardar también el "relieve" de la superficie en la textura y obtenemos una cantidad de detalles increibles (con la iluminación calculada para cada pixel)
sin aumentar la cantidad de polígonos. (Ver Dibujo 4)
En Doom III los artistas crean modelos super-detallados (con una cantidad de polígonos similar a la que se trabaja en el cine) y con base en estos se generan los mapas de normales (o bump maps) que luego se aplicaran más tarde en el juego, en tiempo real, sobre versiones con menos polígonos de los mismos modelos.
Bueno, y qué vienen a hacer los pixel shaders? Estos son programas que son ejecutados por el procesador gráfico de la tarjeta de video, para hacer todas estas cosas mucho más rápido. Para obtener bump mapping
no se necesita tener pixel shaders (de allí, que funcione con una GeForce 2 GTS), pero son prácticamente indispensables para que todo funcione a una buena velocidad y con una buena calidad.
Las sombras no está involucradas con los bump maps, son una historia aparte, que deberá ser narrada en otra ocasión.