Sombreador simple para luces puntuales en niebla

Necesitaba un sombreador simple y rápido para crear niebla, iluminada por fuentes puntuales de luz. Para implementarlo, escribí el efecto del espacio de la pantalla, cuyos resultados se muestran a continuación. El transportador es casi tan simple como para las fuentes puntuales ordinarias. No requiere estructuras de volumen de datos, marcha de rayos, y se puede conectar fácilmente a un sombreador de iluminación existente.

El principio más importante es que puede calcular de forma cerrada la luz que emana de la niebla, como si estuviera iluminada por una fuente puntual de iluminación. Mi solución fue encontrar la fórmula y su sustitución en el sombreador.


Una pequeña escena con una nave espacial renderizada en la niebla usando mi técnica

La configuración básica

Modelo de niebla


El sombreador hace algunas suposiciones sobre la niebla con la que estamos trabajando. De hecho, considera cada fragmento de la niebla como una pequeña superficie de dispersión blanca translúcida.

  • El sombreador sugiere que la niebla dispersa la luz de manera uniforme en todas las direcciones. La niebla o el humo real no siempre tienen esta propiedad, pero esta es una buena aproximación a la imagen que buscamos.
  • Shader sugiere que todas las longitudes de onda de la luz interactúan con la niebla de la misma manera. En realidad, este no suele ser el caso. Por ejemplo, la dispersión de Rayleigh hace que el cielo sea azul, dispersando la luz azul más que otras longitudes de onda.
  • La luz que emana de la niebla varía según el cuadrado inverso de la distancia desde la fuente de luz hasta la niebla. En realidad, esto no sucede, pero parece normal. Hay muchos recursos que explican cómo la niebla realmente dispersa la iluminación, y estoy seguro de que puede complementar mi metodología con estas fórmulas.

Sin embargo. los resultados parecen plausibles incluso cuando se usan estas simplificaciones.

Solucion analitica


Deje que haya un fragmento infinitesimal de niebla (imagine un pequeño cubo de niebla). Entonces la luz emitida por este fragmento de niebla en mi sistema se verá así:

light=1(distance from light to fog fragment)2


Esta fórmula muestra que la iluminación proveniente de cada fragmento de la niebla disminuye a medida que el cuadrado inverso de su distancia a la fuente de luz, como es el caso de la iluminación que emana de una superficie que dispersa la luz.

Por conveniencia, reescribimos la ecuación:

d=distance from light to fog fragment


light=1d2


view linelight atxdx


O, si es más formal:

L=light position


w=world fragment position


c=camera position


light arriving at camera=cw1|xL|2dx



Esta integral expresa exactamente lo que necesitamos, pero su cálculo es más complicado de lo que necesitamos. Como todas las variables en la imagen de arriba son vectores con tres valores, esencialmente tenemos que lidiar con 12 variables. Eliminaré la mayoría de estas variables haciendo una simple reparametrización.

Definir un nuevo espacio llamado " espacio de luz "

  • El eje x es la línea de visión.
  • Eje Y para iluminación


Ahora, en lugar de una integral lineal en el espacio tridimensional, simplemente realizo la integración a lo largo del eje X desde la cámara a un fragmento del mundo. Luego necesitamos reescribir la integral. Distancia desde el puntox en el eje x de la fuente de luz esh2+x2 . Por lo tanto, la línea de visión integral toma la forma

1h2+x2dx


Resolviéndolo manualmente o en su sistema de álgebra de computadora favorito, obtenemos:

1h2+x2dx=tan1(xh)h


Es decir, para que la luz provenga de la niebla para una línea de visión determinada, calculo esta integral desde la cámara a un fragmento del mundo. Si la cámara está enx=a , y un fragmento del mundo en , entonces la iluminación que ingresa al píxel desde la niebla iluminada a lo largo de la línea de visión tiene la forma:x=b

ab1h2+x2dx=tan1(bh)htan1(ah)h


Reflexiones sobre la implementación


Logré implementar este sombreador en mi tubería de sombreadores retardados sin modificaciones importantes. Para hacer esto, fue necesario agregar unas diez líneas de código GLSL. Si el transportador ya calcula la iluminación especular difusa + con fuentes puntuales de luz, entonces el sombreador de la fuente puntual ya debería tener acceso a la posición de la cámara. la fuente de luz y el píxel actual en el mundo, ¡y eso es todo lo que necesitas!

Procesar múltiples fuentes de luz es muy simple. Es suficiente resumir simplemente el efecto de la dispersión de la luz por la niebla para cada fuente. Para que el sistema sea efectivo para múltiples fuentes, es necesario calcular la integral solo para los píxeles tan cercanos a la fuente de luz que puedan contribuir a la cantidad de luz visible en la escena. Por ejemplo, en una tubería de sombreador diferido, puede renderizar una malla esférica alrededor de una fuente de luz para que el sombreador solo calcule los efectos de la luz para los píxeles cerca de esa fuente.

Descubrí que la parte más difícil de la implementación de este sombreador es la ubicación correcta de la cámara y un fragmento del mundo en el espacio de iluminación, para que podamos usar la integral simplificada.

resultados



Genere mundos de bajo nivel con poca luz de niebla


Si hay más fuentes, el efecto se vuelve más fuerte.


Si también realiza un seguimiento de la información sobre la dirección de las fuentes de luz, puede crear una hermosa iluminación con figuras en la niebla

Lectura adicional


Introducción a la dispersión de la luz: una perspectiva de las ciencias de la imagen

Un modelo de dispersión analítica práctica para la representación en tiempo real

Algoritmo de dispersión atmosférica y niebla volumétrica parte 1

All Articles