2011-05-26 19 views
11

का उपयोग कर फ़्रेम बफर ऑब्जेक्ट (एफबीओ) से पिक्सल मानों को पढ़ना, क्या मैं एफबीओ से पिक्सेल मानों (यानी glReadPixels का उपयोग करके) पढ़ने के लिए पिक्सेल बफर ऑब्जेक्ट (पीबीओ) का उपयोग कर सकता हूं (यानी एफबीओ अभी भी संलग्न)?पिक्सेल बफर ऑब्जेक्ट (पीबीओ)

यदि हाँ,

  1. फायदे और FBO साथ PBO का उपयोग करने का नुकसान क्या हैं?
  2. कोड निम्नलिखित

{

//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY) 
// FBO and PBO status is good 
. 
. 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); 
//Draw the objects 

बाद glReadPixels के साथ समस्या क्या है ठीक

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData); 

बाद glReadPixels काम करता है काम नहीं करता है :(

glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId); 
//yes glWriteBuffer has also same target and I also checked with every possible values 
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData); 
. 
. 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer 

उत्तर

10

glReadPixels के लिए लक्ष्य के रूप में आप एक बाइट बफर में ऑफसेट निर्दिष्ट करने के लिए एक PBO का उपयोग करते समय (0, मुझे लगता है) के बजाय (uchar*)cvimg->imageData लक्ष्य पते के रूप में। यह VBOs का उपयोग करते समय glVertexPointer में बफर ऑफसेट का उपयोग करने जैसा ही है।

संपादित करें: एक PBO GL_PIXEL_PACK_BUFFER करने के लिए बाध्य किया जाता है, glReadPixels को अंतिम तर्क प्रणाली स्मृति में सूचक के रूप में, लेकिन एक बाइट बाध्य बफर की स्मृति में ऑफसेट के रूप में इलाज नहीं है। इसलिए बफर में पिक्सल लिखने के लिए बस 0 को पास करें (उन्हें बफर मेमोरी की शुरुआत में लिखें)। इसके बाद आप glMapBuffer के माध्यम से बाद में बफर मेमोरी (पिक्सल प्राप्त करने के लिए) को acces कर सकते हैं। आपके टिप्पणी में प्रदान किया गया उदाहरण लिंक यह भी करता है कि, इसे भी बड़े पैमाने पर पढ़ें। मैं शुरू में उल्लेख किए गए वर्टेक्स बफर ऑब्जेक्ट्स के बारे में भी हिस्सा पढ़ने का सुझाव देता हूं, क्योंकि ये बफर ऑब्जेक्ट को समझने के लिए जमीन रखते हैं।

+0

नीचे है मैं समझ नहीं है, तुम मुझे उदाहरण कोड काम उपलब्ध कराएं? क्योंकि 'glReadPixels' में ऑफसेट प्रदान करने का कोई विकल्प नहीं है। और, [उदाहरण] (http://www.songho.ca/opengl/gl_pbo.html) आपके द्वारा उल्लेखित किसी भी चीज का उपयोग न करें लेकिन अभी भी पीबीओ के साथ ठीक काम करता है। – Rudi

+0

@Rudi ने मेरा उत्तर अपडेट किया। –

+0

@ रुडी मुझे उम्मीद है कि आप इसमें लिखने की कोशिश करने से पहले पीबीओ को बाध्य करेंगे। –

8

हां, हम एक साथ एफबीओ और पीबीओ का उपयोग कर सकते हैं।

उत्तर 1:

तुल्यकालिक पढ़ने के लिए: PBO बिना 'glReadPixels' तेज है।

अतुल्यकालिक पढ़ने के लिए: के साथ 2/एन PBOs 'glReadPixels' GPU और एक अन्य PBO (n + 1) द्वारा PBO (एन) को फ्रेमबफर से पिक्सल पढ़ने सीपीयू द्वारा पिक्सल पर कार्रवाई करने के लिए बेहतर से एक है। हालांकि तेजी से नहीं दिया जाता है, यह समस्या और डिजाइन की कल्पना है।

उत्तर 2:

ईसाई राव के विवरण सही है और संशोधित कोड

glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId); 
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 
//glReadBuffer(GL_DEPTH_ATTACHMENT_EXT); 

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, 0); 

//GLubyte* src = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); 
//OR 
cvimg->imageData = (char*) glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); 
if(cvimg_predict_contour->imageData) 
{ 
    //Process src OR cvim->imageData 
    glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);  // release pointer to the mapped buffer 
} 
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);