
Hola Habr! Les presento la traducción del artículo
"Mapas de sombras reflectantes" de Eric Polman.
Reflective Shadow Maps (RSM) es un algoritmo que extiende el
mapa de sombras "simple". El algoritmo tiene en cuenta la luz dispersada después del primer golpe en la superficie (
difusa ). Esto significa que además de la iluminación directa, obtienes iluminación indirecta. En este artículo, analizaré el algoritmo de un
artículo oficial para explicarlo humanamente. También hablaré brevemente sobre el
mapeo de sombras .
Mapeo de sombras
Shadow Mapping (SM) es un algoritmo de generación de sombras. Según el algoritmo, almacenamos la distancia desde la fuente de luz hasta el objeto en el mapa de profundidad.
La Figura 1 muestra un ejemplo de un mapa de profundidad. Almacena la distancia (profundidad) para cada píxel.
Figura 1: Esta imagen muestra un mapa de profundidad. Cuanto más se acerca el píxel, más brillante es.Por lo tanto, cuando tiene un mapa de profundidad en términos de la fuente de luz, dibuja la escena en términos de la cámara. Para determinar si un objeto está encendido, verifica la distancia desde la fuente de luz hasta el objeto. Si la distancia al objeto es mayor que el valor almacenado en
el mapa de sombras (profundidad), el objeto está en la sombra. Esto significa que el sujeto no debe encenderse.
La figura 2 muestra un ejemplo. Realiza estas comprobaciones para cada píxel.
Figura 2: La distancia desde la fuente de luz hasta el píxel en la sombra es mayor que la distancia almacenada en el mapa de sombras.Mapeo de sombras reflectantes
Ahora que comprende el concepto básico de
mapeo de
sombras , continuaremos con el
mapeo de sombras reflectantes (RSM). Este algoritmo extiende la funcionalidad de los
mapas de sombra "simples". Además de los datos de
profundidad , también almacena la posición del espacio mundial (en el sistema de coordenadas del mundo), las
normales del espacio mundial y el
flujo (salida de luz). Explicaré por qué necesitas estos datos.
Datos
Posición del espacio mundial
En
RSM world-space, la posición debe almacenarse para determinar la distancia entre los píxeles. Esto es útil para calcular la atenuación de la luz. La luz se desvanece (se vuelve menos concentrada) cuando pasa una cierta distancia. La distancia entre dos puntos en el espacio se usa para calcular la intensidad de la luz.
Normal
Las normales (mundo-espacio) se utilizan para calcular la reflexión de la luz desde una superficie. En el caso de
RSM, también se utilizan para determinar si un píxel dado es una fuente de luz para otro píxel. Si las dos normales prácticamente coinciden, no se darán mucha luz reflejada.
Flujo luminoso (flujo luminoso)
El flujo es la intensidad de la luz de una fuente de luz. Su unidad de medida es la
luz , un término que actualmente se puede ver en los paquetes de bombillas. El algoritmo almacena
flujo para cada píxel mientras se dibuja un mapa de sombra.
El flujo se calcula multiplicando la intensidad de la luz por el coeficiente de reflexión. Para
luz direccional, obtienes una imagen uniformemente iluminada. Para la
luz puntual, también tiene en cuenta el ángulo de incidencia. La atenuación y el coseno receptor (entre el vector normal y el vector de luz) no se tienen en cuenta, ya que esto se tiene en cuenta cuando se considera la iluminación indirecta. Este artículo no cubrirá los detalles.
La Figura 3 muestra las texturas para la
luz puntual de un artículo oficial.
Figura 3: se representan las cuatro tarjetas contenidas en RSM . De izquierda a derecha: mapa de profundidad, posición del espacio mundial, normal del espacio mundial, flujo.Aplicación de datos
Ahora que los datos se generan (teóricamente), es hora de aplicarlos a la imagen final. Cuando dibuja la imagen final, calcula el efecto de cada fuente de luz en cada píxel. Además de simplemente iluminar píxeles usando fuentes de luz, ahora también usa el
Mapa de sombras reflectantes .
Un enfoque ingenuo para calcular la contribución de la iluminación es pasar por todos los texels en
RSM . Verifica si la luz del texel en el
RSM alcanza el píxel que está contando. Esto se hace usando posiciones del espacio mundial y el espacio mundial normal. Calcula la dirección desde la posición del espacio mundial en el texel
RSM hasta el píxel. Luego lo compara con lo normal usando el producto escalar de vectores. Cualquier valor positivo significa que el píxel debe iluminarse utilizando
flujo , que se almacena en
RSM .
La figura 4 muestra este algoritmo.
Figura 4: Demostración de la contribución de la iluminación indirecta basada en posiciones y normales del espacio mundial.Los mapas de sombras (y los
RSM ) son inherentemente grandes (512x512 = 262144 píxeles), por lo que verificar cada texel está lejos de ser óptimo. En cambio, es mejor hacer un cierto número de muestras del mapa. El número de muestras depende de cuán poderoso sea su hardware. Un número insuficiente de muestras puede producir artefactos como rayas o parpadeo.
Los texels que más afectarán el resultado de la iluminación son los más cercanos al píxel calculado. El método de muestreo, que recoge la mayoría de las muestras cerca de las coordenadas de píxeles, dará mejores resultados. Este método se llama
"muestreo de importancia" . El artículo oficial describe que la densidad de muestreo disminuye con el cuadrado de la distancia desde el píxel que estamos calculando.
También necesitamos escalar la intensidad de las muestras teniendo en cuenta un factor que depende de la distancia. Esto se debe al hecho de que los texels se ubican más lejos, aunque se muestrean con menos frecuencia, en realidad, afectan la misma cantidad de flujo. Por lo tanto, en píxeles distantes, debe aumentar la intensidad para suavizar la desigualdad, manteniendo un pequeño número de muestras.
La Figura 5 muestra cómo funciona esto.
Figura 5: Muestreo de importancia. Se toman más muestras del centro y las muestras se escalan por un factor en función de su distancia desde el punto central. Adaptado de un artículo sobre RSM .OpcionalLa proyección del píxel actual en el mapa de sombras se toma como el punto (s, t). Y las coordenadas de muestreo relativas a (s, t) se calculan de antemano y se transfieren al sombreador como una matriz.
Debe tratar la muestra como una fuente puntual de iluminación. Utiliza el valor de
flujo como
color de luz y solo aquellas fuentes de luz opuestas al píxel.
Conclusión
El
artículo oficial discute con más detalle sobre otras optimizaciones de este algoritmo, pero me detendré en esto. La sección
Interpolación de espacio de pantalla describe cómo puede aumentar la productividad, pero creo que el
muestreo de importancia será suficiente para comenzar.
La
segunda parte presenta la implementación de
RSM .