ओपनजीएल तकनीक अविश्वसनीय रूप से अपारदर्शी और भ्रमित हो सकती है। मुझे पता है! मैं ओपनजीएल के आधार पर 3 डी इंजन लिख रहा हूं (ऑफ और ऑन)। समस्या के मेरे मामले में, मैं अंतर्निहित 3 डी एपीआई (ओपनजीएल) को छिपाने के लिए इंजन लिखता हूं, इसलिए एक बार जब मैं कुछ काम करता हूं तो मैं कभी भी ओपनजीएल कोड को कभी नहीं देखता।
लेकिन यहां एक तकनीक है जो मेरे दिमाग को "ओपनजीएल मार्ग" को समझने में मदद करती है। मुझे लगता है कि इसके बारे में सोचने का यह तरीका सच है (लेकिन पूरी कहानी नहीं)।
हार्डवेयर ग्राफिक्स/जीपीयू कार्ड के बारे में सोचें। उनके पास हार्डवेयर में लागू कुछ क्षमताओं हैं। उदाहरण के लिए, जीपीयू केवल एक समय में एक बनावट को लिखने (लिखने) में सक्षम हो सकता है। फिर भी, यह अनिवार्य है कि जीपीयू में जीपीयू के अंदर रैम के भीतर कई बनावट हैं, क्योंकि सीपीयू मेमोरी और जीपीयू मेमोरी के बीच स्थानांतरण बहुत धीमा है।
तो ओपनजीएल एपीआई क्या करता है "सक्रिय बनावट" की धारणा बनाने के लिए। फिर जब हम एक बनावट में एक चित्र को कॉपी करने के लिए एक ओपन एपीआई फ़ंक्शन को कॉल करें, हम इसे इस तरह से कार्य करना होगा:
1: generate a texture and assign its identifier to an unsigned integer variable.
2: bind the texture to the GL_TEXTURE bind point (or some such bind point).
3: specify the size and format of the texture bound to GL_TEXTURE target.
4: copy some image we want on the texture to the GL_TEXTURE target.
और यदि हम एक और बनावट पर एक छवि आकर्षित करने के लिए चाहते हैं, हम कि एक ही प्रक्रिया दोहरानी होगी।
जब हम डिस्प्ले पर कुछ प्रस्तुत करने के लिए आखिरकार तैयार होते हैं, तो हमें अपने एक और अधिक बनावट बनाने के लिए हमारे कोड की आवश्यकता होती है और हमारे टुकड़े शेडर द्वारा सुलभ होने के लिए छवियों की प्रतिलिपि बनाई जाती है।
जैसा कि यह पता चला है, टुकड़ा शेडर कई "बनावट इकाइयों" (एक बनावट प्रति बनावट बनावट) तक पहुंचकर एक समय में एक से अधिक बनावट तक पहुंच सकता है। इसलिए, हमारे कोड को उन बनावटों को बांधना चाहिए जिन्हें हम बनावट इकाइयों के लिए उपलब्ध करना चाहते हैं, हमारे टुकड़े के टुकड़े उन्हें उम्मीद करते हैं।
तो हम कुछ इस तरह करना चाहिए: अब
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D, mytexture0);
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_2D, mytexture1);
glActiveTexture (GL_TEXTURE2);
glBindTexture (GL_TEXTURE_2D, mytexture2);
glActiveTexture (GL_TEXTURE3);
glBindTexture (GL_TEXTURE_2D, mytexture3);
, मुझे कहना पड़ेगा कि मैं कई कारणों से ओपन प्यार करता हूँ, लेकिन इस दृष्टिकोण मुझे पागल ड्राइव। ऐसा इसलिए है क्योंकि मैंने पिछले कुछ वर्षों से लिखे गए सभी सॉफ्टवेयर इस तरह दिखेगा:
error = glSetTexture (GL_TEXTURE0, GL_TEXTURE_2D, mytexture0);
error = glSetTexture (GL_TEXTURE1, GL_TEXTURE_2D, mytexture1);
error = glSetTexture (GL_TEXTURE2, GL_TEXTURE_2D, mytexture2);
error = glSetTexture (GL_TEXTURE3, GL_TEXTURE_2D, mytexture3);
बामो। इस राज्य को बार-बार स्थापित करने की आवश्यकता नहीं है। बस बनावट को जोड़ने के लिए बनावट को जोड़ने के लिए बनावट बनाते हैं, साथ ही बनावट-प्रकार को बनाते हैं, साथ ही बनावट की आईडी, और बनावट की आईडी जिसे मैं बनावट इकाई से जोड़ना चाहता हूं।
मुझे एक बनावट को एक छवि को प्रतिलिपि बनाने के लिए सक्रिय बनावट के रूप में बांधने की आवश्यकता नहीं होगी, मैं सिर्फ उस बनावट की आईडी दूंगा जिसे मैं प्रतिलिपि बनाना चाहता हूं। इसे बाध्य होने की आवश्यकता क्यों है?
ठीक है, वहां पकड़ है जो ओपनजीएल को पागल तरीके से संरचित करने के लिए मजबूर करता है। चूंकि हार्डवेयर कुछ चीजें करता है, और सॉफ़्टवेयर ड्राइवर अन्य चीजें करता है, और क्योंकि एक चर है (जीपीयू कार्ड पर निर्भर करता है), जटिलता को नियंत्रण में रखने के लिए उन्हें कुछ तरीके चाहिए।उनका समाधान अनिवार्य रूप से प्रत्येक प्रकार की इकाई/वस्तु के लिए केवल एक बाध्य बिंदु है, और इसके लिए हम उन कार्यों को बुलाए जाने से पहले उन इकाइयों को बांधने की आवश्यकता होती है, जिन्हें हम उन्हें जोड़ते हैं। और एक दूसरे उद्देश्य के रूप में, बाध्यकारी संस्थाएं उन्हें जीपीयू, और जीपीयू में निष्पादित हमारे विभिन्न शेडर्स के लिए उपलब्ध कराती हैं।
कम से कम मैं अपने सिर में "ओपनजीएल रास्ता" कैसे रखता हूं। वाकई, अगर कोई वास्तव में, वास्तव में, वास्तव में सभी कारणों को समझता है ओपनजीएल (और होना चाहिए) जिस तरह से संरचित है, मैं उन्हें अपना जवाब पोस्ट करना पसंद करूंगा। मेरा मानना है कि यह एक महत्वपूर्ण सवाल और विषय है, और तर्क शायद ही कभी वर्णित है, जैसा कि कभी भी वर्णित है, इस तरह से बहुत कम है कि मेरा दंड मस्तिष्क समझ सकता है।
एक बात ध्यान में रखना ... जब कोई सामान्य रूप से "बांध" कहता है। 'बी = 5' आपने अभी' 5' से 'b' को बाध्य किया है। 'सी =" asdf "' आपने बस 'asdf "' to' c' को बाध्य किया है। आप सुंदर (या बदसूरत) "नाम" के लिए "स्मृति" "बाध्य" करें। – n611x007