Hat die lineare Dämpfungskomponente in Beleuchtungsmodellen ein physisches Gegenstück?


18

In OpenGL (und anderen Systemen) der Abstand Dämpfungsfaktor für Punktlichter ist so etwas wie 1/(c+kd+sd^2), wo dder Abstand von dem Licht ist und c, kund sKonstanten sind.

Ich verstehe die sd^2Komponente, die die bekannte physikalisch genaue "Inverse Square Law" -Dämpfung modelliert, die in der Realität erwartet wird.

Ich denke, die Konstante c, normalerweise eine, gibt es für sehr kleine Werte von d(und vielleicht für die Verteidigung durch Nulldivision?).

Welche Rolle hat die lineare kdKomponente im Modell ( kin OpenGL ist sie standardmäßig Null) ? Wann würden Sie andere Werte verwenden k? Ich weiß, dass dies als "lineare Dämpfung" bezeichnet wird, aber welches Verhalten simuliert es im Beleuchtungsmodell? Es scheint in keinem physischen Lichtmodell zu erscheinen, das mir bewusst ist.

[BEARBEITEN]

David Gouveia hat darauf hingewiesen, dass der lineare Faktor verwendet werden könnte, um die Szene näher an das zu bringen, was der Entwickler / Künstler beabsichtigt hat, oder um die Geschwindigkeit, mit der das Licht abfällt, besser zu steuern. In welchem ​​Fall lautet meine Frage: "Hat der lineare Dämpfungsfaktor ein Gegenstück zur Physik oder wird er nur als Fudge-Faktor verwendet, um die Lichtqualität in der Szene zu steuern?"


Ich habe nicht gesagt , dass eine lineare Dämpfung macht eine Szene besser aussehen oder realistischer. Was ich sagte ist, dass es für Ihre Zwecke besser aussehen könnte . Mein Raytracer beleuchtete eine sehr kleine Szene, und beim Vergleich beider Modelle sah das Linear besser aus. Ich brauche keinen physischen Grund, um zu sagen, dass es besser aussah - es sah nur näher an dem Effekt aus, den ich erreichen wollte. Umgekehrt ist es nicht so, dass das inverse Quadratgesetz nicht realistisch aussah, es fiel einfach zu schnell ab und trug weniger zur Szenenbeleuchtung bei, als ich brauchte.
David Gouveia

Entschuldigung David, ich wollte deine Antwort nicht falsch darstellen. Ich habe meine Bearbeitung oben geändert.
Ken

1
Immer gut daran zu denken, dass alles Licht ein Hack ist, schlicht und einfach =)
Patrick Hughes

Antworten:


21

Licht von punktförmigen Quellen fällt mit dem Quadrat der Entfernung ab. Das ist physische Realität.

Die lineare Dämpfung wird oft als überlegen bezeichnet. Dies gilt jedoch nur, wenn in einem nichtlinearen Farbraum gearbeitet wird. Das heißt, wenn Sie nicht die richtige Gammakorrektur aktiviert haben. Der Grund ist ganz einfach.

Wenn Sie lineare RGB-Werte ohne Gammakorrektur auf eine nichtlineare Anzeige schreiben, werden Ihre linearen Werte durch die integrierte Gammarampe des Monitors gestört. Dies verdunkelt die Szene im Vergleich zu dem, was Sie eigentlich beabsichtigt haben.

Unter der Annahme eines Gammas von 2,2 hebt Ihr Monitor beim Anzeigen alle Farben effektiv auf die Stärke von 2,2 an.

Dies ist lineare Dämpfung: 1/kd. Dies ist linear Dämpfung mit dem Gamma des Monitors Rampe angewendet: 1/(kd)^2.2. Das ist ziemlich nah an einer richtigen invers-squared Beziehung.

Aber die tatsächliche inverse Quadrat: 1/sd^2wird: 1/((s^2)(d^4.4)). Dadurch fällt die Lichtdämpfung viel stärker ab als erwartet.

Wenn Sie die richtige Gammakorrektur verwenden (wie das Rendern in einem sRGB-Framebuffer), sollten Sie im Allgemeinen keine lineare Dämpfung verwenden. Es wird nicht richtig aussehen. Haupt . Und wenn du keine Gammakorrektur verwendest ... was ist los mit dir;)

