La composante d'atténuation linéaire dans les modèles d'éclairage a-t-elle une contrepartie physique?


18

Dans OpenGL (et d'autres systèmes), le facteur d'atténuation de la distance pour les lumières ponctuelles est quelque chose comme 1/(c+kd+sd^2), où dest la distance de la lumière et c, ket ssont des constantes.

Je comprends la sd^2composante qui modélise l'atténuation bien connue de la «loi du carré inverse», physiquement précise, attendue dans la réalité.

Je suppose que la constante c, généralement une, est là pour traiter de très petites valeurs d(et peut-être une défense par division?).

Quel rôle le kdcomposant linéaire a-t-il dans le modèle (par défaut, kzéro dans OpenGL). Quand utiliseriez-vous d'autres valeurs k? Je sais que cela s'appelle la composante "atténuation linéaire", mais quel comportement simule-t-il dans le modèle d'éclairage? Il ne semble pas apparaître dans aucun modèle physique de lumière que je connaisse.

[ÉDITER]

David Gouveia a souligné que le facteur linéaire pourrait être utilisé pour aider à rendre la scène plus proche de ce que le développeur / artiste avait l'intention de faire, ou pour mieux contrôler la vitesse à laquelle la lumière tombe. Dans ce cas, ma question devient "le facteur d'atténuation linéaire a-t-il un équivalent physique ou est-il simplement utilisé comme facteur de fudge pour aider à contrôler la qualité de la lumière dans la scène?"


Je n'ai pas dit que l'atténuation linéaire rend une scène plus belle ou plus réaliste. Ce que j'ai dit, c'est que cela pourrait mieux convenir à vos besoins. Mon raytracer a éclairé une très petite scène, et en comparant les deux modèles, le linéaire était plus beau. Je n'ai pas besoin d'une raison physique pour dire que ça avait l'air mieux - ça ressemblait juste à l'effet que je voulais atteindre. Inversement, ce n'est pas que la loi du carré inverse ne semblait pas réaliste, elle est juste tombée trop rapidement et a contribué moins à l'éclairage de la scène que ce dont j'avais besoin.
David Gouveia

Désolé David, je ne voulais pas dénaturer votre réponse. J'ai changé ma modification ci-dessus.
Ken

1
Toujours bon de se rappeler que tout l'éclairage est un hack, pur et simple =)
Patrick Hughes

Réponses:


21

La lumière, provenant de sources ponctuelles, tombe avec le carré de la distance. Voilà la réalité physique.

L'affaiblissement linéaire semble souvent supérieur. Mais cela n'est vrai que lorsque vous travaillez dans un espace colorimétrique non linéaire . Autrement dit, si vous n'avez pas la correction gamma appropriée active. La raison est plutot simple.

Si vous écrivez des valeurs RVB linéaires sur un affichage non linéaire sans correction gamma, vos valeurs linéaires seront altérées par la rampe gamma intégrée du moniteur. Cela assombrit efficacement la scène par rapport à ce que vous vouliez réellement.

En supposant un gamma de 2,2, votre moniteur augmentera efficacement toutes les couleurs à la puissance de 2,2 lors de leur affichage.

Ceci est atténuation linéaire: 1/kd. Ceci est une atténuation linéaire avec la rampe de gamma du moniteur appliqué: 1/(kd)^2.2. C'est assez proche d'une véritable relation au carré inverse.

Mais l'inverse réelle au carré: 1/sd^2devient: 1/((s^2)(d^4.4)). Cela fait que l'atténuation de la lumière diminue beaucoup plus fortement que prévu.

En général, si vous utilisez une correction gamma appropriée (comme le rendu sur un tampon de trame sRGB), vous ne devez pas utiliser d'atténuation linéaire. Ça n'aura pas l'air bien. Du tout . Et si vous n'utilisez pas la correction gamma ... qu'est-ce qui ne va pas avec vous;)

Dans tous les cas, si vous essayez d'imiter la réalité, vous voulez un carré inverse (et un gamma correct). Si vous ne l'êtes pas, vous pouvez faire tout ce dont vous avez besoin pour votre scène.


4
+1 Je connais le rendu correct gamma depuis un moment. Je connais l'atténuation quadratique et linéaire depuis un certain temps. Et c'est le moment où je réalise pour la première fois le lien entre les deux. :-)
David Gouveia

Une raison pour le -1?
Nicol Bolas

9

Souplesse .

