2008-10-15 10 views
8

मैं छवि डेटा है और मैं एक ओपन बनावट के रूप में उपयोग करने के लिए है कि एक उप छवि प्राप्त करना चाहते हैं।ओपन SubTexturing

glGenTextures(1, &m_name); 
glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldName); 
glBindTexture(GL_TEXTURE_2D, m_name); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data); 

मैं बनावट के रूप में लोड की गई छवि की एक उप छवि कैसे प्राप्त कर सकता हूं। मुझे लगता है कि glteexSubImage2D का उपयोग करने के साथ इसका कुछ संबंध है, लेकिन मुझे कोई नया बनावट बनाने के लिए इसका उपयोग करने का कोई संकेत नहीं है जिसे मैं लोड कर सकता हूं। कॉलिंग:

glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, xWidth, yHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_data); 

हिरण कुछ भी नहीं है कि मैं देख सकता हूँ, और glCopyTexSubImage2D बुला बस अपना फ्रेमबफर का हिस्सा लेता है। धन्यवाद

उत्तर

27

संपादित करें: glPixelStorei का उपयोग करें। आप पूरी छवि के चौड़ाई (पिक्सेल में) GL_UNPACK_ROW_LENGTH सेट करने के लिए इसका उपयोग करते हैं। फिर आप glTexImage2D (या जो कुछ भी) कहते हैं, इसे उपमहाद्वीप के पहले पिक्सेल और उपमहाद्वीप की चौड़ाई और ऊंचाई पर पॉइंटर पास करते हैं।

0 को GL_UNPACK_ROW_LENGTH बहाल करने के लिए भूल जाते हैं जब आप इसे का काम समाप्त हो न करें।

Ie:

glPixelStorei(GL_UNPACK_ROW_LENGTH, img_width); 
char *subimg = (char*)m_data + (sub_x + sub_y*img_width)*4; 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, subimg); 
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); 

या, यदि आप गणित सूचक से एलर्जी कर रहे हैं:

glPixelStorei(GL_UNPACK_ROW_LENGTH, img_width); 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, sub_x); 
glPixelStorei(GL_UNPACK_SKIP_ROWS, sub_y); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_data); 

glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); 
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); 

EDIT2: पूर्णता के लिए के लिए, मैं कहना चाहिए कि आप कर रहे हैं ओपनजीएल-ईएस का उपयोग करके आपको GL_UNPACK_ROW_LENGTH नहीं मिलता है। जो मामले में, आप या तो (क) subimage एक नया में निकाल सकते खुद बफ़र, या (ख) ...

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sub_width, sub_height, 0, GL_RGBA, GL_UNSIGNED_BYTES, NULL); 

for(int y = 0; y < sub_height; y++) 
{ 
    char *row = m_data + ((y + sub_y)*img_width + sub_x) * 4; 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, y, sub_width, 1, GL_RGBA, GL_UNSIGNED_BYTE, row); 
} 
+0

मूल रूप से मेरे पास एक छवि (कच्चे डेटा के रूप में) है, और मैं उस छवि का एक बनावट के रूप में उपयोग करना चाहता हूं। मुझे पता है कि पूरी छवि को बनावट के रूप में कैसे लोड किया जाए, लेकिन यह नहीं पता कि इसका थोड़ा सा उपयोग कैसे करें। – DavidG

+0

पोस्टर ने इसका उत्तर दिया। अगर आपके पास स्मृति में एक छवि है, तो यह किसी भी तरह से संग्रहीत है। यदि आपने glTexImage2D (... GL_RGBA, GL_UNSIGNED_BYTE) लोड करने के लिए उपयोग किया है, तो आर, जी, बी और अल्फा मान के लिए बाइट है। छवियों को पिक्सेल (0, 0) के साथ संग्रहीत किया जाता है स्थिति 0 पर शुरू होता है। पंक्ति y पर पिक्सेल एक्स छवि [चौड़ाई * वाई + एक्स] [0] – mstrobl

+0

से शुरू होता है क्योंकि मैं ओपनजीएल ईएस का उपयोग कर रहा हूं, मैं पहले ऐसा कर रहा हूं विकल्प जो आपने दिया है, वह एक नए बफर में उपमहाद्वीप निकालने जा रहा है। दुर्भाग्य से डिवाइस पर यह अब काम नहीं करता है, इसलिए मैं बनावट को फिर से तैयार करने जा रहा हूं ताकि मुझे समस्या को हल करने की आवश्यकता न हो। – DavidG

1

2018 में OpenGL ES 1.1/2.0 के साथ फंस उन लोगों के लिए और बाद में, मैं छवि डेटा से बनावट के हिस्से को अद्यतन करने के तरीके के विभिन्न तरीकों के साथ कुछ परीक्षण किए गए हैं (छवि बनावट के समान आकार का है)।

विधि 1:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mWidth, mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_Pixels); 

विधि 2:

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, m_Pixels); 

विधि 3:: कॉपी glTexSubImage2D साथ कॉपी पूर्ण छवि देखना कॉपी glTexImage2D साथ पूर्ण छवि देखना छवि भाग, एक लूप में लाइन द्वारा लाइन:

auto *ptr = m_Pixels + (x + y * mWidth) * 4; 
for(int i = 0; i < h; i++, ptr += mWidth * 4) { 
    glTexSubImage2D(GL_TEXTURE_2D, 0, x, y+i, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, ptr); 
} 

विधि 4: छवि के पूरे कॉपी चौड़ाई, लेकिन खड़ी ही हिस्सा है जो बदल गया है कॉपी:

auto *ptr = m_Pixels + (y * mWidth) * 4; 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, y, mWidth, h, GL_RGBA, GL_UNSIGNED_BYTE, ptr); 

और यहाँ पीसी पर किया परीक्षण के परिणाम हैं, अद्यतन करने 100000 गुना तक बनावट के विभिन्न हिस्सों जो पूरे बनावट के आकार के लगभग 1/5 वें थे।

  • विधि 1 - 38,17 सेकंड
  • विधि 2 - 26।09 सेकंड
  • विधि 3 - 54,83 सेकंड - धीरे
  • विधि 4 - 5.93 सेकंड - विजेता

नहीं आश्चर्यजनक रूप से, विधि 4 सबसे तेज है, के रूप में यह प्रतियां केवल छवि का हिस्सा है, और यह करता है glteex ...() फ़ंक्शन के लिए एक कॉल के साथ।

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