In jedem Fall möchten Sie, wenn Sie versuchen, die Realität nachzuahmen, das Quadrat umkehren (und das Gamma korrigieren). Wenn nicht, können Sie alles tun, was Sie für Ihre Szene brauchen.


4
+1 Ich kenne das gammakorrekte Rendern schon seit einiger Zeit. Ich habe eine Weile über quadratische und lineare Dämpfung gewusst. Und dies ist der Moment, in dem ich zum ersten Mal die Verbindung zwischen den beiden erkenne. :-)
David Gouveia

Irgendein Grund für die -1?
Nicol Bolas

9

Flexibilität .

Vielleicht möchten Sie, dass Ihre Lichter linear abfallen. Es ist da, um Ihnen das Maß an Kontrolle zu geben. Es muss nicht wirklich physikalisch genau sein (und die gesamten Phong-Shading-Beleuchtungsgleichungen sind sicherlich auch nicht physikalisch genau).

Manchmal gibt das quadratische Modell Licht in der Nähe der Quelle zu schnell ab und hinterlässt "weiße Blendungen" in den nahe gelegenen Oberflächen. Indem Sie lineare und konstante Koeffizienten bereitstellen, können Sie die Ergebnisse flexibel nach Ihren Wünschen anpassen

Als ich zum Beispiel einen Raytracer implementierte, stellte ich fest, dass das inverse Quadratgesetz dazu führte, dass meine Punktlichter zu schnell ausfielen. Ich habe zu einem geklemmten linearen Modell gewechselt (wobei jedes Licht einen minimalen und einen maximalen Radius mit linearer Interpolation dazwischen hatte) und es sah einfach besser aus.

Bearbeiten: Ich habe gerade eine nette Ressource gefunden, die dies erklärt .


6

Okay, ich werde eine Vermutung anstellen.

Vorbemerkung

In OpenGL (und anderen Systemen) der Abstand Dämpfungsfaktor für Punktlichter ist so etwas wie 1/(c+kd+sd^2), wo dder Abstand von dem Licht ist und c, kund sKonstanten sind.

Ich verstehe die sd^2Komponente, die die bekannte physikalisch genaue "Inverse Square Law" -Dämpfung modelliert, die in der Realität erwartet wird.

Die Kurve für c+kd+sd^2ist eine Parabel, und so ist die Kurve für sd^2; Der Unterschied ist nicht so wichtig, wie es scheinen mag: Sie verhalten sich im Unendlichen ähnlich, nur für kleine Werte sind sie unterschiedlich. Was auch immer kbedeutet, es ist nur in der Nähe des Lichts sinnvoll.

Vorläufige Vereinfachung

Da dies ein Dämpfungsfaktor ist, können Sie auch s == 1jede Konstante sim Ausdruck einstellen oder durch dividieren und die Leistung Ihrer Lichtquelle durch dividieren s. Die Formel enthält einen Parameter zu viele.

Sie landen mit:

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

Änderung von Variablen

… Was genau gleichbedeutend ist mit:

1/(A + D^2)

mit A == c/s - k^2/(4s^2)und, was noch wichtiger ist D == d + k/2s,.

Das 1/(A+D^2)sieht doch ganz normal aus 1/(c+d^2), oder?

Fazit

Der kFaktor erhöht oder verzögert die Lichtabschwächung so, dass sie nur in einem Radius von beginnt-k/2s (ja, sie könnte auch einen "negativen" Radius haben, denken Sie an ein imaginäres Punktlicht in einem imaginären sphärischen Spiegel, das Licht nur beim zweiten Mal herauslassen würde). . Es scheint, dass Mathe wieder gewinnt!

Edit: Für eine Sekunde dachte ich, es wäre gleichbedeutend mit einem sphärischen Licht, aber es ist nicht so. Insbesondere werden keine weichen Schatten erzeugt.

Nützlichkeit?

Ich vermute, dass dieser Parameter von einem Künstler verwendet werden kann, um ein Licht so erscheinen zu lassen, als wäre es näher (oder weiter entfernt) am Objekt, aber ohne es zu bewegen. Da Punktlichter harte Schatten erzeugen, kann es erforderlich sein, dass das Licht an einer bestimmten Position bleibt.


