2010-11-17 6 views
25

मैं वर्टेक्स और ज्यामिति शेडर्स बनाने के लिए ओपनजीएल छायांकन भाषा (जीएलएसएल) संस्करण 1.5 का उपयोग करने की कोशिश कर रहा हूं।ओपनजीएल में आप मॉडलव्यू और प्रोजेक्शन मैट्रिस कैसे प्राप्त करते हैं?

मैंने सीखा है कि जीएलएसएल संस्करण 1.5 में, अंतर्निहित चर gl_ModelViewProjectionMatrix को बहिष्कृत कर दिया गया है, इसलिए आपको उन्हें मैन्युअल रूप से पास करना होगा। यदि मैंने पहले से ही मॉडलव्यू और प्रक्षेपण मैट्रिक्स सेट किया है (उदाहरण के लिए gluLookAt और gluPerspective का उपयोग करके) तो मैट्रिक्स को वर्टेक्स और ज्यामिति शेडर्स में कैसे पास किया जाए? मैंने कुछ खोज की है और कुछ साइटें glGetMatrix() फ़ंक्शन का उल्लेख करने लगती हैं, लेकिन मुझे यह फ़ंक्शन किसी भी आधिकारिक दस्तावेज़ीकरण में नहीं मिल रहा है, और यह कार्यान्वित करने में प्रतीत नहीं होता है (मुझे संकलन त्रुटि unknown identifier: glGetMatrix मिलती है जब मैं इसे उस फ़ंक्शन के साथ संकलित करने का प्रयास करता हूं)।

उत्तर

56

अरे, यहाँ एक सा धीमा करते हैं :) हां, यह है कि आप glGetFloatv(GL_MODELVIEW_MATRIX, ptr) द्वारा मैट्रिक्स प्राप्त सच है। .. लेकिन यह निश्चित रूप से यह नहीं है कि आपको यहां क्या करना चाहिए!

मुझे स्पष्ट करने दें:

GLSL में, अंतर्निहित या gl_ModelViewProjectionMatrix की तरह चर ftransform() जैसे कार्यों का बहिष्कार कर रहे हैं - यह सही है, लेकिन यह है कि सिर्फ इसलिए कि पूरे मैट्रिक्स ढेर जीएल 3.x में पदावनत है और आपको अपने स्वयं के मैट्रिक्स स्टैक का उपयोग करना होगा (या किसी अन्य समाधान का उपयोग करना चाहिए, एक मैट्रिक्स स्टैक सहायक है लेकिन अनिवार्य नहीं है!)।

यदि आप अभी भी मैट्रिक्स स्टैक का उपयोग कर रहे हैं, तो आप OpenGL 2.x या 1.x से कार्यक्षमता पर भरोसा कर रहे हैं। यह ठीक है क्योंकि जीएल संगतता प्रोफाइल की वजह से यह सब अभी भी आधुनिक ग्राफिक्स कार्ड पर समर्थित है - नए जीएल संस्करण में स्विच करना अच्छा है, लेकिन आप इसके लिए अभी भी रह सकते हैं।

लेकिन यदि आप ओपनजीएल (मैट्रिक्स स्टैक के साथ) के पुराने संस्करण का उपयोग कर रहे हैं, तो जीएलएसएल के पुराने संस्करण का भी उपयोग करें। 1.2 का प्रयास करें, क्योंकि उच्च संस्करण (आपके 1.5 सहित) को OpenGL3 के साथ संगत होने के लिए डिज़ाइन किया गया है, जहां प्रोजेक्शन या मॉडलव्यू मैट्रिस जैसी चीजें ओपनजीएल में मौजूद नहीं हैं और यदि आवश्यक हो तो कस्टम, उपयोगकर्ता-परिभाषित uniform चर के रूप में स्पष्ट रूप से पारित होने की उम्मीद है ।

(इससे पहले कि वे संस्करण से मेल करने के लिए नंबर साफ) थोड़ा मुश्किल हुआ करता था ओपन और GLSL संस्करणों के बीच पत्राचार, लेकिन यह कम या ज्यादा के समान होना चाहिए:

GL GLSL 

4.1 - 4.1 
4.0 - 4.0 
3.3 - 3.3 
3.2 - 1.5 
3.1 - 1.4 
3.0 - 1.3 
2.x and lower - 1.2 and lower 

तो, लम्बी कहानी लघु - शेडर बिल्टिन वर्दी को बहिष्कृत कर दिया गया है क्योंकि ओपनजीएल में इसी कार्यक्षमता को भी बहिष्कृत किया गया है; या तो ओपनजीएल के उच्च संस्करण या जीएलएसएल के निचले संस्करण के लिए जाएं।

+0

+1 यह एक उत्कृष्ट बिंदु है जिसे आपने उठाया है! – Stringer

+0

तो मैट्रिक्स स्टैक की कमी के साथ, मुझे यकीन नहीं है कि नया दृष्टिकोण क्या होना चाहिए। हमारे पुराने कोड में हमने इंस्टॉलेशन ऑब्जेक्ट्स में ट्रांसफॉर्मेशन लगाए और प्रत्येक को एक सामान्य फ़ंक्शन से प्रस्तुत किया। तो ऐसा लगता है कि इसे काम करने के लिए मुझे हर ट्रांसफॉर्म के बाद मैन्युअल रूप से मॉडल व्यू मैट्रिक्स को अपडेट करना होगा। ऐसा करने के लिए नया प्रतिमान क्या है? – Nigel

+1

यदि आप जीएल 3 + में मैट्रिक्स स्टैक चाहते हैं, तो 'std :: vector ' बनाएं और 'glUniformMatrix4fv' के साथ शीर्षतम मैट्रिक्स ऑब्जेक्ट को पास करें। आप उनमें से कई हो सकते हैं, और आप यह तय करने में सक्षम हैं कि अपने शेडरों में प्रत्येक का उपयोग कैसे करें। – Kos

10

आप glGetxxxx साथ स्थिरांक GL_MODELVIEW_MATRIX या GL_PROJECTION_MATRIX का उपयोग या तो मैट्रिक्स प्राप्त करने के लिए:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
1
float modelview[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, modelview); 
संबंधित मुद्दे