Iluminação rápida com várias luzes

10

Como posso implementar iluminação rápida com várias luzes?

Não quero restringir o jogador, ele pode colocar um número ilimitado e, possivelmente, luzes sobrepostas no nível.

O problema é que os shaders que contêm loops dinâmicos que seriam necessários para calcular a iluminação tendem a ser muito lentos.

Eu tinha a ideia de que, se fosse possível compilar um sombreador em n vezes, onde n é o número de luzes. Se o número n for conhecido em tempo de compilação, os loops poderão ser desenrolados automaticamente. É possível gerar n versões do mesmo shader com apenas um número diferente de luzes?

Em tempo de execução, eu poderia decidir qual sombreador usar para qual parte do nível.

codymanix
fonte
Se as luzes são adicionadas dinamicamente pelo jogador, como um sombreador de "compiletime" pode ser a resposta correta?
Seth Battin
Como escrevi, o compilador poderia gerar shaders para 1,2,3, .. luzes e em tempo de execução que eu pudesse decidir qual usar para que parte do nível
codymanix
tempo de compilação shaders precisa saber onde as luzes vão ser colocados, qualquer dynamicness das luzes vai arruiná-los
catraca aberração
apenas o número de luzes deve ser dinâmico. as posições serão fornecidas como parâmetro.
Codymanix 18/10/2013
1
Parece que você tem sua resposta. Você sabe o número máximo de luzes e o intervalo de posições possíveis.
ashes999

Respostas:

8

Acredito que o que você está procurando se chama Renderização Adiada. É uma técnica de renderização que escala extremamente bem com muitas luzes, tão bem que pode ser usada para iluminação indireta dinâmica. Isso significa milhares de luzes na tela.

É basicamente uma técnica na qual você primeiro processa todos os seus dados de geometria (posição, normal, profundidade) em um buffer de pixel intermediário (chamado G-Buffer). Em uma segunda passagem, você renderiza uma forma clara junto com seus parâmetros. O sombreador dessa segunda passagem pega as informações do G-Buffer, aplica o cálculo da luz e as mistura na imagem final.

Você pode encontrar detalhes da implementação aqui

akaltar
fonte