Mapas de Sombra Reflexiva: Parte 1

imagem

Olá Habr! Apresento a você a tradução do artigo "Mapas de Sombra Reflexiva", de Eric Polman.

Mapas de Sombra Reflexiva (RSM) é um algoritmo que estende o mapa de sombra "simples". O algoritmo leva em consideração a luz dispersa após o primeiro golpe na superfície ( difusa ). Isso significa que, além da iluminação direta, você obtém iluminação indireta. Neste artigo, analisarei o algoritmo de um artigo oficial para explicá-lo humanamente. Também falarei brevemente sobre o mapeamento de sombras .

Mapeamento de sombra


O Shadow Mapping (SM) é um algoritmo de geração de sombras. De acordo com o algoritmo, armazenamos a distância da fonte de luz ao objeto no mapa de profundidade. A Figura 1 mostra um exemplo de um mapa de profundidade. Ele armazena a distância (profundidade) de cada pixel.

imagem
Figura 1: Esta imagem mostra um mapa de profundidade. Quanto mais próximo o pixel, mais brilhante ele é.

Assim, quando você tem um mapa de profundidade em termos da fonte de luz, desenha a cena em termos da câmera. Para determinar se um objeto está aceso, verifique a distância da fonte de luz ao objeto. Se a distância para o objeto for maior que o valor armazenado no mapa de sombras (profundidade), o objeto estará na sombra. Isso significa que o assunto não deve ser iluminado. A Figura 2 mostra um exemplo. Você faz essas verificações para cada pixel.

imagem
Figura 2: A distância da fonte de luz ao pixel na sombra é maior que a distância armazenada no mapa de sombras.

Mapeamento de sombra reflexiva


Agora que você entende o conceito básico de Mapeamento de Sombra , continuaremos com o Mapeamento de Sombra Reflexiva (RSM). Esse algoritmo estende a funcionalidade dos mapas de sombra "simples". Além dos dados de profundidade , você também armazena a posição do espaço do mundo (no sistema de coordenadas mundiais), o espaço do mundo normal e o fluxo (saída de luz). Vou explicar por que você precisa desses dados.

Dados


Posição no espaço mundial


No espaço mundial do RSM , a posição deve ser armazenada para determinar a distância entre os pixels. Isso é útil para calcular a atenuação da luz. A luz diminui (fica menos concentrada) quando uma certa distância passa. A distância entre dois pontos no espaço é usada para calcular a intensidade da luz.

Normal


As normais (espaço do mundo) são usadas para calcular o reflexo da luz de uma superfície. No caso do RSM, eles também são usados ​​para determinar se um determinado pixel é uma fonte de luz para outro pixel. Se os dois normais praticamente coincidirem, eles não se darão muita luz refletida.

Fluxo Luminoso (Fluxo Luminoso)


Fluxo é a intensidade da luz de uma fonte de luz. Sua unidade de medida é lúmen , um termo que você pode ver atualmente nas embalagens de lâmpadas. O algoritmo armazena o fluxo para cada pixel enquanto um mapa de sombras é desenhado. O fluxo é calculado multiplicando a intensidade da luz pelo coeficiente de reflexão. Para luz direcional, você obtém uma imagem uniformemente iluminada. Para a luz do ponto, você também considera o ângulo de incidência. A atenuação e o cosseno receptor (entre o vetor normal e o vetor de luz) não são levados em consideração, pois isso é levado em consideração quando você considera a iluminação indireta. Este artigo não cobrirá os detalhes. A Figura 3 mostra as texturas para a luz do ponto de um artigo oficial.

imagem
Figura 3: As quatro placas contidas no RSM são representadas. Da esquerda para a direita: mapa de profundidade, posição do espaço no mundo, normal no espaço no mundo, fluxo.

Aplicação de dados


Agora que os dados são gerados (teoricamente), é hora de aplicá-los à imagem final. Quando você desenha a imagem final, calcula o efeito de cada fonte de luz em cada pixel. Além de simplesmente iluminar pixels usando fontes de luz, agora você também usa o Reflective Shadow Map .

Uma abordagem ingênua para calcular a contribuição da iluminação é passar por todos os texels no RSM . Você verifica se a luz do texel no RSM atinge o pixel que você está contando. Isso é feito usando posições do espaço no mundo e espaço no mundo normal. Você calcula a direção da posição do espaço no mundo no RSM texel para o pixel. Em seguida, compare-o ao normal usando o produto escalar de vetores. Qualquer valor positivo significa que o pixel deve ser iluminado usando fluxo , que é armazenado no RSM . A Figura 4 mostra esse algoritmo.

imagem
Figura 4: Demonstração da contribuição da iluminação indireta com base nas posições e normais do espaço mundial.

Os mapas de sombra (e RSMs ) são inerentemente grandes (512x512 = 262144 pixels), portanto, verificar cada texel está longe de ser o ideal. Em vez disso, é melhor fazer um certo número de amostras no mapa. O número de amostras depende da potência do seu hardware. Um número insuficiente de amostras pode produzir artefatos, como listras ou tremulação.

Os texels que mais afetam o resultado da iluminação estão mais próximos do pixel calculado. O método de amostragem, que coleta a maioria das amostras próximas às coordenadas de pixel, fornecerá melhores resultados. Este método é chamado de "amostragem de importância" . O artigo oficial descreve que a densidade de amostragem diminui com o quadrado da distância do pixel que estamos calculando.

Também precisamos dimensionar a intensidade das amostras, levando em consideração um fator que depende da distância. Isso se deve ao fato de os têxteis localizados mais longe, embora sejam amostrados com menos frequência; na realidade, eles afetam a mesma quantidade de fluxo. Portanto, em pixels distantes, você precisa aumentar a intensidade para suavizar a desigualdade, mantendo um pequeno número de amostras. A Figura 5 mostra como isso funciona.

imagem
Figura 5: Amostragem de importância. Mais amostras são coletadas do centro e as amostras são dimensionadas por um fator com base em sua distância do ponto central. Adaptado de um artigo sobre RSM .

Opcional
A projeção do pixel atual no mapa de sombras é tomada como ponto (s, t). E as coordenadas de amostragem relativas a (s, t) são calculadas antecipadamente e transferidas para o sombreador como uma matriz.

Você deve tratar a amostra como uma fonte pontual de iluminação. Você usa o valor do fluxo como cor da luz e apenas as fontes de luz opostas ao pixel.

Conclusão


O artigo oficial discute com mais detalhes outras otimizações desse algoritmo, mas vou me debruçar sobre isso. A seção Interpolação de espaço de tela descreve como você pode aumentar a produtividade, mas acho que a amostragem de importância será suficiente para começar.

A segunda parte apresenta a implementação do RSM .

Source: https://habr.com/ru/post/pt440488/


All Articles