Sombras na renderização adiada

12

Eu li algum material sobre renderização adiada e acho que entendi bem. Mas o que eu não entendo é como ele realiza sombras. O buffer G, até onde sei, não envolve a criação de um mapa de sombras para cada luz, por isso estou confuso sobre como a passagem de iluminação está ciente de se cada pixel está ou não ocluído. Afinal, um determinado pixel que é visível da perspectiva da câmera pode não ser realmente visível da perspectiva de uma determinada luz - e que a geometria oclusiva pode não ser visível da perspectiva da câmera e, portanto, não tem nada escrito sobre ele no buffer G .

Se você começar a renderizar mapas de sombra, parecerá o mesmo que renderizar adiante - renderize toda a geometria da cena para cada luz renderizar os mapas de sombra.

Então, como a renderização diferida realiza sombras equivalentes à renderização direta?

DeadMG
fonte

Respostas:

14

O sombreamento adiado não faz nada de especial para sombras. Você ainda precisa renderizar os mapas de sombra normalmente e depois renderizar cada luz com o mapa de sombras apropriado vinculado como uma textura.

Ainda é melhor do que a renderização direta, porque você não precisa redesenhar a cena na vista principal para aplicar a iluminação. Desenhar o mapa de sombras geralmente é muito mais barato do que desenhar mais passagens na vista principal, porque você não precisa fazer nenhum sombreamento de pixel, e os mapas de sombras geralmente contêm menos da cena (é possível selecionar muito mais coisas).

Às vezes, as pessoas fazem "sombras diferidas" para uma luz, geralmente a principal luz direcional. O principal motivo para fazer isso é usar mapas de sombra em cascata ou outra abordagem que use vários mapas de sombra para a mesma luz. Você pode reservar um canal no buffer G para uma máscara de sombra (branco onde aceso, escuro onde sombreado) e aplicar todos os mapas de sombra em cascata nesse canal do buffer G; então o sombreador da luz apenas lê a máscara de sombra e a multiplica na cor clara. Isso é bom, pois separa as sombras do sombreamento, mas você ainda está desenhando todos os mesmos mapas de sombras.

Nathan Reed
fonte
1
Se você é extremamente inteligente, pode tentar usar um sombreador de geometria durante a criação do GBuffer para 'alinhar' a criação do mapa de sombras (como a amostra do DX10 do mapa de cubos). Não tenho certeza se isso foi feito, se é possível ou se seria mais lento no final - mas isso traria a criação de mapas de sombras mais perto do sombreamento adiado ou na definição, dependendo da sua religião.
Jonathan Dickinson
6

Bem, o que é um mapa de sombras? Um mapa de sombras é uma textura em que os texels respondem a uma pergunta simples: a que distância da luz, na direção representada pelo texel, a luz é ocluída? As coordenadas de textura são geradas usando vários meios projetivos de texturização, dependendo do algoritmo de mapeamento de sombra específico.

A texturização projetiva é simplesmente uma maneira de transformar um objeto no espaço da textura (e sim, eu sei que isso soa ao contrário. Mas é assim que funciona). Os algoritmos de mapeamento de sombra usam vários tipos diferentes de transformações. Mas, em última análise, essas são apenas transformações de um espaço para outro.

Ao renderizar o mapa de sombras, você pega os vértices de sua geometria e os transforma em um pipeline de renderização padrão. Mas a câmera e as matrizes de projeção foram projetadas para sua posição e direção da luz, não para a posição e orientação da vista.

Ao fazer a renderização direta com um mapa de sombras, você renderiza o objeto normalmente, transformando os vértices no espaço da câmera de visualização e através da matriz de projeção de visualização. No entanto, você também transforma os vértices através de sua câmera de luz e matrizes de projeção, passando-os como dados por vértice ao shader de fragmento. Utiliza-os através de texturas projetivas para acessar a textura da sombra.

Aqui está o ponto importante. O acesso à textura projetiva é projetado de modo que o local que ele acessa na textura represente a direção entre esse ponto na superfície (o ponto que você está renderizando no shader de fragmento) e a luz. Portanto, busca o texel que representa a profundidade em que a oclusão ocorre para o fragmento sendo renderizado.

Mas não há nada de especial nesse pipeline. Você não precisa transformar as posições do vértice na textura de sombra e passar essas para o shader de fragmento. Você pode passar as posições dos vértices do espaço do mundo para o sombreador de fragmentos e fazer com que o sombreador de fragmentos os transforme no espaço projetivo da textura de sombra. Concedido, você jogaria fora muito desempenho, pois criará exatamente as mesmas coordenadas de textura. Mas é matematicamente viável.

De fato, você pode passar as posições do vértice do espaço da câmera de exibição para o shader de fragmento. Poderia então transformá-los em mundo, depois em espaço de câmera leve e espaço de textura projetada de sombra. Você pode colocar toda essa transformação em uma matriz (dependendo do algoritmo de projeção de sombra). Novamente, isso fornece exatamente o que você tinha antes; portanto, ao renderizar adiante, não há razão para fazê-lo.

Mas na renderização adiada , você já tem as posições de vértice do espaço da câmera de exibição. Você precisa, caso contrário você não pode iluminar. Você desperdiçou muita memória e largura de banda gravando-os em um buffer, ou foi inteligente e os recalculou usando o buffer de profundidade e várias matemáticas (que não vou abordar aqui, mas é abordado online).

De qualquer maneira, você pode ver as posições no espaço da câmera. E, como afirmado acima, podemos aplicar uma matriz para transformá-las do espaço da câmera de visualização no espaço de textura projetada da sombra. Então ... faça isso. Então acesse seu mapa de sombras.

Problema resolvido.

Nicol Bolas
fonte
É possível excluir a geometria por luz na renderização adiada (por uma questão de otimização)?
Samaursa 02/02
@Samaursa: "Excluir geometria por luz" de quê? De ir para o mapa das sombras? De ser iluminado?
Nicol Bolas
Vejo que você respondeu à pergunta sobre isso, obrigado. Para outros, se eles quiserem seguir a pergunta / resposta: gamedev.stackexchange.com/q/178755/2287
Samaursa