O componente de atenuação linear nos modelos de iluminação possui uma contrapartida física?


18

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 destá a distância da luz e c, ke ssão constantes.

Entendo o sd^2componente 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 kdcomponente 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?"


Eu não disse que a atenuação linear faz uma cena parecer melhor ou mais realista. O que eu disse é que pode parecer melhor para seus propósitos. Meu raytracer iluminou uma cena muito pequena e, ao comparar os dois modelos, o linear parecia melhor. Não preciso de um motivo físico para dizer que parecia melhor - apenas parecia mais próximo do efeito que eu queria alcançar. Por outro lado, não é que a lei do quadrado inverso não pareça realista, ela caiu muito rapidamente e contribuiu menos para a iluminação da cena do que eu precisava.
David Gouveia

Desculpe David, não pretendi deturpar sua resposta. Alterei minha edição acima.
Ken

11
É sempre bom lembrar que toda a iluminação é um hack, pura e simples =) #
468 Patrick Hughes

Respostas:


21

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.


4
+1 Eu sei sobre a renderização gama correta por um tempo. Conheço atenuação quadrática e linear há um tempo. E este é o momento em que percebo a conexão entre os dois. :-)
David Gouveia

Alguma razão para o -1?
Nicol Bolas

9

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 .


6

Ok, vou adivinhar.

Observação preliminar

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 destá a distância da luz e c, ke ssão constantes.

Entendo o sd^2componente que modela a conhecida atenuação da "lei do quadrado inverso" fisicamente precisa, esperada na realidade.

A curva para c+kd+sd^2é uma parábola, assim como a curva para sd^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 o ksignificado, só é significativo quando está perto da luz.

Simplificação preliminar

Como esse é um fator de atenuação , você também pode definir s == 1ou dividir cada constante sna expressão e dividir o poder da fonte de luz por s. Há um parâmetro demais na fórmula.

Você acaba com:

1/(c/s+(k/s)d+d^2)

Mudança de variáveis

… Que é estritamente equivalente a:

1/(A + D^2)

com A == c/s - k^2/(4s^2)e, mais importante,D == d + k/2s ,.

Isso 1/(A+D^2)realmente parece o de sempre 1/(c+d^2), não é?

Conclusão

O kfator 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.


3

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.


Eu não acho que isso possa ser verdade. Luz viajando através de um médium seria atenuada por 1/dno Rcoordenar, e ainda por 1/d^2nos thetae phiesféricas coordenadas. O que você descreve é, portanto, uma 1/d^3atenuação da intensidade da luz.
21711 Samurai Hocevar

3

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.


1
  • 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 .


Obrigado, mas minha pergunta é qual é o papel do componente de atenuação linear na modelagem de luz. Eu pergunto, porque não aparece em nenhum modelo físico de luz que eu conheça. O link que você fornece NÃO explica para que serve o componente de atenuação linear. Apenas diz; "isto é atenuação linear", sem nenhuma outra explicação.
Ken

Ok, interpretei mal sua pergunta. A atenuação linear seria mais bem observada em uma fonte de luz unidimensional infinita (pense em um tubo fluorescente), enquanto modelos quadráticos modelam o comportamento de uma fonte de luz esférica. Até agora, encontrei apenas um lugar em que há uma explicação da correspondência entre o modelo físico da luz e o usado na computação gráfica: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo

1

Pode derivar do fato de que Z, nas palavras do estimado Eric Lengyel ,

é não linear porque a rasterização correta da perspectiva requer interpolação linear de 1 / z - a interpolação linear do próprio z não produz os resultados corretos. O hardware deve calcular 1 / z em cada vértice e interpolar através de um triângulo; portanto, é conveniente escrever esse valor no buffer de profundidade em vez de executar uma divisão cara em cada pixel para recuperar z.

O fato de você obter mais precisão z mais próxima do plano próximo é apenas um efeito colateral e não tem nada a ver com a motivação por trás da interpolação 1 / z.

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.


Você pode estar em algo lá. Pode muito bem ter algo a ver com o espaço em que a iluminação é calculada. Mas não acho que o buffer de profundidade faça parte dele, pois armazena 'pseudo-distância' do olho (ou plano frontal) ao objeto, e não a distância da luz ao objeto. É a distância da luz que é usada na iluminação.
Ken

@ downvoter - gostaria de comentar, ou apenas trollar? (para citar Jonathan)
Engineer

Downvoting, bem como, a atenuação é calculado no espaço do olho não normalizada espaço -> perspectiva / z tem nada a ver com esta
Oliver Zendel

1

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!


Como a fórmula 1 / (d / r + 1) ^ 2 vem? O artigo original diz apenas "Depois de analisar os resultados de uma série de testes, ficou aparente", o que não é convincente o suficiente em termos da pergunta que se faz sobre modelagem física.
precisa saber é o seguinte

0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.