Saya menerapkan pencahayaan Phong. Segalanya tampak bekerja - torus dan bola menyala seperti yang diharapkan, dll. Tapi saya melihat sesuatu yang aneh mengenai pencahayaan specular cahaya terarah.
Berikut ini dua tangkapan layar.
Pertama:
Kedua:
Seperti yang Anda lihat, lebih banyak area memiliki pencahayaan specular ketika kamera jauh dari objek.
Berikut adalah vertex shader yang disederhanakan:
#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);
}
... dan fragmen 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);
}
Kode sumber lengkap tanpa penyederhanaan dapat ditemukan di repositori ini .
Saya ingin tahu apakah saya menerapkan sesuatu yang salah. Atau tidak apa-apa untuk pencahayaan Phong?
Jawaban:
Yap, terlihat benar bagi saya.
Area specular untuk lampu arah seharusnya lebih atau kurang konstan pada kamera, mengingat permukaan pantulan yang sama. Untuk membandingkan, kita dapat melihat fenomena yang dikenal sebagai sunglint , yang pada dasarnya adalah pantulan matahari pada air, dan karena Matahari kira-kira merupakan sumber cahaya terarah untuk keperluan terestrial, dan permukaan pantulannya adalah Bumi yang kira-kira rata, ini adalah analog yang bagus untuk pencahayaan Phong Anda.
Contoh 1: area sunglint kira-kira sama dengan lot perumahan
Contoh 2: luas sunglint yang mendekati Danau Besar
Faktanya, area sunglint akan terus membesar sampai Anda cukup jauh dari Bumi sehingga lebih bundar daripada rata, dari sudut pandang Anda.
Dalam hal model refleksi Phong, specular tergantung pada tiga arah: mata, cahaya, dan permukaan. Karena kamera Anda melihat permukaan yang sama, hanya bergerak menjauh, mata tetap sama; permukaan tetap sama berdasarkan flat, dan cahayanya tetap sama dengan definisi (itu adalah cahaya arah), oleh karena itu refleksi spekulernya akan sama - dari perspektif kamera / layar, tentu saja.
sumber