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