No OpenGL (e em outros sistemas), o fator de atenuação da distância para luzes pontuais é algo como 1/(c+kd+sd^2)
, onde d
está a distância da luz e c
, k
e s
são constantes.
Entendo o sd^2
componente que modela a conhecida atenuação da "lei do quadrado inverso" fisicamente precisa, esperada na realidade.
Eu acho que a constante c
, geralmente uma, existe para lidar com valores muito pequenos de d
(e defesa dividida por zero, talvez?).
Qual a função do kd
componente linear no modelo (por padrão k
é zero no OpenGL). Quando você usaria outros valores para k
? Eu sei que isso é chamado de componente "atenuação linear", mas que comportamento ele simula no modelo de iluminação? Não parece aparecer em nenhum modelo físico de luz que eu saiba.
[EDITAR]
David Gouveia apontou que o fator linear pode ser usado para ajudar a tornar a cena mais próxima do que o desenvolvedor / artista pretendia, ou para controlar melhor a taxa na qual a luz cai. Nesse caso, minha pergunta se torna "o fator de atenuação linear tem uma contrapartida da física ou é apenas usado como um fator de falsificação para ajudar a controlar a qualidade da luz na cena?"
Respostas:
A luz, de fontes pontuais, cai com o quadrado da distância. Essa é a realidade física.
A atenuação linear costuma ser considerada superior. Mas isso só é verdade quando se trabalha em um espaço de cores não linear . Ou seja, se você não tiver a correção gama correta ativa. O motivo é bem simples.
Se você estiver gravando valores RGB lineares em uma exibição não linear sem correção de gama, seus valores lineares serão alterados pela rampa gama interna do monitor. Isso escurece efetivamente a cena em comparação com o que você realmente pretendia.
Supondo uma gama de 2.2, seu monitor aumentará efetivamente todas as cores para a potência de 2.2 ao exibi-las.
Esta é a atenuação linear:
1/kd
. Esta é a atenuação linear com rampa gama do monitor aplicada:1/(kd)^2.2
. Isso é bem próximo de um relacionamento inverso ao quadrado adequado.Mas o inverso real ao quadrado:
1/sd^2
torna-se:1/((s^2)(d^4.4))
. Isso faz com que a atenuação da luz caia muito mais do que o esperado.Em geral, se você estiver usando a correção gama apropriada (como renderizar em um buffer de quadro sRGB), não deverá usar atenuação linear. Não vai parecer certo. De todo . E se você não estiver usando correção de gama ... o que há de errado com você;)
De qualquer forma, se você está tentando imitar a realidade, deseja um quadrado inverso (e gama correto). Caso contrário, você pode fazer o que for necessário para a sua cena.
fonte
Flexibilidade .
Porque você pode querer que suas luzes se apagem linearmente. Está lá para lhe dar esse grau de controle. Realmente não precisa ser fisicamente preciso (e todas as equações de iluminação de sombreamento de phong certamente também não são fisicamente precisas).
Às vezes, o modelo quadrático emite luz muito rapidamente perto da fonte e deixa "reflexos brancos" nas superfícies próximas. Ao fornecer coeficientes lineares e constantes, você tem a flexibilidade de ajustar os resultados ao seu gosto
Por exemplo, quando implementei um traçador de raios, descobri que a lei do quadrado inverso fazia minhas luzes pontuais apagarem-se muito rapidamente. Mudei para um modelo linear fixo (onde cada luz tinha um raio mínimo e máximo, com interpolação linear no meio) e parecia melhor.
Edit: Acabei de encontrar um bom recurso explicando isso .
fonte
Ok, vou adivinhar.
Observação preliminar
A curva para
c+kd+sd^2
é uma parábola, assim como a curva parasd^2
; a diferença não é tão importante quanto pode parecer: eles se comportam de maneira semelhante no infinito, é apenas para valores pequenos que eles são diferentes. Qualquer que seja ok
significado, só é significativo quando está perto da luz.Simplificação preliminar
Como esse é um fator de atenuação , você também pode definir
s == 1
ou dividir cada constantes
na expressão e dividir o poder da fonte de luz pors
. Há um parâmetro demais na fórmula.Você acaba com:
Mudança de variáveis
… Que é estritamente equivalente a:
com
A == c/s - k^2/(4s^2)
e, mais importante,D == d + k/2s
,.Isso
1/(A+D^2)
realmente parece o de sempre1/(c+d^2)
, não é?Conclusão
O
k
fator avança ou atrasa a atenuação da luz para que ela comece apenas em um raio de-k/2s
(sim, ele também pode ter um raio "negativo", pense em um ponto de luz imaginário dentro de um espelho esférico imaginário que apenas deixaria a luz sair pela segunda vez) . Parece que a matemática vence novamente!Edit: Por um segundo eu pensei que era equivalente a uma luz esférica, mas não é. Mais notavelmente, não gerará sombras suaves.
Utilidade?
Meu palpite é que esse parâmetro pode ser usado por um artista para fazer a luz parecer mais próxima (ou mais distante) do objeto em termos de iluminação, mas sem movê-lo. Como as luzes pontuais geram sombras duras, pode ser um requisito que a luz permaneça em uma posição específica.
fonte
O coeficiente de atenuação linear é a contrapartida física da luz que viaja para um meio. Sem atenuação, a luz parece viajar no vazio perfeito. Ao renderizar cenas "realistas", você deseja que o ar atenue a intensidade da luz à distância, e essa atenuação é linear.
fonte
1/d
noR
coordenar, e ainda por1/d^2
nostheta
ephi
esféricas coordenadas. O que você descreve é, portanto, uma1/d^3
atenuação da intensidade da luz.O fator de atenuação linear existe para os casos em que você pode querer usar a atenuação linear para sua iluminação, mas o principal é - você não precisa usá-lo (ou qualquer outro fator de atenuação).
Isso permite que você ajuste sua iluminação de acordo com seus gostos pessoais. Portanto, basta definir qualquer fator de atenuação que você não deseja 0 e o que você deseja como não 0 e pronto.
Um exemplo específico em que você pode querer usar a atenuação linear seria se o quadrado inverso mais matematicamente correto fornecer uma queda muito rápida. Usando linear, você pode obter um resultado que pode parecer mais ou menos bom o suficiente (e com menos luzes na cena); então você usaria 0 constante, 1 linear e 0 exponencial.
É interessante notar (mas reconhecidamente não relevante para essa discussão) que sprites de ponto no OpenGL e D3D (e parâmetros de ponto no OpenGL) usam a mesma fórmula de atenuação.
Também é importante notar que a iluminação OpenGL / D3D não se destina estritamente a ser fisicamente correta; nunca foi projetado para ser algo além de uma aproximação aceitável, e isso deve ser lembrado ao consultar qualquer coisa relacionada à maneira como ela funciona.
É claro que hoje em dia você provavelmente usará um sombreador, de modo que a fórmula leve antiga seja principalmente de interesse acadêmico / histórico - você pode escrever a fórmula leve desejada.
fonte
c
é o valor de atenuação constante para a fonte de luz.l
é a atenuação linear. É por isso que é multiplicado pelo distante até a fonte de luz.s
é a atenuação quadrática, por isso é multiplicada pelo quadrado da distância.Há mais algumas informações neste link .
fonte
Pode derivar do fato de que Z, nas palavras do estimado Eric Lengyel ,
O buffer de profundidade armazena distâncias. A luz usa distância para atenuação. Poderia ser a relação entre o buffer de profundidade e as implementações de iluminação que precisavam disso, embora isso só se aplicasse se o algoritmo de iluminação fosse executado no espaço da tela, suponho. Lembre-se de que é melhor sempre armazenar um inverso pré-calculado (ou calculado por hardware), do que executar uma divisão no valor indiviso de cada op por quadro que precisa dele ... e isso tende a ser um número muito grande de ops.
Este é apenas um palpite.
fonte
Apenas como um adendo: ao usar o modelo openGL para aproximar uma fonte de luz esférica, todos os três coeficientes fazem sentido e são válidos (não "para evitar transbordamentos" ou para ter "liberdade artística"):
Para uma esfera com raio r, obtemos:
1 / (d / r + 1) ^ 2
isso se traduz em
c = 1 k = 2 / r s = (1 / r ^ 2)
(consulte http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).
Mas essa aproximação é melhor do que usar luzes pontuais infinitesimalmente pequenas sem extensão alguma!
fonte
Eu tenho uma visão / resposta diferente sobre a fórmula.
Quando vemos uma luz pontual, por exemplo, na verdade vemos a dispersão da luz. Portanto, a fórmula de 1 / d ^ 2 é apenas para a luz emitida desse pixel. Mas o brilho em nossa câmera desse pixel terá uma fórmula mais complicada, que utilizará a teoria da dispersão da luz. Veja o artigo
"Amostragem epipolar para sombras e raios crepusculares em mídias participantes com dispersão única"
por Thomas Engelhardt, Carsten Dachsbacher Mas, infelizmente, eles não têm uma fórmula simples final para a dispersão da luz. Eu acho que talvez o efeito final da imitação da GPU seja semelhante à fórmula linear e quadrática.
Então eu acho que a afirmação:
"se você está tentando imitar a realidade, deseja um quadrado inverso (e gama correto)" não é válido.
Na verdade, eu uso a fórmula com fatores lineares e quadráticos sem gama que podem imitar muito bem os efeitos brilhantes. Linear não pode.
Em um breve resumo, a fórmula possui a contrapartida física da dispersão da luz.
fonte