2009-04-12 12 views
7

मैं ओपनजीएल में बनावट मैपिंग को समझने की कोशिश कर रहा हूं और मुझे काम करने के लिए एक साधारण उदाहरण नहीं मिल रहा है।सरल ओपनजीएल बनावट मानचित्र काम नहीं कर रहा है?

बहुभुज तैयार किया जा रहा है, हालांकि यह बनावट नहीं है बल्कि केवल एक ठोस रंग है। इसके अलावा बिटमैप को sprite1 में सही ढंग से लोड किया जा रहा है [] क्योंकि मैं सफलतापूर्वक gldrawPixels का उपयोग कर रहा था।

मैं अपने टेक्स्ट नाम प्राप्त करने के लिए glGenTextures का उपयोग करता हूं, लेकिन मुझे लगता है कि यह texName1 नहीं बदलता है; यह GLuint जो भी मैं इसे शुरू करता हूं, glGenTextures पर कॉल के बाद भी ...

मैंने GL_TEXTURE_2D सक्षम किया है।

यहाँ कोड:

GLuint texName1 = 0; 

glGenTextures(1, &texName1); 
glBindTexture(GL_TEXTURE_2D, texName1); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]); 

glColor3f(1, 1, 0); 
glBindTexture(GL_TEXTURE_2D, texName1); 
glBegin(GL_QUADS); 
    glTexCoord2f (0.0, 0.0); 
    glVertex3f (0.0, 0.0, -5.0f); 
    glTexCoord2f (1.0, 0.0); 
    glVertex3f (.5, 0.0, -5.0f); 
    glTexCoord2f (1.0, 1.0); 
    glVertex3f (.5, .5, -5.0f); 
    glTexCoord2f (0.0, 1.0); 
    glVertex3f (0.0, .5, -5.0f); 
glEnd(); 

अद्यतन: मैं एक नुकसान में हूँ। यहां मैंने जो भी कोशिश की है, वह है:

  1. बाहर निकलता है कि ओजीएल शुरू होने से पहले मैं अपने बनावट को शुरू कर रहा था। एक वर्ग के कन्स्ट्रक्टर में बनावट (glGenTextures-> glTexImage2D) शुरू की गई है और प्रत्येक फ्रेम नामक सदस्य फ़ंक्शन में खींचा गया है (glBegin-> glEnd)। genTextures अब सही ढंग से काम कर रहे प्रतीत होता है और मुझे 1 का नाम मिल रहा है।

  2. GL_RGBA8, GL_BGRA_EXT का हर संभव संयोजन (GL_BGRA मेरे सिस्टम पर काम नहीं करता है; मुझे _EXT की आवश्यकता है), और मैंने इसे भी हटा दिया बिटमैप से अल्फा चैनल और जीएल_आरजीबी, जीएलबीजीआर_एक्सटी इत्यादि के सभी संयोजनों की कोशिश की। कोई भाग्य नहीं।

  3. procedurally एक बिटमैप बनाने और का उपयोग कर कि

  4. यकीन GL_COLOR_MATERIAL सक्षम नहीं है निर्मित की कोशिश की।

  5. बदल गया बिटमैप आकार 32x32 पर।

  6. glTexEnvf के बजाय glTexEnvi का प्रयास किया।

+1

यदि texName1 glgenTextures के बाद 0 शेष है तो आपको अपनी त्रुटि स्थितियों की जांच करनी चाहिए ... –

+0

क्या चौड़ाई और ऊंचाई बाइट या int में sprite1 [] में संग्रहीत है? –

+1

चौड़ाई और ऊंचाई बाइट छोटे एंडियन के रूप में संग्रहीत है। मैंने sprite1 [18] और sprite1 [22] gldrawPixels के साथ सफलतापूर्वक पहले उपयोग किया है; वे सही हैं। बिटमैप केवल 2 9 x20 पिक्सेल है इसलिए यह काम करता है। –

उत्तर

1

वाह ... ठीक है मुझे समस्या मिली है। Glenable करने के लिए मेरा कॉल glEnable था (GL_BLEND | GL_TEXTURE_2D)। GlGetError का उपयोग करके मैंने देखा कि मुझे इस कॉल के लिए GL_INVALID_ENUM मिल रहा था, इसलिए मैंने अपने स्वयं के सक्षम फ़ंक्शन और बिंगो में GL_TEXTURE_2D को स्थानांतरित कर दिया। मुझे तार्किक लगता है या glEnable के लिए अनुमति नहीं है ...?

वैसे भी, मदद के लिए सभी को बहुत धन्यवाद ... यह मेरे लिए बहुत जानकारीपूर्ण था।

+1

AFAIK ओपनजीएल स्थिरांक केवल दो की शक्ति नहीं हैं, वे मनमानी मूल्य हैं। जिसका अर्थ यह होगा कि लॉजिकल का उपयोग करना या जानकारी को नष्ट कर देगा। – Adam

+1

OR-सक्षम स्थिरांक इनके साथ -BIT नाम हैं, जैसे GL_COLOR_BUFFER_BIT।जीएल में उनमें से बहुत कुछ नहीं है, इसलिए इसका इस्तेमाल न करें। – Kos