Parce que vous voudrez peut-être que vos lumières tombent de façon linéaire. Il est là pour vous donner ce degré de contrôle. Il n'a pas vraiment besoin d'être physiquement précis (et l'ensemble des équations d'éclairage de l'ombrage phong ne sont certainement pas physiquement précises non plus).

Parfois, le modèle quadratique émet de la lumière trop rapidement près de la source et laisse des "reflets blancs" sur les surfaces proches. En fournissant des coefficients linéaires et constants, vous avez la possibilité d'ajuster les résultats à votre guise

Par exemple, lorsque j'ai implémenté un raytracer, j'ai découvert que la loi du carré inverse faisait que mes lumières ponctuelles tombaient trop rapidement. J'ai changé pour un modèle linéaire serré (où chaque lumière avait un rayon minimum et maximum, avec une interpolation linéaire entre les deux) et ça avait l'air mieux.

Edit: Je viens de trouver une belle ressource expliquant cela .


6

D'accord, je vais devoir deviner.

Observation préliminaire

Dans OpenGL (et d'autres systèmes), le facteur d'atténuation de la distance pour les lumières ponctuelles est quelque chose comme 1/(c+kd+sd^2), où dest la distance de la lumière et c, ket ssont des constantes.

Je comprends la sd^2composante qui modélise l'atténuation bien connue de la «loi du carré inverse», physiquement précise, attendue dans la réalité.

La courbe de c+kd+sd^2est une parabole, tout comme la courbe de sd^2; la différence n'est pas aussi importante que cela puisse paraître: ils se comportent de manière similaire à l'infini, c'est juste pour les petites valeurs qu'ils sont différents. Quoi qu'il en soit k, cela n'a de sens que lorsqu'il est proche de la lumière.

Simplification préliminaire

Étant donné qu'il s'agit d'un facteur d' atténuation , vous pouvez également définir s == 1ou diviser chaque constante par sdans l'expression et diviser la puissance de votre source de lumière par s. Il y a un paramètre de trop dans la formule.

Vous vous retrouvez avec:

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

Changement de variables

… Ce qui équivaut strictement à:

1/(A + D^2)

avec A == c/s - k^2/(4s^2)et, plus important encore , D == d + k/2s.

Cela 1/(A+D^2)ressemble vraiment à l'habituel 1/(c+d^2), non?

Conclusion

Le kfacteur avance ou retarde l'atténuation de la lumière de sorte qu'elle ne commence qu'à un rayon de-k/2s (oui, il pourrait également avoir un rayon "négatif", pensez à une lumière ponctuelle imaginaire à l'intérieur d'un miroir sphérique imaginaire qui ne laisserait passer la lumière que la deuxième fois) . Il semble que les maths gagnent à nouveau!

Edit: Pendant une seconde, j'ai pensé que c'était l'équivalent d'une lumière sphérique, mais ce n'est pas le cas. Plus particulièrement, il ne générera pas d'ombres douces.

Utilité?

Je suppose que ce paramètre peut être utilisé par un artiste pour faire apparaître une lumière comme si elle était plus proche (ou plus éloignée) de l'objet en termes d'éclairage, mais sans la déplacer. Étant donné que les lumières ponctuelles génèrent des ombres dures, il peut être nécessaire que la lumière reste à une position spécifique.


3

Le coefficient d'atténuation linéaire est l'équivalent physique de la lumière se déplaçant dans un milieu. Sans atténuation, la lumière semble voyager dans un vide parfait. Lors du rendu de scènes "réalistes", vous voulez que l'air atténue l'intensité de la lumière à distance, et cette atténuation est linéaire.


Je ne pense pas que cela puisse être vrai. La lumière se propageant à travers un milieu serait atténué par 1/dla Rcoordination, et encore par 1/d^2des thetaet des phicoordonnées sphériques. Ce que vous décrivez est donc une 1/d^3atténuation de l'intensité lumineuse.
sam hocevar

3

Le facteur d'atténuation linéaire est là pour les cas où vous voudrez peut - être utiliser une atténuation linéaire pour votre éclairage, mais la chose clé est - vous ne devez l'utiliser (ou l' un des autres facteurs de atténuations, d'ailleurs).

Cela vous permet d'adapter votre éclairage à vos goûts personnels. Il suffit donc de régler tout facteur d'atténuation que vous ne voulez pas à 0 et ceux que vous voulez non-0 et c'est fait.

Un exemple spécifique où vous voudrez peut-être utiliser l'atténuation linéaire serait si le carré inverse plus mathématiquement correct fournit une chute trop rapide. En utilisant linéaire, vous pouvez obtenir un résultat qui peut sembler plus ou moins bon (et avec moins de lumières dans la scène); vous utiliseriez donc 0 constante, 1 linéaire et 0 exponentielle.

Il est intéressant de noter (mais il n'est certes pas pertinent pour cette discussion) que les sprites ponctuels dans OpenGL et D3D (et les paramètres ponctuels dans OpenGL) utilisent la même formule d'atténuation.

Il convient également de noter que l'éclairage OpenGL / D3D n'est pas strictement destiné à être physiquement correct; il n'a jamais été conçu pour n'être rien de plus qu'une approximation acceptable, et cela devrait être pris en compte lors de l'interrogation de tout ce qui concerne son fonctionnement.

Bien sûr, de nos jours, vous utiliserez très probablement un shader, donc l'ancienne formule d'éclairage est principalement d'intérêt académique / historique uniquement - vous pouvez écrire la formule d'éclairage que vous voulez.


1
  • c est la valeur d'atténuation constante pour la source lumineuse.
  • lest l'atténuation linéaire. C'est pourquoi il est multiplié par la distante de la source lumineuse.
  • s est l'atténuation quadratique, elle est donc multipliée par le carré de la distance.

Il y a plus d'informations dans ce lien .


Merci, mais ma question est quel est le rôle de la composante d'atténuation linéaire dans la modélisation de la lumière. Je demande parce qu'elle n'apparaît dans aucun modèle physique de lumière que je connaisse. Le lien que vous fournissez n'explique PAS à quoi sert la composante d'atténuation linéaire. Il dit simplement; "c'est une atténuation linéaire", sans autre explication.
Ken

D'accord, j'ai mal interprété votre question. L'atténuation linéaire serait mieux observée dans une source de lumière infinie à une dimension (pensez à un tube fluorescent), tandis que les modèles quadratiques modélisent le comportement d'une source de lumière sphérique. Jusqu'à présent, je n'ai trouvé qu'un seul endroit où il y a une explication de la correspondance entre le modèle de lumière physique et celui utilisé en infographie: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo

1

Cela pourrait dériver du fait que Z, selon les mots de l'estimé Eric Lengyel ,

est non linéaire car la pixellisation correcte en perspective nécessite une interpolation linéaire de 1 / z - une interpolation linéaire de z elle-même ne produit pas les résultats corrects. Le matériel doit calculer 1 / z à chaque sommet et l'interpoler sur un triangle, il est donc pratique d'écrire simplement cette valeur dans le tampon de profondeur au lieu d'effectuer une division coûteuse à chaque pixel pour récupérer z.

Le fait que vous obteniez plus de précision z plus près du plan proche n'est qu'un effet secondaire et n'a rien à voir avec la motivation derrière l'interpolation 1 / z.

Le tampon de profondeur stocke les distances. La lumière utilise la distance pour l'atténuation. Ce pourrait être la relation entre le tampon de profondeur et les implémentations d'éclairage qui nécessitait cela, bien que cela ne s'applique que si l'algorithme d'éclairage fonctionnait dans l'espace d'écran, je suppose. N'oubliez pas qu'il vaut mieux toujours stocker un inverse précalculé (ou calculé par le matériel), que d'avoir à effectuer une division sur la valeur indivise pour chaque opération par trame qui en a besoin ... et cela a tendance à être un très grand nombre d'opérations.

C'est juste une supposition.


Vous pourriez être sur quelque chose là-bas. Cela pourrait bien avoir quelque chose à voir avec l'espace dans lequel l'éclairage est calculé. Mais je ne pense pas que le tampon de profondeur en fasse partie, car il stocke la «pseudo-distance» de l'œil (ou du plan avant) à l'objet, pas la distance de la lumière à l'objet. C'est la distance lumineuse qui est utilisée dans l'éclairage.
Ken

@downvoter - vous voulez commenter, ou tout simplement à la traîne? (pour citer Jonathan)
Ingénieur

En descendant également, l'atténuation est calculée dans l'espace des yeux et non dans l'espace normalisé -> perspective / z n'a rien à voir avec cela
Oliver Zendel

1

Tout comme un addenum: lorsque vous utilisez le modèle openGL pour approximer une source de lumière sphérique, les trois coefficients ont un sens et sont valables (pas "pour éviter les débordements" ou pour avoir "la liberté artistique"):

Pour une sphère de rayon r on obtient:

1 / (d / r + 1) ^ 2

cela se traduit par

c = 1 k = 2 / r s = (1 / r ^ 2)

(voir http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).

À mon humble avis, cette approximation est meilleure que d'utiliser des lumières ponctuelles infiniment petites sans aucune extension!


Comment se présente la formule 1 / (d / r + 1) ^ 2? L'article original dit seulement "Après avoir regardé les résultats d'une série de tests, c'est devenu apparent", ce qui n'est pas suffisamment convaincant pour ce qui est de la question de la modélisation physique.
user1914692

0

J'ai une opinion / réponse différente sur la formule.

Par exemple, lorsque nous observons un spot lumineux, nous voyons en fait la diffusion de la lumière. Ainsi, la formule de 1 / d ^ 2 est uniquement pour la lumière d'émission de ce pixel. Mais la luminosité dans notre appareil photo de ce pixel aura une formule plus compliquée, qui utilisera la théorie de la diffusion de la lumière. Voir le papier

"Échantillonnage épipolaire pour les ombres et les rayons crépusculaires dans les médias participants avec diffusion unique"

par Thomas Engelhardt, Carsten Dachsbacher Mais malheureusement, ils n'ont pas de formule finale simple pour la diffusion de la lumière. Je suppose que peut-être l'effet d'imitation final du GPU serait similaire à la formule linéaire et quadratique.

Je pense donc que la revendication:

"si vous essayez d'imiter la réalité, vous voulez un carré inverse (et un gamma correct)" n'est pas valide.

En fait, j'utilise la formule avec des facteurs linéaires et quadratiques sans gamma peut très bien imiter les effets lumineux. Linear ne peut pas.

En bref, la formule a la contrepartie physique de la diffusion de la lumière.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.