Volúmenes de propagación de luz: filtrado anisotrópico de datos de volumen

9

He implementado el algoritmo de volúmenes de propagación de luz en cascada (sin sombreado indirecto todavía) para la iluminación global difusa en tiempo real detallada aquí y aquí . Funciona bien, pero todavía estoy tratando de arreglar un artefacto en particular.

Breve resumen

Puede omitir esto si ya sabe cómo funciona el algoritmo.

El algoritmo funciona almacenando información de iluminación en forma de armónicos esféricos en una cuadrícula 3D, donde inicialmente los datos en cada celda de la cuadrícula provienen de la representación de un mapa de sombra extendido ( mapa de sombra reflectante) que también incluye el color y la información normal, además de la profundidad. La idea es que esencialmente todos los píxeles vistos por una fuente de luz son la causa del primer rebote de iluminación indirecta, por lo que almacena la información requerida junto con el búfer de profundidad ordinario que usa para el mapeo de sombras, y muestrea todos los datos para inicializar la cuadrícula 3D . La información en la cuadrícula 3D luego se propaga iterativamente (para cada iteración) propagando la información en una celda a todos sus 6 vecinos directos (arriba, abajo, izquierda, derecha, arriba, abajo). Para iluminar la escena utilizando la información en la cuadrícula, aplica un pase de pantalla completa sobre su escena, y para cada píxel rasterizado tiene disponible la posición del espacio mundial de la superficie rasterizada (por ejemplo, de G-Buffers en sombreado diferido), de modo que saber a qué celda de la cuadrícula pertenece un determinado píxel en la pantalla.

Esto funciona bien en su mayor parte, aquí hay dos imágenes sin GI simulado y solo un término ambiental codificado, y al lado una imagen con el algoritmo LPV. Observe reflejos de colores en las superficies, mejor detalle de profundidad, etc.

ingrese la descripción de la imagen aquí

Problema

Al buscar las celdas durante la etapa de iluminación, se utiliza la interpolación trilineal (utilizando filtros de textura de hardware) para interpolar suavemente los datos entre el centro de una celda, sus celdas vecinas y la coordenada de textura buscada real. Esencialmente, esta interpolación imita la propagación de la información de iluminación en el centro de una celda a los píxeles concretos alrededor del centro donde se busca la información. Esto es necesario porque de lo contrario la iluminación se vería muy áspera y fea. Sin embargo, dado que la interpolación trilineal no tiene en cuenta la dirección de propagación de la luz de la información de iluminación codificada en una celda (recuerde, está en armónicos esféricos), la luz puede propagarse incorrectamente al píxel buscado. Por ejemplo, si el resplandor codificado en la celda solo se propaga hacia (1,0,0) ("

Esto ocasiona que la luz se filtre incorrectamente a través de las paredes cuando el tamaño de las celdas en la cuadrícula es grande en comparación con las superficies de la escena (esto es necesario porque se necesitan celdas grandes para propagar la luz en la escena con la menor cantidad de iteraciones de propagación posible). Esto es lo que parece:

ingrese la descripción de la imagen aquí

Como puede ver (desde los contornos de sombra en la parte superior derecha), la escena está iluminada por una fuente de luz direccional en algún lugar por encima de la escena, en la parte superior izquierda. Y dado que solo hay una celda que separa el exterior de la aurícula y el interior, la luz se filtra y la pared a la izquierda se ilumina incorrectamente.

Pregunta real

El autor sugiere una forma de filtrado anisotrópico manual para solucionar esto. Da un gradiente de radiancia (supongo que los coeficientes SH muestreados desde la celda actual) hacia la dirección de la superficie normal n como:

ingrese la descripción de la imagen aquí

Y estados

Por lo tanto, al comparar la derivada direccional de radiación con la dirección de radiación real, se puede calcular si la distribución de radiación comienza más allá de su interpolación trilineal para este punto.

Mis preguntas):

