Mapas de sombras reflectantes: parte 1

imagen

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.

imagen
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.

imagen
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.

imagen
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.

imagen
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.

imagen
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 .

Opcional
La 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 .

Source: https://habr.com/ru/post/440488/


All Articles