2008-11-29 18 views
9

क्या ओपनजीएल में मोनोक्रोम (1 बिट छवि गहराई वाला ग्राफिकल डेटा) पंप पंप करना संभव है?ओपनजीएल और मोनोक्रोम बनावट

मैं वर्तमान में इस का उपयोग कर रहा:

glTexImage2D(GL_TEXTURE_2D, 0, 1, game->width, game->height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, game->culture[game->phase]); 

मैं GL_LUMINANCE मोड में 8 बिट अचिन्हित इंटीजर्स (एक 8 बिट चैनल सभी 3 चैनलों की चमक और पूर्ण अल्फा प्रतिनिधित्व करता है) के वर्ग सरणी के साथ पंप कर रहा हूँ, लेकिन यह आईएमओ बेहद अप्रभावी है, क्योंकि सरणी में ऑनलू मान 0x00 और 0xFF हैं।

क्या मैं (और कैसे) किसी भी तरह से बूलियन के साधारण एक-बिट प्रति पिक्सेल सरणी का उपयोग कर सकता हूं? अत्यधिक सरणी आकार सरणी :(

उत्तर

5

luminance छवियों के लिए छोटी से छोटी असम्पीडित बनावट प्रारूप पिक्सेल प्रति 8 बिट का उपयोग करता है।

हालांकि, पिक्सेल छवियों प्रति 1 बिट करने के लिए हानि के बिना संकुचित किया जा सकता है पर किसी भी अन्य कार्यों को धीमा कर देती एस 3 टीटी या डीएफटी प्रारूप। यह अभी भी 1 बिट प्रति पिक्सल नहीं होगा लेकिन कहीं 2 और 3 बिट्स के बीच होगा।

यदि आपको वास्तव में 1 बिट प्रति पिक्सेल की आवश्यकता है तो आप थोड़ा चाल के साथ ऐसा कर सकते हैं। लोड 8 1 बिट प्रति पिक्सल एक 8 बिट अल्फा-केवल बनावट के रूप में बनावट (छवि 1 बिट 1 में लोड हो जाती है, छवि 2 बिट 2 में लोड हो जाती है)। एक बार जब आप ऐसा कर लेंगे तो आप अल्फा-टेस्ट का उपयोग करके प्रत्येक उप-बनावट को "पता" कर सकते हैं सुविधा और बनावट का एक छोटा सा अल्फा को रंग में बदलने के लिए पर्यावरण प्रोग्रामिंग।

यह केवल तभी काम करेगा यदि आपके पास 8 1 बिट प्रति पिक्सेल बनावट है और यद्यपि सही हो।

+0

8 बनावट चाल दिलचस्प लगता है, लेकिन वास्तव में यह नहीं है कि मैं क्या देख रहा हूं। मैं अपने आवेदन से डेटा को देखने के लिए ओपनजीएल का उपयोग कर रहा हूं, इसलिए इस तरह की चाल सरणी पर मानक संचालन को धीमा कर देगी (प्रोग्रामिंग जटिलताओं की बात नहीं)। –

13

कुछ शोध के बाद, मैं निम्नलिखित कोड के साथ एक बनावट के रूप में पिक्सेल छवि प्रति 1-बिट प्रस्तुत करना करने में सक्षम था:

static GLubyte smiley[] = /* 16x16 smiley face */ 
{ 
    0x03, 0xc0, /*  ****  */ 
    0x0f, 0xf0, /*  ********  */ 
    0x1e, 0x78, /* **** **** */ 
    0x39, 0x9c, /* *** ** *** */ 
    0x77, 0xee, /* *** ****** *** */ 
    0x6f, 0xf6, /* ** ******** ** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0xff, 0xff, /* **************** */ 
    0x73, 0xce, /* *** **** *** */ 
    0x73, 0xce, /* *** **** *** */ 
    0x3f, 0xfc, /* ************ */ 
    0x1f, 0xf8, /* ********** */ 
    0x0f, 0xf0, /*  ********  */ 
    0x03, 0xc0 /*  ****  */ 
}; 

float index[] = {0.0, 1.0}; 

glPixelStorei(GL_UNPACK_ALIGNMENT,1); 

glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, index); 
glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, index); 

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,16,16,0,GL_COLOR_INDEX,GL_BITMAP,smiley); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

और यहाँ परिणाम है:

enter image description here

+0

अच्छा! क्या आपने अपने प्रदर्शन की तुलना 1 बाइट प्रति पिक्सेल संस्करण से की है? –

+0

ऐसा प्रतीत नहीं होता है कि आप इस बनावट को आकार बदलने के बिना क्लैंप कर सकते हैं। मैं बस सीमा पार रक्तस्राव से छुटकारा पाने की कोशिश कर रहा था। – Kaliber64

+0

मुझे आंतरिक प्रारूप को 'LUMINANCE' में बदलना एक ही दृश्य को स्मृति के साथ एक ही दृश्य बनाता है। यदि कोई प्रारूप छोटा है तो मुझे दिलचस्पी होगी। आईडी 3 एस प्रारूपों को कैसे प्राप्त करें। मुझे नहीं लगता कि pyOpenGL में वे एक्सटेंशन हैं। – Kaliber64

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