2009-03-25 15 views
10

से ओपनजीएल एफबीओ बड़ी बचत की समस्या मैं ओपनजीएल ऑफ़स्क्रीन फ्रेमबफर ऑब्जेक्ट में प्रस्तुत कर रहा हूं और इसे एक छवि के रूप में सहेजना चाहता हूं। ध्यान दें कि एफबीओ प्रदर्शन आकार से बड़ा है। मैं ऑफस्क्रीन बफर में प्रस्तुत कर सकता हूं और इसे बनावट के रूप में उपयोग कर सकता हूं, जो काम करता है। मैं ऑफसेट का उपयोग करके डिस्प्ले के माध्यम से इस बड़े बनावट को "स्क्रॉल" कर सकता हूं, जो मुझे विश्वास दिलाता है कि मैं खिड़की से बड़े संदर्भ में प्रस्तुत करता हूं।विंडो

अगर मैं एक छवि फ़ाइल में ऑफस्क्रीन बफर को सहेजता हूं तो यह हमेशा फसल हो जाता है। बचत के लिए कोड टुकड़ा है:

void ofFBOTexture::saveImage(string fileName) { 
    glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
    // get the raw buffer from ofImage 
    unsigned char* pixels = imageSaver.getPixels(); 
    glReadPixels(0, 0, 1024, 1024, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

    imageSaver.saveImage(fileName); 
} 

कृपया ध्यान दें, छवि सामग्री काटी है, दृश्य भाग सही ढंग से सहेजा जाता है कि (जो पिक्सेल प्रारूपों, GL_RGB मुद्दों आदि में कोई त्रुटि का अर्थ है), लेकिन शेष जगह नहीं है एक रंग से भरा

तो, मेरा सवाल है - मैं क्या गलत कर रहा हूं?

उत्तर

11

अंततः मैंने इस मुद्दे को हल किया। जबकि केवल के माध्यम से

glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 

glReadPixels के लिए FBO का चयन पर्याप्त नहीं है

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); 
// save code 
... 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 

:

मैं इसकी सामग्री को बचाने के लिए FBO को सक्रिय करने के लिए है।

(अन्य सभी चीजों को जहां सही और परीक्षण किया गया है, जैसे। व्यूपोर्ट आकार, चौड़ाई और बफर की ऊंचाई, छवि बनावट आदि)

+0

मुझे आपके जैसा ही समस्या है। क्या आप विस्तार कर सकते हैं कि आप एफबीओ चर कैसे प्राप्त करते हैं? मुझे नहीं पता कि GlGenFrameBuffers तक पहुंचने के लिए क्या शामिल करना है, जो मुझे लगता है कि इसका उपयोग किया जाता है। –

+1

1. यहां एक अच्छा विवरण है: http://www.songho.ca/opengl/gl_fbo.html – razong

+1

2. ग्लूंट एफबीओ; glGenFramebuffersEXT (1, &fbo); // 1 == glbindFramebufferEXT (GL_FRAMEBUFFER_EXT, fbo) बनाने के लिए fbo की संख्या; – razong

0

शुरू करने के लिए दो प्रश्न: आप छविसेवर कैसे बना रहे हैं और क्या आप सुनिश्चित हैं कि आपकी चौड़ाई और ऊंचाई सही है (उदाहरण के लिए आप 1024 x 1024 छवि को सहेजने की कोशिश कर रहे हैं? आप किस आकार को प्राप्त कर रहे हैं)?

+0

1. imageSaver एक openframeworks छवि वस्तु है। किसी भी संभावित त्रुटियों से बचने के लिए मैंने इसे अपनी इच्छित लक्ष्य छवि के आकार और गहराई के साथ एक खाली बिटमैप फ़ाइल लोड करके भी बनाया है। 2. मुझे वांछित के रूप में 1024x1024 छवि मिलती है, लेकिन केवल प्रस्तुत की गई विंडो के बराबर सामग्री होती है। बाकी सब कुछ "खाली" – razong

0

आप कुछ भी गलत नहीं कर रहे हैं, यह लंबे समय तक ओपनजीएल ग्राफिक्स ड्राइवरों के साथ काफी आम व्यवहार रहा है - मुझे याद है कि कम से कम एक दशक पहले एनवीडिया गीफर्स 3 कार्ड्स पर एक ही मुद्दे के खिलाफ चल रहा था, और मैंने अपनाया एक समान समाधान - एक ऑफस्क्रीन बनावट को प्रतिपादन।

0

ऐसा लगता है कि आपके पास गलत व्यूपोर्ट आकार या कुछ समान है।