Dispersão atmosférica no The Blacksmith

No início da fase de planejamento do The Blacksmith, sabíamos que queríamos uma solução de dispersão atmosférica que nos proporcionasse um pouco mais de detalhes e controle do que as opções de neblina incorporadas. Em especial, queríamos enfatizar o efeito de perspectiva aérea em algumas das tomadas mais amplas do filme.

Quando começamos a trabalhar em uma solução de dispersão para o projeto, inicialmente implementamos e brincamos com os modelos de simulação apresentados em vários artigos de Tomoyuki Nishita[1]. Após algumas experiências e protótipos de diferentes tomadas, decidimos que seria melhor buscar um modelo que permitisse amplo controle artístico para cada uma das tomadas do curta-metragem. Queríamos uma solução que nos permitisse chegar perto dos elementos primários dos modelos físicos, mas que também nos permitisse quebrar toda e qualquer regra quando necessário. Também precisávamos que a solução não tivesse um grande impacto no desempenho do tempo de execução do curta-metragem, e definimos como objetivo poder fazer a maioria dos cálculos por vértice, em vez de por pixel.
Estabelecemos a meta de tentar emular os efeitos combinados da dispersão de Rayleigh e Mie a partir dos modelos físicos. Também adicionamos um terceiro elemento que representa vários tipos de efeitos de dispersão de baixa altitude, coletivamente denominados dispersão de altura. Outra divergência importante em relação aos modelos baseados em física foi o fato de termos decidido continuar usando texturas de céu HDR, em vez de gerar processualmente o céu e as nuvens. A desvantagem óbvia disso é que a configuração de algo como a hora dinâmica do dia (que não foi necessária para o The Blacksmith) se torna um pouco mais complicada, enquanto a principal vantagem é manter o controle artístico total sobre o céu.
Dispersão de Rayleigh
A dispersão de Rayleigh da luz solar na atmosfera é a razão da tonalidade azul brilhante do céu durante o dia e do avermelhamento do sol e do horizonte ao nascer e ao pôr do sol.
Em nossa emulação, omitimos o próprio sol e nos concentramos apenas em modelar as cores e a extinção produzida pela entrada e saída da luz solar. Uma representação visual do sol pode ser adicionada na textura do céu, como parte da dispersão de Mie, como um sprite de clarão solar ou qualquer combinação dessas opções. Em seu núcleo mais simples, a densidade de nosso espalhamento de Rayleigh se resume a uma função exponencial glorificada modulada pela função de fase de Rayleigh. No entanto, temos algum controle adicional sobre os dados que são inseridos nele e sobre os dados que extraímos dele. Como não modelamos a luz de diferentes comprimentos de onda viajando pela atmosfera, as densidades que calculamos são valores escalares. Usamos uma rampa de cores HDR para permitir diferentes tons de luz dispersa no horizonte e em direção ao zênite, e usamos uma função de reconhecimento de distância para compor o tom final.

Dispersão de Mie
A dispersão da luz solar na atmosfera contribui para o halo brilhante ao redor do sol, a aparência cinza-esbranquiçada das nuvens e a névoa que pode ser vista em cidades poluídas. Ao contrário do Rayleigh, que dispersa a luz em uma forma quase uniforme, o espalhamento Mie é fortemente direcional para a frente.
Em nossa emulação, deixamos que a dispersão de Mie representasse principalmente a névoa e o halo ao redor do sol. Por isso, quase sempre o tingimos para compensar o fato de que nossa emulação Rayleigh ignora o sol. Tecnicamente, nossas funções Rayleigh e Mie são muito semelhantes, com a diferença significativa sendo a função de fase que é aplicada à saída. Como muitas outras implementações, usamos a função de dispersão Henyey-Greenstein para controlar a anisotropia - ou direcionalidade direta - da dispersão Mie.

As pessoas que leram os documentos de pesquisa podem zombar da nossa escolha de nomes, já que tomamos certas "liberdades" no que incluímos em cada uma das emulações. Descobrimos logo no início que as pessoas geralmente usavam o nome Rayleigh quando descreviam a "dispersão do céu" e Mie quando descreviam a "névoa solar", então decidimos continuar usando esses nomes mesmo depois que os modelos de implementação foram simplificados a partir dos modelos físicos.
Dispersão de altura
O elemento de dispersão de altura representa uma mistura de vários efeitos de dispersão de baixa altitude, incluindo neblina de radiação, neblina de solo e nuvens baixas.
Nossa implementação da dispersão de altura é bastante simples; a densidade de altura é calculada a partir de um nível do mar definido e da queda de altura. Isso, então, dimensiona a densidade exponencial baseada em distância, e tudo é tingido com a cor desejada.

Oclusão de dispersão
Como nossa contribuição de dispersão é causada principalmente pela dispersão da luz solar em direção ao observador, para longe do observador ou sendo absorvida por partículas a caminho do observador, faz sentido que algo esteja acontecendo se os objetos estiverem bloqueando a luz do sol.
Para lidar com esses casos, percorremos o mapa de sombras em cascata da luz direcional e acumulamos a quantidade de oclusão ao longo do raio em um buffer reduzido e fora da tela. Ao aplicar a dispersão ao pixel de saída, aumentamos a amostragem desse mapa de oclusão com um filtro sensível à borda e o usamos para compor a cor final do pixel. Como nossa solução é de dispersão única, não podemos simplesmente mascarar toda a luz dispersa, pois isso nos deixaria com uma imagem muito escura e não natural. Também não queríamos expandir a solução para lidar com a dispersão múltipla, que é mais complexa e cara. No final, a solução para nós foi inventar um "fator indireto" em que você poderia simplesmente designar explicitamente uma determinada porcentagem de dispersão para ser tratada como se fosse indireta em vez de direta.

Juntando tudo
Tudo o que resta agora é combinar os diferentes elementos para compor a imagem final. A adição dos elementos Rayleigh, Mie e Height nos permite começar com uma boa composição das diferentes cores de dispersão.

Em seguida, precisamos nos certificar de que esse buffer de oclusão seja bem utilizado. Usamos parâmetros de força diferentes para ajustar a quantidade de oclusão aplicada à dispersão direta, indireta, de nuvens e do céu.

Por fim, a única coisa que resta é misturar a dispersão com a imagem renderizada. Escurecemos a imagem transmitida pela extinção total acumulada e a clareamos pela dispersão total acumulada. Isso produz a composição final de nossas cenas de exemplo.

Extraímos a dispersão atmosférica para um projeto separado, que você pode obter na Asset Store. Além de todo o código e dos shaders que compõem a solução, o projeto também contém todas as predefinições de configuração usadas para gerar as imagens desta postagem. Não se esqueça de consultar o leia-me incluído para obter detalhes sobre o significado das diferentes opções de configuração.
Referências:
[1]: Exibição da Terra levando em conta o espalhamento atmosférico
https://nishitalab.org/user/nis/cdrom/sig93_nis.pdf
[1]: Método de exibição da cor do céu levando em conta a dispersão múltipla
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5595&rep=rep1&type=pdf
[1]: Exibição de nuvens levando em conta o espalhamento anisotrópico múltiplo e a luz do céu
https://www.researchgate.net/publication/220720838_Display_of_Clouds_Taking_into_Account_Multiple_Anisotropic_Scattering_and_Sky_Light
O céu HDR no pacote é de NoEmotionHDRs (Peter Sanitra) / CC BY-ND 4.0. Usado sem modificações.
