Phong-Beleuchtung - die spiegelnde Beleuchtung hat etwas sehr Merkwürdiges


17

Ich habe Phong-Beleuchtung implementiert. Alles scheint zu funktionieren - Torus und Kugeln leuchten wie erwartet usw. Aber ich bemerke etwas Merkwürdiges in Bezug auf die spiegelnde Beleuchtung von gerichtetem Licht.

Hier sind zwei Screenshots.

Zuerst:

Bildbeschreibung hier eingeben

Zweite:

Bildbeschreibung hier eingeben

Wie Sie sehen können, hat mehr Fläche eine spiegelnde Beleuchtung, wenn die Kamera weit von einem Objekt entfernt ist.

Hier sind vereinfachte Vertex-Shader:

#version 330 core

layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec3 vertexNorm;
layout(location = 2) in vec2 vertexUV;

uniform mat4 MVP;
uniform mat4 M;

out vec2 fragmentUV;
out vec3 fragmentNormal;
out vec3 fragmentPos;

void main() {
  fragmentUV = vertexUV;
  fragmentNormal = (M * vec4(vertexNorm, 0)).xyz;
  fragmentPos = (M * vec4(vertexPos, 1)).xyz;

  gl_Position = MVP * vec4(vertexPos, 1);
}

... und Fragment Shader:

#version 330 core

in vec2 fragmentUV;
in vec3 fragmentNormal;
in vec3 fragmentPos;

struct DirectionalLight {
  vec3 Color;
  vec3 Direction;
  float AmbientIntensity;
  float DiffuseIntensity;
};

uniform sampler2D textureSampler;
uniform vec3 cameraPos;
uniform float materialSpecularFactor;
uniform float materialSpecularIntensity;
uniform DirectionalLight directionalLight;

out vec4 color;

void main() {
  vec3 normal = normalize(fragmentNormal); // should be normalized after interpolation

  vec4 ambientColor = vec4(directionalLight.Color, 1) * directionalLight.AmbientIntensity;

  float diffuseFactor = clamp(dot(normal, -directionalLight.Direction), 0, 1);
  vec4 diffuseColor = vec4(directionalLight.Color, 1) * directionalLight.DiffuseIntensity * diffuseFactor;

  vec3 vertexToCamera = normalize(cameraPos - fragmentPos);
  vec3 lightReflect = normalize(reflect(directionalLight.Direction, normal));
  float specularFactor = pow(clamp(dot(vertexToCamera, lightReflect), 0, 1), materialSpecularFactor);
  vec4 specularColor = vec4(directionalLight.Color, 1) * materialSpecularIntensity * specularFactor;

  color = texture(textureSampler, fragmentUV) * (ambientColor + diffuseColor + specularColor);
}

Der vollständige Quellcode ohne jegliche Vereinfachung kann in diesem Repository gefunden werden .

Ich wollte wissen, ob ich etwas falsch umgesetzt habe. Oder ist es OK für Phong-Beleuchtung?


2
Es gibt einen Computergrafikstapel, auf den Sie mit dieser Frage möglicherweise bessere Antworten finden.
Andrew Wilson

Antworten:


34

spiegelnde Beleuchtung des gerichteten Lichts

Mehr Fläche hat spiegelnde Beleuchtung, wenn die Kamera weit von einem Objekt entfernt ist

Ja, sieht richtig aus für mich.

Die spiegelnde Fläche für gerichtetes Licht soll für die Kamera bei gleicher Reflexionsfläche mehr oder weniger konstant sein. Zum Vergleich können wir das Phänomen betrachten , das als Sunglint bekannt ist und das im Grunde eine spiegelnde Reflexion der Sonne auf dem Wasser ist. Dies ist ein gutes Analogon zu Ihrer Phong-Beleuchtung.

Beispiel 1: Die Fläche von Sonneneinstrahlung entspricht in etwa der Fläche eines Wohngrundstücks

Sunglint über See

http://academic.emporia.edu/aberjame/remote/lec10/lec10.htm

Beispiel 2: Gebiet mit Sonneneinstrahlung in der Nähe der Großen Seen

Sunglint über Great Lakes

http://earthobservatory.nasa.gov/IOTD/view.php?id=78617

Tatsächlich vergrößert sich der Bereich mit den Sonnenstrahlen so lange, bis Sie weit genug von der Erde entfernt sind, dass er aus Ihrer Sicht eher rund als flach ist.

In Bezug auf das Phong-Reflexionsmodell hängt das Spiegelbild von drei Richtungen ab: dem Auge, dem Licht und der Oberfläche. Da Ihre Kamera auf dieselbe Oberfläche schaut und sich nur wegbewegt, bleibt das Auge gleich. Die Oberfläche bleibt eben und das Licht per definitionem gleich (es ist ein gerichtetes Licht), daher ist die Spiegelreflexion dieselbe - natürlich aus der Perspektive der Kamera / des Bildschirms.


1
Liebe die realen Beispiele Antwort auf eine Programmierfrage
defhlt

Verdammt, Sie haben mich dazu gebracht, ein Konto zu erstellen, nur um meine Meinung zu verbessern.
Spongman
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.