Phong lighting - มีบางอย่างแปลก ๆ ที่มีแสง specular


17

ฉันนำแสงพงษ์มาใช้ ดูเหมือนว่าทุกอย่างจะทำงาน - พรูและทรงกลมก็สว่างตามที่คาดไว้ ฯลฯ แต่ฉันสังเกตเห็นบางสิ่งที่แปลกเกี่ยวกับแสงแบบส่องทางของแสงทิศทาง

นี่คือภาพหน้าจอสองภาพ

ครั้งแรก:

ป้อนคำอธิบายรูปภาพที่นี่

ประการที่สอง:

ป้อนคำอธิบายรูปภาพที่นี่

ในขณะที่คุณสามารถดูพื้นที่มากขึ้นมีแสงส่องสว่างเป็นพิเศษเมื่อกล้องอยู่ไกลจากวัตถุ

นี่คือจุดสุดยอด 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);
}

... และชิ้นส่วน 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);
}

ซอร์สโค้ดแบบเต็มที่ไม่มีการทำให้เข้าใจง่ายสามารถพบได้ในที่เก็บนี้

ฉันอยากรู้ว่าฉันทำอะไรผิดไปหรือไม่ หรือว่าตกลงกับไฟพงษ์?


2
มีสแต็กกราฟิกคอมพิวเตอร์ที่คุณอาจพบคำตอบที่ดีกว่าสำหรับคำถามนี้
Andrew Wilson

คำตอบ:


34

แสง specular ของแสงทิศทาง

พื้นที่ส่วนใหญ่มีแสงแบบ specular เมื่อกล้องอยู่ไกลจากวัตถุ

ใช่มองไปที่ฉัน

พื้นที่ specular สำหรับไฟทิศทางควรจะมากหรือน้อยคง wrt กล้องให้พื้นผิวสะท้อนเดียวกัน ในการเปรียบเทียบเราสามารถดูปรากฏการณ์ที่เรียกว่าsunglintซึ่งโดยทั่วไปเป็นการสะท้อนแบบ specular ของดวงอาทิตย์บนน้ำและเนื่องจากดวงอาทิตย์อยู่ใกล้กับแหล่งกำเนิดแสงทิศทางสำหรับจุดประสงค์ของโลกและพื้นผิวการสะท้อนเป็นโลกที่มีลักษณะแบนราบ นี่เป็นสัญญาณอะนาล็อกที่ดีของไฟพงษ์ของคุณ

ตัวอย่างที่ 1: พื้นที่ของ sunglint คร่าว ๆ เหมือนกับที่อยู่อาศัยจำนวนมาก

Sunglint เหนือทะเลสาบ

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

ตัวอย่างที่ 2: พื้นที่ของ sunglint ใกล้เคียงกับ Great Lakes

Sunglint เหนือเกรตเลกส์

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

ในความเป็นจริงพื้นที่ sunglint จะขยายใหญ่ขึ้นเรื่อย ๆ จนกว่าคุณจะห่างจากโลกมากพอที่จะทำให้มันกลมกว่าแบนจากมุมมองของคุณ

ในแง่ของแบบจำลองการสะท้อนพองนั้น specular ขึ้นอยู่กับสามทิศทาง: ตาแสงและพื้นผิว เมื่อกล้องของคุณมองที่พื้นผิวเดียวกันเพียงแค่ขยับออกไปดวงตาก็ยังคงเหมือนเดิม พื้นผิวยังคงเหมือนเดิมโดยอาศัยความเรียบและแสงยังคงเหมือนเดิมโดยคำจำกัดความ (มันเป็นแสงทิศทาง) ดังนั้นการสะท้อนแบบ specular จะเหมือนกัน - จากมุมมองของกล้อง / หน้าจอ


1
รักตัวอย่างชีวิตจริงตอบคำถามการเขียนโปรแกรม
defhlt

dammit คุณทำให้ฉันสร้างบัญชีเพื่อ upvote
Spongman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.