Pencahayaan Phong - ada sesuatu yang sangat aneh dengan pencahayaan specular


17

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:

masukkan deskripsi gambar di sini

Kedua:

masukkan deskripsi gambar di sini

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?


2
Ada tumpukan grafik komputer yang Anda mungkin menemukan jawaban yang lebih baik dengan pertanyaan ini.
Andrew Wilson

Jawaban:


34

pencahayaan specular dari cahaya directional

lebih banyak area memiliki pencahayaan specular ketika kamera jauh dari objek

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

Sunglint melewati danau

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

Contoh 2: luas sunglint yang mendekati Danau Besar

Sunglint atas Great Lakes

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

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.


1
Cinta contoh kehidupan nyata menjawab pertanyaan pemrograman
defhlt

Sial, Anda membuat saya membuat akun hanya untuk mengunggah.
Spongman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.