Volumes de Propagação de Luz: Filtragem anisotrópica de dados de volume

9

Eu implementei o algoritmo Cascaded Light Propagation Volumes (sem sombreamento indireto ainda) para iluminação global difusa em tempo real, detalhada aqui e aqui . Funciona bem, mas ainda estou tentando consertar um artefato em particular.

Pequeno resumo

Você pode pular isso se você já sabe como o algoritmo funciona.

O algoritmo funciona armazenando informações de iluminação na forma de harmônicas esféricas em uma grade 3D, onde inicialmente os dados em cada célula da grade provêm da renderização de um mapa de sombras estendido ( mapa de sombras refletivas)) que também inclui informações normais e de cores, além de profundidade. A ideia é que essencialmente todos os pixels vistos por uma fonte de luz sejam a causa do primeiro ressalto da iluminação indireta, para que você armazene as informações necessárias juntamente com o buffer de profundidade comum usado para o mapeamento de sombras e prove todos os dados para inicializar a grade 3D. . As informações na grade 3D são propagadas iterativamente (para cada iteração) propagando as informações em uma célula para todos os seus 6 vizinhos diretos (acima, abaixo, esquerda, direita, cima, baixo). Para iluminar a cena usando as informações na grade, você aplica uma passagem em tela cheia sobre a cena e, para cada pixel rasterizado, você tem a posição do espaço mundial da superfície rasterizada disponível (por exemplo, de G-Buffers em sombreamento diferido), para saber a qual célula da grade pertence um determinado pixel na tela.

Na maioria das vezes, isso funciona bem, aqui estão duas imagens sem IG simulado e apenas um termo ambiente codificado e, ao lado, uma imagem com o algoritmo LPV. Observe reflexos coloridos nas superfícies, melhores detalhes de profundidade, etc.

insira a descrição da imagem aqui

Problema

Ao procurar as células durante o estágio de iluminação, a interpolação trilinear (usando filtros de textura de hardware) é usada para interpolar suavemente os dados entre o centro de uma célula, suas células vizinhas e a coordenada real da textura pesquisada. Essencialmente, essa interpolação imita a propagação das informações de iluminação no centro de uma célula para os pixels de concreto ao redor do centro onde as informações são pesquisadas. Isso é necessário porque, caso contrário, a iluminação pareceria muito áspera e feia. No entanto, como a interpolação trilinear não leva em consideração a direção da propagação da luz das informações de iluminação codificadas em uma célula (lembre-se, é em harmônicos esféricos), a luz pode ser propagada incorretamente no pixel procurado. Por exemplo, se o brilho codificado na célula se propagar apenas em direção a (1,0,0) ("

Isso causa sangramento de luz incorretamente nas paredes quando os tamanhos das células na grade são grandes em comparação com as superfícies da cena (isso é necessário porque você precisa de células grandes para propagar a luz para a cena com o menor número possível de iterações de propagação). Isto é o que parece:

insira a descrição da imagem aqui

Como você pode ver (nos contornos das sombras no canto superior direito), a cena é iluminada por uma fonte de luz direcional em algum lugar acima da cena, no canto superior esquerdo. E como existe apenas uma célula que separa a parte externa do átrio e a parte interna, a luz sangra e a parede à esquerda é iluminada incorretamente.

Pergunta real

O autor sugere uma forma de filtragem anisotrópica manual para corrigir isso. Ele fornece um gradiente de radiância (estou assumindo os coeficientes SH amostrados da célula atual) em direção à superfície normal n como:

insira a descrição da imagem aqui

E estados

Assim, comparando a derivada direcional do esplendor com a direção real do esplendor, pode-se calcular se a distribuição do esplendor começa além da sua interpolação trilinear para este ponto.

Minhas perguntas):

Na equação, a função c (x) parece ser o coeficiente SH no ponto (x). Portanto, o gradiente de radiância parece ser calculado como um derivado numérico normal como a diferença ponderada dos coeficientes SH nos pontos x - (n / 2) e x + (n / 2). No entanto, o que é c (x) no meu contexto? Atualmente, estou assumindo que c (x) se refere aos coeficientes interpolados trilinearmente no local da superfície (x), mas não tenho certeza, pois não sei como isso deve fornecer mais informações sobre a direcional. distribuição dos coeficientes SH.

E como esse gradiente é usado para mudar exatamente como a iluminação amostrada da célula é aplicada às superfícies exatamente? O autor apenas escreve "comparando a derivada direcional do brilho com a direção real do brilho", mas isso é bastante vago.

Ele menciona o uso de um "esquema de diferenciação central" e faz referência a esses slides para a diferenciação central dos coeficientes SH, e também faz referência a este artigo que mostra as derivações do gradiente, mas, no momento, não consigo tirar conclusões úteis deles.

TravisG
fonte

Respostas:

4

A diferença central foi introduzida por um artigo da AMD quando eles fizeram alguma demonstração com cristais voando em um tunel, de memória.

A cfunção não precisa ser algo preciso, apenas uma idéia de, por exemplo, radiância, então apenas avalie o SH usando o seu normal atual.

Então o que você faz com isso é reduzir o tom, usando um fator empírico, o brilho usando esse diferencial. Mas você só diminui se o diferencial implica que o fluxo de luz se afasta do seu normal atual.

Basicamente, a idéia é detectar empiricamente o fato de que, se você for na direção oposta ao normal de sua parede, o fluxo de luz estará diminuindo lentamente, porque se propaga no ar (do outro lado). Mas se você sondar um pouco na frente do normal, notará uma súbita queda de fluxo, isso significa que a célula que você está amostrando agora é na verdade um vazamento.

Descobri que ele funciona em 70% dos casos, mas se aplicado descuidado, pode criar efeitos muito estranhos de buracos negros ou alterações de tonalidade (rosa, verde ...) em áreas muito escuras que contêm um vazamento de luz de outro modo. Isso ocorre porque você tem 3 LPV para cada cor, a diferença central tende a dar resultados diferentes. Se você for capaz, tente usar a luminosidade da escala de cinzentos para avaliar o amortecedor de diferença central e use um fator de redução comum para todos os canais de cores posteriormente.

Sem esse hack, normalmente você não deve receber muita radiação de qualquer maneira, porque o normal que você usa para avaliar o SH é contrário à direção do fluxo. No entanto, como você percebe, o SH de 2 bandas usado no LPV não é suficiente e possui um forte componente DC que fornece vazamentos poderosos. É por isso que a LPV é impraticável para geometrias que não são rigidamente controladas por um artista que reconhece a LPV, que dará a cada parede uma espessura mínima para reduzir vazamentos.

Além disso, algumas empresas (como a square enix) usam paredes de bloqueadores projetadas manualmente para eliminar os vazamentos, como o volume da geometria deve fornecer. (o volume da geometria ajuda a reduzir os vazamentos, mas a retroprojeção do RSM para voxelizar a cena é muito parcial na maioria dos casos e cria um alias no nível da célula LPV, o que dá aos vazamentos uma aparência ainda pior porque variam de intensidade estranhamente).

Você só pode sugá-lo e tentar mitigar os problemas, dando à LPV uma palavra final menos forte na luz indireta final, use um termo constante com um peso (0,5?) E a LPV poderia contribuir para os 0,5 restantes da indireta leve. Tente também implementar o volume da geometria, pois isso diminuirá o problema. E, finalmente, a diferença central.

v.oddou
fonte
como uma melhoria de mais de 50% do ambiente constante, uma técnica chamada "ambiente BRDF" (da tri-Ace) pode ser usada.
precisa saber é o seguinte