Lidar com muitas luzes em uma cena (com shaders)

9

Estou curioso para saber como lidar com muitas luzes em uma cena. Dado um mapa muito grande em um RPG, com masmorras (com luzes lá dentro) etc. Eu sei sobre iluminação diferida, mas isso só responde como renderizar muitas luzes. Mas minha pergunta é mais: como não renderizar muitas luzes. É obviamente desejável renderizar apenas as luzes que afetam a cena, mas não conheço uma técnica / algoritmo para arquivar isso. Ninguém quer nem consegue render 500 pontos, apenas porque existe em algum lugar no mapa. Mas não se pode simplesmente pegar uma linha reta da luz para o jogador e testar se há algo no meio. A distância também não parece ser um bom indicador. (Luz solar?)

tl; dr: Como posso descobrir quais luzes afetam a cena para renderizá-las apenas?

blubb
fonte
OpenGL ou DirectX?
Kravemir
6
na verdade, 500 luzes seria perfeitamente possível com iluminação adiada, desde que você não quer sombras para todos eles;)
Por exemplo, para ligaduras pontuais e cônicas, você pode usar a seleção por ocultação - a luz dos pontos é apenas uma esfera. Luz direcional é visto de todos os lugares
Kikaimaru
4
@ Darkwings Você está basicamente descrevendo aqui o que o blubb pediu. Como ando? Bem, acho que a solução aqui é apenas andar! (Trabalhou para mim.) ;-) "você precisa saber se essa fonte está iluminando algo em sua opinião". <- É exatamente o que ele pede, ele quer saber como ele pode fazer isso. ^^ Embora a coisa do cone / esfera de Kikaimaru seja provavelmente útil.
Cooky451 28/05
11
Para o OP, não era óbvio verificar o frustum da vista, pois ele mencionou apenas a distância. Cada luz terá alguns parâmetros para determinar isso. Se luzes direcionais forem usadas, elas alcançarão todos os lugares, os holofotes terão uma zona de destino (para que possa ser resolvida com a interseção vetor-plano) e assim por diante. Você deve pensar mais sobre as linhas de quais luzes deseja afetar a cena, já que se você realmente tiver muitas luzes muito próximas umas das outras, será melhor se aproximar (para projeção de sombras). IE: 100 velas em um lustre antigo podem ser manuseadas como uma única luz.
Darkwings

Respostas:

5

Ainda mais simples que volumes delimitadores;

Atribua um raio a cada luz. Quando se trata de renderizar sua cena, basta verificar se a distância entre os objetos da cena e cada luz é menor que o raio da luz. Nesse caso, use a luz; caso contrário, pule-a.

Apenas uma fração mais complicada, dependendo da importância do desempenho:

Você também pode fazer uma espécie de verificação de fase ampla. Basta definir uma grade espacial que armazena alças para suas luzes em uma célula de grade e, em seguida, execute apenas a verificação de distância nas luzes que estão nas células dentro do raio máximo dos objetos da cena.

Suds
fonte
5
+1 - Parece suspeito como uma esfera delimitadora;)
Gyan aka Gary Buyn
Um pouco tarde ... enfim, essa é exatamente uma esfera delimitadora. Usando esse método, você ainda renderiza luzes que são completamente obscurecidas por paredes, etc. e, portanto, não são relevantes para a cena. Além disso, nem toda luz vai em todas as direções.
Darkwings
5

A maneira mais simples em que consigo pensar (vamos ser honestos, a única maneira que pensei) é dar a cada luz um volume delimitador . Se o volume delimitador cruzar com o perfil da vista (ou um volume delimitador do perfil da vista), aplique a luz.

Ainda pode haver luzes aplicadas, mesmo que elas não afetem nenhum objeto visível, mas é simples e rápido. A organização inteligente do seu gráfico de cena pode significar que apenas algumas verificações de interseção abatem a maioria de suas luzes (assim como o que é feito para a seleção de objetos).

Algo como o sol não pode ter volume delimitador (para indicar que ele sempre deve ser aplicado).

Gyan tcp Gary Buyn
fonte