फोंग लाइटिंग - स्पेक्युलर लाइटिंग के साथ कुछ बहुत अजीब है


17

मैंने फोंग लाइटिंग को लागू किया। सब कुछ काम करने लगता है - टोरस और गोले को उम्मीद के मुताबिक रोशनी दी जाती है, लेकिन मैं दिशात्मक प्रकाश के स्पेक्युलर प्रकाश व्यवस्था के बारे में कुछ अजीब नोटिस करता हूं।

यहाँ दो स्क्रीनशॉट हैं।

प्रथम:

यहां छवि विवरण दर्ज करें

दूसरा:

यहां छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं कि जब कैमरा किसी ऑब्जेक्ट से दूर होता है तो अधिक क्षेत्र में स्पेक्युलर लाइटिंग होती है।

यहां सरलीकृत वर्धमान शेडर हैं:

#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);
}

... और टुकड़े टुकड़े करना:

#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
एक कंप्यूटर ग्राफिक्स स्टैक है जिसे आप इस प्रश्न के साथ बेहतर जवाब पा सकते हैं।
एंड्रयू विल्सन 5

जवाबों:


34

दिशात्मक प्रकाश की स्पेक्युलर लाइटिंग

जब कैमरा किसी वस्तु से दूर हो तो अधिक क्षेत्र में स्पेक्युलर लाइटिंग होती है

हां, मुझे सही लगता है।

दिशात्मक रोशनी के लिए स्पेक्युलर क्षेत्र को कम या ज्यादा लगातार wrt कैमरा माना जाता है, जिसे एक ही परावर्तन सतह दिया जाता है। तुलना करने के लिए, हम sunglint के रूप में जानी जाने वाली घटना को देख सकते हैं , जो मूल रूप से पानी पर सूर्य का विशिष्ट प्रतिबिंब है, और चूंकि सूर्य लगभग स्थलीय उद्देश्यों के लिए एक दिशात्मक प्रकाश स्रोत है, और प्रतिबिंब सतह पृथ्वी है जो लगभग सपाट है, यह आपके Phong प्रकाश का एक अच्छा एनालॉग है।

उदाहरण 1: एक आवासीय आवासीय क्षेत्र के रूप में लगभग उसी तरह का एक प्रकार का पौधा

झील के ऊपर सुंग्लिंट

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

उदाहरण 2: महान झीलों के लिए अनुमानित क्षेत्र

ग्रेट लेक्स पर सुंग्लिंट

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

वास्तव में sunglint क्षेत्र केवल तब तक बड़ा होता रहेगा जब तक कि आप पृथ्वी से उसके लिए अपने दृष्टिकोण से सपाट से अधिक गोल न हों।

फोंग प्रतिबिंब मॉडल के संदर्भ में, स्पेक्युलर तीन दिशाओं पर निर्भर करता है: आंख, प्रकाश और सतह। चूँकि आपका कैमरा एक ही सतह को देख रहा है, बस दूर जा रहा है, आंख वही रहती है; सतह समतल होने के आधार पर समान रहती है, और प्रकाश परिभाषा द्वारा समान रहता है (यह एक दिशात्मक प्रकाश है), इसलिए स्पेक्युलर प्रतिबिंब एक ही होगा - कैमरा / स्क्रीन के दृष्टिकोण से, निश्चित रूप से।


1
एक प्रोग्रामिंग प्रश्न के वास्तविक जीवन के उदाहरणों से प्यार करें
deflt

अरे, आपने मुझे सिर्फ एक खाता बनाने के लिए बनाया है।
स्पॉन्जमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.