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.
Respostas:
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
fonte