1

कुछ यादृच्छिक विचार:

  • GL_COLOR_MATERIAL सक्रिय किया जा सकता है
  • परिवर्तन "glTexEnvf" से "glTexEnvi" और देखते हैं कि अगर मदद करता है
  • glGenTextures आप नहीं हो सकता के बाद अगर texName1 0 है एक सक्रिय ओपनजीएल संदर्भ

त्रुटि जांच के लिए मैं एक छोटे से फ़ंक्शन को लिखने की अनुशंसा करता हूं जो प्रिंट करता है GlGetErrors से सबसे आम परिणामों के लिए डेल आउटपुट और त्रुटि उत्पन्न करने वाली रेखा को ढूंढने के लिए इसका उपयोग करें। एक और संभावना GLIntercept, BuGLe या gDEBugger जैसे कुछ का उपयोग करना होगा।

0

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

फिर, मैं उस कोड को डीबग करने की कोशिश करना बंद कर दूंगा और इसके बजाय यह देख सकता हूं कि tutorial on the NeHe website पर आपके पास क्या अलग है।

NeHe हमेशा यह देखने के लिए एक अच्छी जगह है कि आप ओपनजीएल में सामान करने की कोशिश कर रहे हैं या नहीं। बनावट शायद सही होने के लिए सबसे कठिन चीज है, और वे केवल आपके जीएल कौशल में वृद्धि के रूप में और अधिक कठिन हो जाते हैं।

1

मेरा ओपनजीएल जंगली है, लेकिन मुझे glTexImage2D के साथ समान समस्याएं याद हैं। अंत में मैं यह काम कर करने में कामयाब रहे, लेकिन मैं हमेशा gluBuild2DMipmaps के साथ और अधिक किस्मत ने तो मैं

gluBuild2DMipmaps (
    GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data 
); 

जो

glTexImage2D (
    GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
); 
+0

यह MIN फ़िल्टर के लिए भूल गए GlTexParameter की तरह लगता है। डिफ़ॉल्ट GL_NEAREST_MIPMAP_LINEAR होगा जो केवल mipmapped बनावट के साथ काम करेगा। –

3

प्रतिस्थापित अपनी टिप्पणी के साथ समाप्त हो गया, तो आप कह अपने बिटमैप 29x20 पिक्सल है। एक वैध बनावट उत्पन्न करने के लिए अफैक, ओपनजीएल की आवश्यकता है कि छवि का आकार (प्रत्येक आयाम पर) 2 की शक्ति हो। इसे वर्ग होने की आवश्यकता नहीं है, हालांकि यह आयताकार हो सकता है। आप कुछ ओपनजीएल एक्सटेंशन जैसे GL_ARB_texture_rectangle का उपयोग कर इसे दूर कर सकते हैं।

+1

GL_ARB_texture_rectangle को 2.0 से ओपनजीएल में शामिल किया गया है, http://www.opengl.org/wiki/NPOT_Txture – Kos

6

mentat's note के अतिरिक्त आपको गैर-शक्ति-दो बनावट आयामों में कोई समस्या हो सकती है, तो आप नाम बदलते हुए बनावट नाम पीढ़ी का उल्लेख करते हैं।

ऐसा लगता है जैसे आप glGenTextures() बहुत जल्दी कॉल कर रहे हैं, यानी ओपनजीएल शुरू करने से पहले। यदि आप नहीं हैं, तो मैं glGenTextures() पर कॉल के ठीक बाद कोड जोड़ने का सुझाव देता हूं जो glGetError() पर कॉल करके ओपनजीएल त्रुटि स्थिति की जांच करता है।

+0

यह मेरे लिए काम करता है ... मैं ओपनजीएल प्रारंभिकरण से पहले बनावट बनाने की कोशिश कर रहा था। जैसा कि मैंने समय और समय फिर से देखा है: ओपनजीएल प्रोग्रामिंग में फ़ंक्शन कॉल का क्रम बहुत महत्वपूर्ण है। – chembrad

2

मैं इसे यहां रखूंगा क्योंकि मेरे पास एक ही समस्या थी और इस मुद्दे को समझाते हुए एक और पोस्ट मिला। आईफोन GL_BGRA (GL_EXT_BGRA) का समर्थन करता है लेकिन प्रतीत होता है कि केवल इनपुट प्रारूप के रूप में और आंतरिक प्रारूप के रूप में नहीं। इसलिए, यदि आप GL_RGBA का आंतरिक प्रारूप रखने के लिए glTexImage2D कॉल को बदलते हैं तो यह काम करता है।

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, &sprite1[54]); 

मुझे उम्मीद है कि यह किसी और की मदद करता है जो इस पोस्ट पर ठोकर खाती है।

+0

मुझे इस पर और अधिक सुनना अच्छा लगेगा, क्योंकि यह मुझे भ्रमित कर रहा है। ऐसा लगता है कि बीजीआरए को एक आंतरिक प्रारूप के रूप में डालने लगता है, लेकिन यह वास्तव में आरजीबीए का उपयोग कर रहा है। या मैं गलत हूँ? – akaru

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