2012-10-25 6 views
16

ठीक है, तो ये बनावट वास्तव में मुझे भ्रमित कर रही हैं। मैं this ट्यूटोरियल देख रहा हूं (जो मुझे लगता है कि महान है), विशेष रूप से छवि "आप 32 बनावट इकाइयों को परिभाषित कर सकते हैं, लेकिन प्रति शेडर तक 8 बनावट तक परिभाषित कर सकते हैं।" जैसा कि मैं इसे समझता हूं, यहां बताया गया है कि यह कैसे काम करता है:ओपनगल 2 - जब glbindTexture, और glActiveTxture के लिए कब?

आप एक बनावट इकाई सक्रिय करते हैं। फिर आप उस इकाई के भीतर एक निश्चित लक्ष्य के लिए एक बनावट वस्तु (छवि में 'बनावट डेटा' क्यूब्स के समान) बांधें। इसलिए, ऑब्जेक्ट्स बनाने के लिए glGenTextures & उनके नाम प्राप्त करते हैं, और फिर उस बनावट को TEXTURE_2D या कुछ (मुझे इस समय अन्य लक्ष्यों में दिलचस्पी नहीं है) को बांधने के लिए glBindTexture। फिर आप glTexImage2D के साथ बनावट डेटा निर्दिष्ट कर सकते हैं।

अब। मैं 3 शेडर प्रोग्राम का उपयोग कर रहा हूं, प्रत्येक में अलग-अलग बनावट की आवश्यकता है। यहाँ मैं क्या करना चाहते हैं:

एक आरंभीकरण चरण में, मैं अपने बनावट इकाइयों में से प्रत्येक के माध्यम से जाना है, और जाना

  • glActiveTexture
  • glBindTexture (सक्रिय बनावट इकाई पर चल रही है)
  • glTexImage2D (वर्तमान में बाध्य वस्तु पर चल रही है)

और shaders के लिए, मैं करने के लिए 'मैं' मान glActiveTexture की GL_TEXTUREi में निर्दिष्ट प्रत्येक शेडर में एक समान मैच के लिए glUniform। मुझे केवल चार बनावट की आवश्यकता है, और वे बहुत छोटे हैं।

अब, प्रतिपादन के दौरान, मुझे प्रोग्राम ठीक से स्विच करने में सक्षम होना चाहिए, और सब कुछ काम करता है, है ना? प्रत्येक प्रोग्राम में पहले से ही एक वर्दी है जो निर्दिष्ट करने के लिए इकाई का उपयोग करती है, और प्रत्येक इकाई के पास पहले से ही एक ऑब्जेक्ट है जो उसके टेक्स्ट 2 डी लक्ष्य से जुड़ा हुआ है, और प्रत्येक ऑब्जेक्ट में glTexImage2D द्वारा निर्दिष्ट डेटा है, है ना? तो मेरे प्रस्तुत समारोह में कोई बाध्यकारी या सक्रिय इकाइयों की आवश्यकता नहीं है? कम से कम इस तरह मैं इसे समझ गया, लेकिन मुझे गलत जगहों पर गलत बनावट मिल रही है।

इसके अलावा, मेरे एक कार्यक्रम में मैं एक सतह के लिए तीन बनावट के बीच स्विच करना चाहता हूं। तो मैंने सोचा कि मैं प्रत्येक बनावट को किसी ऑब्जेक्ट में लोड करता हूं, और प्रत्येक ऑब्जेक्ट को एक इकाई में बांधता हूं, फिर समय प्रस्तुत करने पर मैं केवल उस प्रोग्राम को बताने के लिए ग्लूनिफॉर्म कर सकता हूं जो बनावट इकाई का उपयोग करने के लिए है।

तो मैं सोच रहा हूं कि क्या मैंने ओपनजीएल में टेक्सचरिंग की मौलिक संरचना को गलत समझा है, या क्या प्रोग्राम्स स्विच होने पर ऑब्जेक्ट्स की ऑब्जेक्ट्स की बाइंडिंग समाप्त हो जाती है या ऐसा कुछ। या क्या मुझे एक बनावट को कई बार बांधना है - लेकिन कब, और क्यों?

+1

ऐसा लगता है कि आपके पास सही विचार है, मुझे दोष दिखाई नहीं देता है। शायद आप ** न्यूनतम ** उदाहरण डाल सकते हैं जिसमें आपको गलत बनावट मिलती है, ताकि हम देख सकें कि आपने कोई गलती नहीं की है या नहीं? – Tim

+1

मैंने इस सवाल को देखा जब मुझे एक समान समस्या थी। मेरी समस्या एक स्थैतिक चर के कारण थी जो स्थैतिक नहीं होना चाहिए था। मैं आईओएस के लिए विकास कर रहा हूं और मैं इसे एक्सकोड में ओपनजीएल डीबगर का उपयोग करके समझने में सक्षम था। सुनिश्चित नहीं है कि आप आईओएस पर हैं, लेकिन अगर आप ट्यूटोरियल्स के साथ शुरुआत कर रहे हैं, तो मैंने सोचा कि यह डीबगर को इंगित करने में मददगार होगा: http://developer.apple.com/library/mac/#recipes/ xcode_help-debugger/articles/debugging_opengl_es_frame.html – GingerBreadMane

+0

@Shitesh - क्या आपने कभी अपनी समस्या का समाधान किया है? – nbubis

उत्तर

11

प्रत्येक बनावट ऑब्जेक्ट के लिए glTexParameteri सेट करना न भूलें।

void loadTextures() { 
    GLint texture_object_handles[3]; 
    glGenTextures(3, texture_object_handles); 

    for (int i = 0 ; i < 3 ; ++i) { 
     glActiveTexture(GL_TEXTURE0 + i); 
     glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexImage2D(GL_TEXTURE_2D, ...); 
    } 
    return; 
} 


void draw() { 
    // Draw three different materials without rebinding any textures. 
    for (i = 0 ; i < 3 : ++i) { 
     ... specify other uniforms and attributes 
     glUniform1i(texture_location, i); 
     ... 
     glDrawElements(...); 
    } 
    return; 
}  
+0

ध्यान दें कि MAG_FILTER के लिए डिफ़ॉल्ट GL_LINEAR है, इसलिए आपको इसे सेट करने की आवश्यकता नहीं है। – Tim

+0

धन्यवाद। उदाहरण को संक्षिप्त बनाने के लिए इसे बदल दिया। – umlum