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.