En la ecuación, la función c (x) parece ser los coeficientes SH en el punto (x). Por lo tanto, el gradiente de radiancia parece calcularse como un derivado numérico normal como la diferencia ponderada de los coeficientes SH en los puntos x - (n / 2) y x + (n / 2). Sin embargo, ¿qué es c (x) en mi contexto? Actualmente estoy asumiendo que c (x) se refiere a los coeficientes interpolados trilinealmente en la ubicación de la superficie (x), pero no estoy seguro en absoluto, ya que no sé cómo se supone que eso le dará más información sobre el direccional distribución de los coeficientes SH.

¿Y cómo se usa ese gradiente para cambiar exactamente cómo se aplica la iluminación muestreada desde la celda a las superficies, exactamente? El autor simplemente escribe "comparando la derivada direccional del resplandor con la dirección del resplandor real", pero esto es bastante vago.

Menciona el uso de un "esquema de diferenciación central" y hace referencia a estas diapositivas para la diferenciación central de los coeficientes SH, y también hace referencia a este documento que muestra las derivaciones del gradiente, pero en este momento no puedo sacar ninguna conclusión útil de ellos.

TravisG
fuente

Respuestas:

4

La diferencia central ha sido introducida por un artículo de AMD cuando hicieron una demostración con crystal volando en un túnel, de memoria.

La cfunción no tiene que ser algo preciso, solo una idea de, por ejemplo, luminosidad, así que solo evalúe el SH utilizando su normal actual.

Entonces, lo que haces con eso es que bajas el tono, usando un factor empírico, la radiación usando este diferencial. Pero solo se baja si el diferencial implica que el flujo de luz se aleja de su normal actual.

Básicamente, la idea es detectar empíricamente el hecho de que si vas en la dirección opuesta a la normal de tu pared, el flujo de luz disminuye lentamente, ya que se propaga en el aire (en el otro lado). Pero si explora un poco por delante de lo normal, notará una caída repentina de flujo, lo que significa que la celda que está muestreando ahora es en realidad una fuga.

He descubierto que funciona en el 70% de los casos, pero si se aplica descuidadamente, puede crear efectos de agujeros negros muy extraños o cambios de tono (rosa, verde ...) en áreas muy oscuras que contienen una fuga de luz de otro lado. Esto se debe a que tiene 3 LPV para cada color, la diferencia central tiende a dar resultados diferentes. Si es capaz, intente usar la ligereza en escala de grises para evaluar el amortiguador de diferencia central, y luego use un factor de reducción común para todos los canales de color.

Sin este truco, normalmente no deberías obtener mucho brillo de todos modos, porque lo normal que usas para evaluar el SH se opone a la dirección del flujo. Sin embargo, como notará, las SH de 2 bandas utilizadas en LPV no son suficientes, y tienen un fuerte componente de CC que proporciona estas poderosas fugas. Esta es la razón por la cual LPV no es práctico para geometrías que no están estrictamente controladas por un artista que tenga LPV, ya que le dará a cada pared un espesor mínimo para reducir las fugas.

Además, algunas empresas (como Square Enix) usan muros bloqueadores diseñados manualmente para eliminar las fugas, como el volumen de geometría debería proporcionarle. (el volumen de la geometría ayuda a reducir las fugas, pero la retroproyección RSM para voxelizar la escena es demasiado parcial en la mayoría de los casos y crea alias al nivel de la celda LPV, lo que le da a las fugas un aspecto aún peor porque varían la intensidad de manera extraña).

Solo puede aspirarlo e intentar mitigar los problemas dándole al LPV una palabra final menos fuerte en la luz indirecta final, use un término constante con un peso (0.5?) Y el LPV podría contribuir al 0.5 restante del indirecto ligero. También intente implementar el volumen de geometría, disminuirá el problema. Y finalmente la diferencia central.

v.oddou
fuente
Como una mejora de más del 50% del ambiente constante, se puede utilizar una técnica llamada "ambiente BRDF" (por tri-Ace).
v.oddou