2012-02-21 16 views
5

सेट करने में विफल रहता है मैं एक साधारण जाल पर एक बनावट खींचने के लिए ओपनजीएल और जीएलएसएल का उपयोग कर रहा हूं।glUniform नमूना मूल्य

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

glUseProgram(programObject); 

glUniform1i(glGetUniformLocation(programObject, "texture"), 1); 
GLint val; 
glGetUniformiv(programObject, 
       glGetUniformLocation(programObject, "texture"), 
       &val); 
printf("Value is %d\n", val); 

कमांड लाइन से बाहर पर मुद्रित मूल्य 0. मैं जाँच की है कि shaders सही ढंग से संकलित किए जाते हैं और कार्यक्रम सही ढंग से जुड़ा हुआ है। glGetUniformLocation एक सूचकांक आउटपुट करता है> 0. इसके अलावा, glGetError किसी भी बिंदु पर किसी भी त्रुटि का आउटपुट नहीं करता है।

यह तब होता है जब वर्दी एक नमूना होता है। चूंकि बनावट सेट नहीं है, शेडर में इसे घुमाते हुए हमेशा (0, 0, 0, 1) लौटाता है। (मैंने apitrace का उपयोग करके भी चेक किया है, कि मेरा बनावट GL_TEXTURE1 पर सही ढंग से बाध्य है, जो दिखाए गए कोड के तुरंत बाद किया जाता है)।

मैंने इस समस्या के लिए बड़े पैमाने पर खोज की है और मुझे केवल here के समान कुछ उदाहरण मिला है। समाधान जीएलईडब्ल्यू शुरू करना था, लेकिन यह मेरे लिए काम नहीं किया है।

मुझे किसी भी विस्तृत जानकारी की आवश्यकता है (या एपिट्रेस से ट्रेस) प्रदान करने में मुझे खुशी है।

uniform sampler2D texture; 

varying vec2 textureCoord; 

void main() { 
    gl_FragColor = texture2D(texture, textureCoord); 
} 

समाधान

मैं कुछ काम करने के बाद समस्या को हल करने में कामयाब रहे:

संपादित

यहाँ शेडर है।

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

बनावट की समस्या (0, 0, 0, 1) की समस्या हमेशा बनावट की पीढ़ी के दौरान बनाई गई गलती के कारण थी।

अब glGerUniformiv अभी भी 0 लौटाता है, लेकिन उपयोग की गई बनावट सही है।

+0

आपको शेडर भी पोस्ट करना चाहिए। –

+2

क्या आपने इसे कुछ और नाम देने का प्रयास किया है (बनावट भी अंतर्निहित जीएलएसएल फ़ंक्शन है, जबकि तकनीकी रूप से कोई कीवर्ड नहीं है, मैं गारंटी नहीं दूंगा कि यह काम करेगा)। – KillianDS

+0

मैंने वर्दी को "मायटेक्चर" में बदलने का प्रयास किया लेकिन परिणाम दुर्भाग्य से वही है। – fescrb

उत्तर

3

समाधान

मैं कुछ काम करने के बाद समस्या को हल करने में कामयाब रहे।

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

बनावट की समस्या (0, 0, 0, 1) की समस्या हमेशा बनावट की पीढ़ी के दौरान बनाई गई गलती के कारण थी।

अब glGerUniformiv अभी भी 0 लौटाता है, लेकिन उपयोग की गई बनावट सही है।