Umgebungsbeleuchtung


7

Auf der Wikipedia-Seite für das Phong-Modell heißt es, dass der Umgebungsbegriff eine Konstante ist und nur zu den anderen Begriffen hinzugefügt wird. Auf anderen Seiten wie LearnOpenGL heißt es jedoch, dass Sie den Umgebungsbegriff nehmen und mit der Farbe des Objekts multiplizieren sollten. Welches ist richtig?


Beachten Sie, dass Wikipedia später in diesem Artikel sagt: "Wenn die Farbe als RGB-Werte dargestellt wird, wie dies in der Computergrafik häufig der Fall ist, wird diese Gleichung normalerweise separat für die Intensitäten R, G und B modelliert, wodurch unterschiedliche Reflexionskonstanten ka, {\ Anzeigestil k _ {\ text {a}},} k _ {\ text {a}}, kd {\ Anzeigestil k _ {\ text {d}}} k _ {\ text {d}} und ks {\ Anzeigestil k _ {\ text {s}}} k _ {\ text {s}} für die verschiedenen Farbkanäle. "
Cort Ammon

Antworten:


6

Richtig ist der OpenGL-Weg. Wenn Sie ein weißes Licht hätten (sagen wir vec3 (255,255,255)) und es einfach einem blauen Objekt (vec3 (0,0,255)) hinzugefügt hätten, wäre das Objekt weiß, was falsch ist. Wenn Sie diese Farben jedoch multiplizieren würden, wäre das Objekt vollständig beleuchtet und korrekt blau (was das gewünschte Produkt ist).

Die Sache mit dem Umgebungslicht ist, dass es nur durch die Intensität des Umgebungslichts und durch die Farbe des Objekts beeinflusst wird, was bedeutet, dass es nicht durch die Position, Richtung oder etwas Ähnliches des Lichts beeinflusst wird. Deshalb kann man es sich als "einfach als Konstante hinzufügen" vorstellen.

Wir verwenden Umgebungslicht hauptsächlich, um reflektiertes Licht in der Szene zu simulieren, was sonst sehr schwer zu simulieren ist (ohne Raytracing). Es ist eine ziemlich gute und billige Alternative.


1
Vielen Dank! Ihre Antwort sowie Dans Antwort deckten meine Frage sehr gut ab. Ich werde sicherstellen, dass dieses neue Wissen genutzt wird.
Daniel Kareh

4

Die relevante Gleichung auf der Wikipedia-Seite lautet:

ichp=keinichein+mBeleuchtung(kd(L.^mN.^)ichm,d+ks(R.^mV.^)αichm,s)

In dieser Gleichung sind alle k und ichBegriffe sind keine Zahlen, sondern Farben (RGB-Intensitäten). Das beinhaltetkein und ichein: die Umgebungsfarbe des Objekts bzw. die Umgebungsbeleuchtungsfarbe. Der Umgebungsbegriff ist keine Konstante: Er ist ein Produkt aus Intensität und Albedo, genau wie die spiegelnden und diffusen Begriffe. Der einzige Unterschied besteht darin, dass die Beleuchtungs- und Blickrichtung in diesem Begriff keine Rolle spielt.

Es ist sehr ungewöhnlich zu haben keinunterscheidet sich von der diffusen Farbe, so dass Sie sich vorstellen können, sie mit "der Farbe des Objekts" zu multiplizieren. Das heißt, es ist ziemlich häufig fürichein Um eine eindeutige Farbe zu erhalten: Wenn Sie beispielsweise ein gelbliches Richtungslicht für direktes Sonnenlicht verwenden, möchten Sie möglicherweise, dass das Umgebungslicht für das Oberlicht bläulich ist.


Vielen Dank! Sowohl Ihre Antwort als auch Michals Antwort haben es mir sehr gut erklärt. Ich muss mich beim nächsten Mal an einen Code als Shader erinnern.
Daniel Kareh

0

Ich denke, wir sollten beides haben und auch einen Faktor, der auf Material basiert

Einige Materialien sind sehr diffus, sodass sie nur Licht ihrer eigenen Farbe reflektieren. Manches Material kann aber auch etwas Licht reflektieren, wie es ist. Ich denke, wir verwenden für den Phong-Shader eine additive Umgebung, da das Phong-Objekt dazu neigt, alles Licht zu reflektieren, und daher Umgebungslicht mit der Farbe dieses Lichts beleuchtet werden könnte, aber andere Lichter wurden verwendet, um diffuse Farben zu erzeugen

Im Gegensatz zu Lambert, wenn das, was ich weiß, richtig ist, handelt es sich um Material mit hoher Diffusion, und so wurde das Umgebungslicht dem Licht hinzugefügt und mit der Farbe des Materials multipliziert

Ich denke, der moderne Shader sollte einen Parameter haben, um diesen Faktor einzustellen und eine solche Gleichung zu schreiben

float factor; // 0.0 - 1.0 maybe reflectiveness?
float3 light = (factor * ambient.rgb); // ambient light
light += _MainLightColor.rgb * dot(normal,_MainLightDirection); // lambert
// maybe also specular
float3 color = ((1 - factor) * ambient.rgb) + (matColor * light);

Eigentlich nehme ich dieses Konzept aus PBR-Material, es gab ein Konzept der Energieeinsparung. Das gesamte Licht kann das Objekt durch Diffusion oder Reflexion beleuchten. Um jedoch Energie zu sparen, bedeutet eine diffusere Farbe eine geringere Reflexion. Umgebungslicht fügt also einfach mehr Lichtenergie hinzu und wird dann genauso behandelt wie anderes Licht

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.