3

Der lineare Dämpfungskoeffizient ist das physikalische Gegenstück von Licht, das in ein Medium wandert. Ohne Dämpfung scheint das Licht in vollkommener Leere zu wandern. Wenn Sie "realistische" Szenen rendern, möchten Sie, dass die Luft die Intensität des Lichts über die Entfernung abschwächt. Diese Abschwächung ist linear.


Ich glaube nicht, dass das wahr sein kann. Licht, das sich durch ein Medium bewegt, würde 1/din der RKoordinate und immer noch 1/d^2in den thetaund phisphärischen Koordinaten abgeschwächt . Sie beschreiben daher eine 1/d^3Abschwächung der Lichtintensität.
Sam Hocevar

3

Der lineare Dämpfungsfaktor gibt es für Fälle, in denen Sie möglicherweise die lineare Dämpfung für Ihre Beleuchtung verwenden möchten, aber das Entscheidende ist, dass Sie ihn nicht verwenden müssen (oder einen der anderen Dämpfungsfaktoren).

Auf diese Weise können Sie Ihre Beleuchtung auf Ihren persönlichen Geschmack abstimmen. Stellen Sie einfach einen Dämpfungsfaktor ein, den Sie nicht auf 0 setzen möchten, und einen Dämpfungsfaktor, den Sie nicht auf 0 setzen möchten, und fertig.

Ein konkretes Beispiel für die Verwendung der linearen Dämpfung wäre, wenn das mathematisch korrektere Inversquadrat zu schnell abfällt. Mit linear erhalten Sie ein Ergebnis, das mehr oder weniger gut (und mit weniger Licht in der Szene) aussehen kann. Sie würden also 0 konstant, 1 linear und 0 exponentiell verwenden.

Es ist interessant festzustellen, dass Punkt-Sprites in OpenGL und D3D (und Punkt-Parameter in OpenGL) dieselbe Dämpfungsformel verwenden (dies ist jedoch für diese Diskussion nicht relevant).

Erwähnenswert ist auch, dass die OpenGL / D3D-Beleuchtung nicht unbedingt physisch korrekt sein soll. Es wurde nie als mehr als eine annehmbare Annäherung entworfen, und dies sollte beachtet werden, wenn etwas in Bezug auf die Funktionsweise abgefragt wird.

Natürlich werden Sie heutzutage höchstwahrscheinlich einen Shader verwenden, sodass die alte Lichtformel hauptsächlich von akademischem / historischem Interesse ist - Sie können jede gewünschte Lichtformel schreiben.


1
  • c ist der konstante Dämpfungswert für die Lichtquelle.
  • list die lineare Dämpfung. Das ist der Grund, warum es mit der Entfernung zur Lichtquelle multipliziert wird.
  • s ist die quadratische Dämpfung, also multipliziert man sie mit dem Quadrat der Entfernung.

Es gibt einige weitere Informationen in diesem Link .


Danke, aber meine Frage ist, welche Rolle die lineare Dämpfungskomponente bei der Modellierung von Licht spielt. Ich frage, weil es in keinem mir bekannten physikalischen Lichtmodell vorkommt. Der von Ihnen angegebene Link erklärt NICHT, wozu die lineare Dämpfungskomponente dient. Es heißt nur; "das ist lineare Dämpfung", ohne irgendeine andere Erklärung.
Ken

Okay, ich habe deine Frage falsch interpretiert. Eine lineare Dämpfung lässt sich besser in einer unendlichen eindimensionalen Lichtquelle (etwa einer Leuchtstoffröhre) beobachten, während das Verhalten einer sphärischen Lichtquelle quadratisch modelliert wird. Bisher habe ich nur einen Ort gefunden, an dem es eine Erklärung für die Entsprechung zwischen dem physikalischen Lichtmodell und dem in der Computergrafik verwendeten gibt: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo

1

Es könnte sich aus der Tatsache ergeben, dass Z, in den Worten des geschätzten Eric Lengyel ,

