आपका प्रश्न कुछ अवधारणाओं को भ्रमित करने वाला प्रतीत होता है, तो आइए ऊपर से चीजों को लें। यह फ़ंक्शन की परिभाषा है glTexImage2D:
void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void *data );
दो चीजें हैं जिन्हें आप "बनावट प्रारूप" कह सकते हैं। पहला internalformatपैरामीटर है। यह छवि का वास्तविक प्रारूप है क्योंकि OpenGL इसे संग्रहीत करता है। formatपैरामीटर पिक्सेल डेटा का प्रारूप के हिस्से का वर्णन आप के साथ प्रदान कर रहे हैं dataपैरामीटर।
इसे दूसरे तरीके से रखने के लिए, formatऔर typeपरिभाषित करें कि आपका डेटा कैसा दिखता है। internalformatआप अपने डेटा को स्टोर करने के लिए OpenGL को कैसे बता रहे हैं । हमें कॉल करें formatऔर type"पिक्सेल स्थानांतरण प्रारूप", जबकि internalformat"छवि प्रारूप" होगा।
एक बनावट का छवि प्रारूप "bgr8" कभी नहीं हो सकता। कोई GL_BGR8 छवि प्रारूप एन्यूमरेटर नहीं है। वहाँ है एक GL_BGR enum, लेकिन यह है कि पिक्सेल हस्तांतरण प्रारूप, नहीं छवि प्रारूप के लिए है।
या इसे दूसरे तरीके से रखने के लिए, आपका पिक्सेल डेटा जो आप ओपनजीएल देते हैं, उसे बीजीआर क्रम में संग्रहीत किया जा सकता है। लेकिन ओपनजीएल कार्यान्वयन स्वयं तय करता है कि वास्तव में उस पिक्सेल डेटा को कैसे संग्रहीत किया जाए। शायद यह इसे छोटे-एंडियन क्रम में संग्रहीत करता है। हो सकता है कि वह इसे बड़े-एंडियन स्टोर करता हो। हो सकता है कि यह सिर्फ मनमाने ढंग से बाइट्स को फिर से व्यवस्थित करता है। आप नहीं जानते, और OpenGL पता लगाने के लिए एक तरीका प्रदान नहीं करता है।
यह बताने का कोई तरीका नहीं है कि क्या पिक्सेल स्थानांतरण प्रारूप मापदंडों का एक विशेष सेट मेल खाता है कि OpenGL कार्यान्वयन उन्हें कैसे छवि प्रारूप को संग्रहीत करेगा।
वहाँ एक तरीका है अब बताने के लिए। और "अब" से मेरा मतलब ओपनजीएल 4.3 और / या ARB_internalformat_query2 से है। आपके पास एक ग्राफिक्स कार्ड आ रहा है:
GLenum format, type;
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_FORMAT, 1, &format);
glGetInternalformativ(texture_target, GL_RGBA8, GL_TEXTURE_IMAGE_TYPE, 1, &type);
formatऔर typeअब कार्यान्वयन की पसंद formatऔर छवियों के लिए कॉल का typeउपयोग glTex(Sub)Imageकरने के लिए GL_RGBA8है। डाउनलोड के लिए अलग formatऔर typeक्वेरीज़ हैं glReadPixels।
कर रहे हैं अन्य प्रश्नों के आप कमा सकते हैं ।
यदि आपके पास इन तक पहुंच नहीं है, तो आप अंगूठे के कुछ सामान्य नियमों का उपयोग कर सकते हैं जो अधिकांश हार्डवेयर का पालन करेंगे:
- बीजीआरए क्रम में 8-बिट-प्रति-चैनल डेटा के लिए पिक्सेल डेटा स्टोर करेगा। इसलिए यदि आप अपने पिक्सेल डेटा के साथ प्रारूप का मिलान करना चाहते हैं, तो अधिक तेज़ी से बनावट डेटा अपलोड करने के लिए, आप
GL_BGRAके लिए format, और GL_UNSIGNED_INT_8888या के GL_UNSIGNED_BYTEलिए उपयोग करना चाहते हैं type।
- वास्तव में 24-बिट रंगों को 24-बिट्स के रूप में संग्रहीत नहीं करेगा। यह हमेशा उन्हें 32-बिट तक पैड देगा; जब यह डेटा पढ़ेगा तो अल्फा को नजरअंदाज कर दिया जाएगा। तो अगर आप, प्रारूपों से मेल हमेशा उपयोग करना चाहते हैं
GL_BGRA formatके साथ GL_RGB8छवि प्रारूप, आप अल्फा घटक में डमी डेटा डाल करने के लिए है, भले ही।