2011-07-12 46 views
7

मैं शेडर्स का उपयोग करके ओपनजीएल 2.1 एप्लिकेशन विकसित कर रहा हूं और मुझे प्रति-खंड प्रकाश के साथ समस्या हो रही है। जब मेरा दृश्य प्रारंभिक भार होता है तो प्रकाश सही होता है, लेकिन जब मैं दृश्य के चारों ओर नेविगेट करता हूं, तो प्रकाश स्थिर स्थिति में रहने के बजाय "कैमरा" के साथ घूमता है। उदाहरण के लिए, यदि मैं अपने प्रकाश मार्ग को दाईं ओर रखता हूं, तो वस्तुओं के दाहिने तरफ रोशनी होगी। अगर मैं ऑब्जेक्ट के दूसरी तरफ कैमरे को ले जाता हूं और विपरीत दिशा में इंगित करता हूं, तो प्रकाश अभी भी ऑब्जेक्ट के दायीं तरफ है (बाएं होने के बजाए, जैसा कि अब होना चाहिए)। मुझे लगता है कि मैं गलत समन्वय प्रणाली में प्रकाश की गणना कर रहा हूं, और इससे गलत व्यवहार हो रहा है। मैं निम्नलिखित तरीके से प्रकाश व्यवस्था की गणना कर रहा हूँ ...प्रति-खंड प्रकाश समन्वय प्रणाली

शिखर शेडर में ...

ECPosition = gl_ModelViewMatrix * gl_Vertex; 
WCNormal = gl_NormalMatrix * vertexNormal; 

जहां vertexNormal वस्तु/मॉडल अंतरिक्ष में सामान्य है।

टुकड़ा शेडर में ...

float lightIntensity = 0.2; //ambient 
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse 

जहां LightPosition उदाहरण के लिए, है, (100.0, 10.0, 0.0), जैसा कि ऊपर वर्णित है जो दुनिया के दाईं ओर प्रकाश डाला जाएगा। जिस हिस्से को मैं अनिश्चित हूं, वह gl_NormalMatrix भाग है। मुझे बिल्कुल यकीन नहीं है कि यह मैट्रिक्स क्या है और यह किस समन्वय स्थान में अपना सामान्य रखता है (मुझे विश्व स्थान लगता है)। यदि सामान्य दुनिया में रखा जाता है, तो मुझे लगा कि समस्या यह थी कि ईसीपीशन आंखों की जगह में है जबकि लाइटपॉजिशन और डब्ल्यूसीनोर्मल विश्व अंतरिक्ष में हैं। इसके बारे में कुछ सही नहीं लगता है लेकिन मैं इसे समझ नहीं सकता। मैंने अपने स्वयं के मॉडल मैट्रिक्स द्वारा इसे गुणा करके विश्व अंतरिक्ष में ईसीपीशन डालने का भी प्रयास किया जिसमें केवल विश्व अंतरिक्ष में समन्वय प्राप्त करने के लिए किए गए परिवर्तन शामिल हैं, लेकिन यह काम नहीं करता है। अगर मुझे अपने शेडर्स या कोड के बारे में अन्य जानकारी प्रदान करने की ज़रूरत है तो मुझे बताएं।

उत्तर

6

gl_NormalMatrix आपके सामान्य को आंखों के स्थान में बदल देता है (अधिक जानकारी के लिए this tutorial देखें)।

मैं अपने प्रकाश एक स्थिर दुनिया स्थिति में आप अपने वर्तमान दृश्य मैट्रिक्स द्वारा यह गुणा करके साथ ही आंख को अंतरिक्ष में अपने LightPosition बदलने के लिए होना चाहिए में हो सकें, इसके लिए लगता है।

+0

gl_NormalMatrix के बारे में अच्छा ट्यूटोरियल। मैं अब समझता हूँ। मैं अपनी लाइटपॉजिशन को आंखों के स्थान में बदलने की कोशिश कर रहा हूं और देखता हूं कि क्या होता है। अच्छा सुझाव – Nitrex88

+0

हाँ काम किया! समझ में आता है ... धन्यवाद दोस्त! – Nitrex88