Estou começando com o GLSL e implementei sombreamento diferido simples que gera buffer G com posições, normais e albedo.
Também escrevi um sombreador de luz pontual simples.
Agora eu desenho uma esfera para o ponto de luz e a saída entra em um buffer de iluminação.
O problema é: como combinar os resultados do buffer de iluminação ao desenhar várias luzes?
Por exemplo, quando estou desenhando a segunda luz no buffer de luz usando o shader de luz pontual, como adiciono a primeira luz à segunda luz no buffer de iluminação. Quero dizer, você não pode ler e escrever no mesmo buffer de saída?
opengl
shaders
glsl
deferred-rendering
JBeurer
fonte
fonte
Para o meu renderizador diferido, agrego todas as luzes em um alvo de renderização de luz usando as informações do buffer g e, em seguida, mostro a amostra que renderiza o alvo para a intensidade da luz enquanto cria minha imagem final de backbuffer.
Então, basicamente, eu corro toda a minha geometria do jogo através do meu passe de geometria para criar os g-buffers. A partir daí, alimento os buffers G ao meu shader de passagem de luz. Cada luz é percorrida no passe usando um quad em tela cheia. Dessa forma, meu pixel shader pode calcular a intensidade da luz para todas as superfícies visíveis do buffer g e adicioná-las ao alvo de renderização da luz. Você simplesmente adiciona a intensidade da luz de cada luz ao buffer de luz, mas certifique-se de fixar a intensidade de 0 a 1.
Tudo o que você precisa fazer para lidar com diferentes tipos de luzes (ponto, foco, paralelo) é tornar a luz mais robusta, possivelmente usando um buffer constante para designar quais procedimentos de iluminação executar.
fonte
Provavelmente, existe uma resposta melhor do que essa, mas eu sei que, se no seu sombreador você repetir o código necessário para fazer uma segunda luz, poderá processar duas luzes em um único objeto em vez de um. Exige muito código para a segunda luz e parece um pouco redundante, mas sei que funciona. No entanto, acredito que, como alguém espera apontar para você, pode haver uma solução mais elegante.
fonte