2009-01-08 15 views
6

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

आजकल पसंदीदा तरीका क्या है? क्या यह उस वीडियो को वीडियो मेमोरी में क्रैक करना है, इसे टाइल करें, या सीपीयू को काम और glDrawPixels करने दें? या कुछ और विस्तृत?

+1

'glDrawPixels' वास्तव में धीमा है, तो आप निश्चित रूप से इसका उपयोग नहीं करेंगे। – d0k

+0

मैंने वास्तव में रंग के लिए और अधिक gldrawPixels फेंक दिया ... :) – falstro

उत्तर

10

यदि यह कोई एनिमेशन के साथ एक एकल फ्रेम स्पलैश छवि है, तो glDrawPixels का उपयोग करके कोई नुकसान नहीं होता है। यदि प्रदर्शन महत्वपूर्ण है और आपको एक बनावट का उपयोग करने की आवश्यकता है, तो इसे करने का सही तरीका प्रॉक्सी बनावट का उपयोग करके रनटाइम, अधिकतम समर्थित बनावट आकार को निर्धारित करना है।

GLint width = 0; 
while (0 == width) { /* use a better condition to prevent possible endless loop */ 
    glTexImage2D(GL_PROXY_TEXTURE_2D, 
         0,    /* mip map level */ 
         GL_RGBA,   /* internal format */ 
         desiredWidth,  /* width of image */ 
         desiredHeight, /* height of image */ 
         0,    /* texture border */ 
         GL_RGBA   /* pixel data format, */ 
         GL_UNSIGNED_BYTE, /* pixel data type */ 
         NULL    /* null pointer because this a proxy texture */ 
    ); 

    /* the queried width will NOT be 0, if the texture format is supported */ 
    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); 

    desiredWidth /= 2; desiredHeight /= 2; 
} 

एक बार जब आप अधिकतम बनावट आकार सिस्टम के ओपन चालक द्वारा समर्थित पता है, आप कम से कम दो विकल्प हैं, तो अपनी छवि से मेल नहीं खाती:

  • छवि टाइलिंग: कई quads उपयोग करने के बाद अपनी छवि को छोटे समर्थित हिस्सों में विभाजित करना। एक स्प्लैश स्क्रीन की तरह कुछ के लिए छवि टाइलिंग बहुत मुश्किल नहीं होना चाहिए। आप बनावट में एक बड़ी छवि के अनुभाग लोड करने के लिए glPixelStorei के GL_PACK_ROW_LENGTH पैरामीटर का उपयोग कर सकते हैं।
  • छवि का आकार बदलना: अधिकतम समर्थित बनावट आकार फिट करने के लिए अपनी छवि का आकार बदलें। आपके लिए यह करने के लिए एक जीएलयू सहायक कार्य भी है, gluScaleImage
+0

GLint चौड़ाई = 0; // ;-) – Will

+0

ओप्स ;-) (यह भी महसूस किया गया कि मेरी टिप्पणी में एक वाक्यविन्यास त्रुटि है) – codelogic

+0

यह 'GL_UNPACK_ROW_LENGTH' है, और इसका उपयोग इस प्रकार किया जाता है: http://stackoverflow.com/a/205569/362515 – user362515

0

मुझे नहीं लगता कि एक अंतर्निहित ओपनजीएल फ़ंक्शन है, लेकिन छवि को छोटे टुकड़ों में विभाजित करने के लिए आपको लाइब्रेरी (या स्वयं फ़ंक्शन लिखना) मिल सकता है और फिर छोटे भाग (128x128 टाइल्स) को स्क्रीन करने के लिए प्रिंट करें या इसी के समान)।

मुझे जावा गेम के लिए Slick2D का उपयोग करके इसमें समस्या थी। आप here विचारों के लिए अपनी "बिग इमेज" कक्षा देख सकते हैं।