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:
Zweite:
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?
Antworten:
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
Beispiel 2: Gebiet mit Sonneneinstrahlung in der Nähe der Großen Seen
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.
quelle