ist nichtlinear, da für die perspektivisch korrekte Rasterung eine lineare Interpolation von 1 / z erforderlich ist. Die lineare Interpolation von z selbst führt nicht zu den richtigen Ergebnissen. Die Hardware muss 1 / z an jedem Scheitelpunkt berechnen und über ein Dreieck interpolieren, sodass es praktisch ist, diesen Wert einfach in den Tiefenpuffer zu schreiben, anstatt bei jedem Pixel eine teure Division durchzuführen, um z wiederherzustellen.

Die Tatsache, dass Sie näher an der nahen Ebene mehr z-Präzision erzielen, ist nur ein Nebeneffekt und hat nichts mit der Motivation hinter der 1 / z-Interpolation zu tun.

Tiefenpuffer speichert Entfernungen. Licht nutzt Abstand zur Dämpfung. Es könnte die Beziehung zwischen dem Tiefenpuffer und den Beleuchtungsimplementierungen sein, die dies erforderlich macht, obwohl dies nur zutreffen würde, wenn der Beleuchtungsalgorithmus im Bildschirmbereich ausgeführt würde, nehme ich an. Denken Sie daran, dass es besser ist, immer eine vorberechnete (oder hardwareberechnete) Inverse zu speichern, als eine Division des ungeteilten Werts für jede Operation pro Frame durchführen zu müssen, die sie benötigt ... und das ist in der Regel eine sehr große Anzahl von Operationen.

Dies ist nur eine Vermutung.


Sie könnten dort auf etwas sein. Es kann durchaus etwas mit dem Raum zu tun haben, in dem die Beleuchtung berechnet wird. Aber ich denke nicht, dass der Tiefenpuffer ein Teil davon ist, da er die 'Pseudoentfernung' vom Auge (oder der Frontebene) zum Objekt und nicht die Entfernung vom Licht zum Objekt speichert. Es ist der Lichtabstand, der bei der Beleuchtung verwendet wird.
Ken

@Downvoter - Möchtest du Kommentare abgeben oder nur trollen? (um Jonathan zu zitieren)
Ingenieur

Auch beim Downvoting wird die Dämpfung im nicht normalisierten Augenraum berechnet -> Perspektive / z hat nichts damit zu tun
Oliver Zendel

1

Nur als Addenum: Bei Verwendung des openGL-Modells zur Approximation einer sphärischen Lichtquelle sind alle drei Koeffizienten sinnvoll und gültig (nicht "um Überläufe zu verhindern" oder "künstlerische Freiheit" zu haben):

Für eine Kugel mit Radius r erhalten wir:

1 / (d / r + 1) ^ 2

das übersetzt zu

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

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

Imho ist diese Annäherung besser als die Verwendung von unendlich kleinen Punktlichtern ohne Ausdehnung überhaupt!


Wie kommt die Formel 1 / (d / r + 1) ^ 2? Im Originalartikel heißt es nur: "Nachdem man sich die Ergebnisse einer Reihe von Tests angesehen hat, wurde es offensichtlich", was in Bezug auf die Frage nach der physikalischen Modellierung nicht überzeugend genug ist.
user1914692

0

Ich habe eine andere Ansicht / Antwort über die Formel.

Wenn wir zum Beispiel ein Punktlicht betrachten, sehen wir tatsächlich die Lichtstreuung. Die Formel von 1 / d ^ 2 gilt also nur für das emittierte Licht dieses Pixels. Die Helligkeit dieses Pixels in unserer Kamera hat jedoch eine kompliziertere Formel, die die Lichtstreutheorie verwendet. Siehe das Papier

"Epipolare Abtastung für Schatten und Crepuscular Rays in teilnehmenden Medien mit einfacher Streuung"

von Thomas Engelhardt, Carsten Dachsbacher Leider haben sie keine endgültige einfache Formel für die Lichtstreuung. Ich vermute, der endgültige GPU-Nachahmungseffekt würde der linearen und quadratischen Formel ähneln.

Also ich denke die Behauptung:

"Wenn Sie versuchen, die Realität nachzuahmen, möchten Sie, dass das Quadrat umgekehrt ist (und das Gamma korrekt ist)" ist ungültig.

Eigentlich verwende ich die Formel mit linearen und quadratischen Faktoren, ohne dass Gamma die Glüheffekte sehr gut nachahmen kann. Linear kann nicht.

In einer kurzen Zusammenfassung hat die Formel das physikalische Gegenstück zur Lichtstreuung.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.