In OpenGL (und anderen Systemen) der Abstand Dämpfungsfaktor für Punktlichter ist so etwas wie 1/(c+kd+sd^2)
, wo d
der Abstand von dem Licht ist und c
, k
und s
Konstanten sind.
Ich verstehe die sd^2
Komponente, 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 kd
Komponente im Modell ( k
in 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?"
Antworten:
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^2
wird: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.
quelle
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 .
quelle
Okay, ich werde eine Vermutung anstellen.
Vorbemerkung
Die Kurve für
c+kd+sd^2
ist eine Parabel, und so ist die Kurve fürsd^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 immerk
bedeutet, es ist nur in der Nähe des Lichts sinnvoll.Vorläufige Vereinfachung
Da dies ein Dämpfungsfaktor ist, können Sie auch
s == 1
jede Konstantes
im Ausdruck einstellen oder durch dividieren und die Leistung Ihrer Lichtquelle durch dividierens
. Die Formel enthält einen Parameter zu viele.Sie landen mit:
Änderung von Variablen
… Was genau gleichbedeutend ist mit:
mit
A == c/s - k^2/(4s^2)
und, was noch wichtiger istD == d + k/2s
,.Das
1/(A+D^2)
sieht doch ganz normal aus1/(c+d^2)
, oder?Fazit
Der
k
Faktor 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.
quelle
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.
quelle
1/d
in derR
Koordinate und immer noch1/d^2
in dentheta
undphi
sphärischen Koordinaten abgeschwächt . Sie beschreiben daher eine1/d^3
Abschwächung der Lichtintensität.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.
quelle
c
ist der konstante Dämpfungswert für die Lichtquelle.l
ist 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 .
quelle
Es könnte sich aus der Tatsache ergeben, dass Z, in den Worten des geschätzten Eric Lengyel ,
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.
quelle
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!
quelle
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.
quelle