2010-05-06 14 views
11
कहें कि आपके पास ऐसा कुछ है: सही ओपनजीएल व्यवहार क्या है? 1 डी बनावट, 2 डी या दोनों को आकर्षित करने के लिए? प्रत्येक सक्रिय बनावट के लिए वास्तव में कई बनावट हैं जो एक ही समय में इसके साथ बाध्य हो सकती हैं (यानी 1 डी, 2 डी, 3 डी घन मानचित्र, आदि)?

उत्तर

13

बाइंडिंग के लिए जीएल राज्य एक बनावट नाम प्रति लक्ष्य (यानी 1 डी/2 डी/3 डी/घन) है। तो

glBindTexture(GL_TEXTURE_2D, my2dTex) 
glBindTexture(GL_TEXTURE_1D, my1dTex) 

पर कॉल करते समय जीएल दोनों सेटिंग्स याद रखेगा।

अब, किस जीएल का जवाब का उपयोग करेगा इस पर निर्भर करता है कि आपके पास कोई शेडर है या नहीं।

यदि कोई शेडर चालू है, तो जीएल जो भी शेडर उपयोग करने के लिए कहता है उसका उपयोग करेगा। (sampler1d/sampler2d पर आधारित ...)।

यदि कोई शेडर चालू नहीं है, तो यह पहले निर्भर करता है कि कौन सा glEnable कॉल किया गया है।

glEnable(GL_TEXTURE_2D) 
glEnable(GL_TEXTURE_1D) 

तो दोनों सक्षम होते हैं, वहाँ कल्पना में एक स्थिर प्राथमिकता नियम (3.8.15 जीएल 1.5 कल्पना में बनावट आवेदन) है।

Cube > 3D > 2D > 1D 

तो आपके मामले में, यदि आपके दोनों बनावट लक्ष्य सक्षम हैं, तो 2 डी एक का उपयोग किया जाएगा।

एक तरफ ध्यान दें के रूप में, ध्यान दें कि किस एक शेडर परवाह नहीं करता या नहीं, बनावट लक्ष्य सक्षम है ... जोड़ने के लिए

संपादित करें:

और जो लोग वास्तव में प्राप्त करना चाहते हैं के लिए किरकिरा विवरण के लिए, आप हमेशा प्रत्येक इकाई * प्रत्येक इकाई के लिए बनावट बनाते हैं। नाम 0 (बाध्यकारी स्थिति के लिए डिफ़ॉल्ट) बनावट वस्तुओं की एक श्रृंखला के अनुरूप है, प्रति लक्ष्य एक। glBindTexture(GL_TEXTURE_2D, 0) और glBindTexture(GL_TEXTURE_1D, 0) दोनों एक बनावट बांधते हैं, लेकिन एक ही नहीं ...

यह ऐतिहासिक है, जीएल 1.0 के व्यवहार से मेल खाने के लिए निर्दिष्ट है, जहां बनावट वस्तुएं अभी तक मौजूद नहीं हैं। मुझे यकीन नहीं है कि जीएल 3.0 में बहिष्कार ने इसके साथ क्या किया था।

0

मुझे लगता है कि 1 डी बनावट तैयार की जाएगी। जहां तक ​​मुझे पता है, प्रत्येक बनावट इकाई में एक समय में केवल एक बनावट हो सकती है। बनावट के आयामों की संख्या वास्तव में इसमें नहीं आती है।

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, my2dTex); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_1D, my1dTex); 

यह हालांकि ओपन 2.1 की मेरी जानकारी से आता है, तो कृपया मुझे सही अगर:

एक से अधिक बनावट बाध्य आप एक से अधिक बनावट इकाई (glActiveTexture उपयोग करते हुए) को सक्रिय करने के लिए है, इस तरह की है करने के लिए उन्होंने बाद के संस्करण में कुछ फैंसी न्यू बनावट विस्तार पेश किया है!

+0

क्षमा करें, आप गलत सोचते हैं। बहबार सही उत्तर प्रदान करता है। – Thomas

+0

ठीक है, मैंने आज कुछ नया सीखा। यह मुझे जवाब देने के लिए सिखाएगा जब मेरे पास ओपनजीएल पुस्तक आसान नहीं है! –

0

लागू बनावट अंतिम बार बाइंडटेक्चर दिनचर्या के साथ निर्दिष्ट है।

विनिर्देश से:

नई बनावट वस्तु लक्ष्य करने के लिए बाध्य है, और आयामी स्वरूप की बनावट रहता है और लक्ष्य द्वारा निर्दिष्ट प्रकार जब तक इसे नष्ट कर दिया गया है। .... यदि बाइंड सफल है बाध्य बनावट ऑब्जेक्ट की स्थिति में कोई बदलाव नहीं किया गया है, और लक्ष्य के लिए पिछले बाध्यकारी टूट गया है।

वास्तव में आपके उदाहरण में इसे 1 डी बनावट लागू किया जाएगा, क्योंकि यह सक्रिय बनावट इकाई की स्थिति को "ओवरराइट" करता है।

+1

यहां शब्द लक्ष्य _1D या _2D को संदर्भित करता है। इस मामले में 2 अलग-अलग लक्ष्य शामिल हैं। – Bahbar

+1

'GL_TEXTURE_1D' और' GL_TEXTURE_2D' अलग-अलग लक्ष्य हैं। – Thomas

+0

ठीक है, मुझे यह * * बाद में बहाबार उत्तर पढ़ने के बाद मिला (संपादन से पहले चूक गया!)। अच्छी बात। हमेशा छायांकन भाषा का उपयोग करने के बाद हमेशा सक्षम/अक्षम प्रतिमान भूलना ... – Luca

संबंधित मुद्दे