2014-04-23 6 views
6

से पिक्सल पढ़ें I मैं एक OpenGL बनावट से पिक्सेल/डेटा पढ़ने की कोशिश कर रहा हूं जो GL_TEXTURE_EXTERNAL_OES से जुड़ा हुआ है।एंड्रॉइड पढ़ने के लिए GL_TEXTURE_EXTERNAL_OES

उस लक्ष्य पर बनावट को बाध्य करने का कारण यह है कि एंड्रॉइड पर लाइव कैमरा फ़ीड प्राप्त करने के लिए एक सतहफलक को ओपनजीएल बनावट से बनाया जाना चाहिए जो GL_TEXTURE_EXTERNAL_OES से जुड़ा हुआ है।

चूंकि एंड्रॉइड ओपनजीएल ES का उपयोग करता है, इसलिए मैं छवि डेटा पढ़ने के लिए glGetTexImage() का उपयोग नहीं कर सकता।

इसलिए मैं एक एफबीओ को लक्ष्य बाध्य कर रहा हूं और फिर इसे readPixels() का उपयोग करके पढ़ रहा हूं।

GLuint framebuffer; 
    glGenFramebuffers(1, &framebuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 

    //Attach 2D texture to this FBO 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); 
    status("glFramebufferTexture2D() returned error %d", glGetError()); 

हालांकि मैं हो रही है त्रुटि 1282 (GL_INVALID_OPERATION) किसी कारण: यह मेरा कोड है।

उत्तर

0

GL_TEXTURE_EXTERNAL_OES बनावट लक्ष्य आमतौर पर एक यूयूवी कलर स्पेस में होता है और glReadPixels() को लक्ष्य आरजीबी होने की आवश्यकता होती है। यह शायद रंग अंतरिक्ष रूपांतरण स्वचालित रूप से नहीं करता है। हालांकि, आप अपने स्वयं के टुकड़े टुकड़े में रूपांतरण कर सकते हैं जो आरजीबी को किसी अन्य बनावट में प्रस्तुत करता है और फिर पढ़ने के लिए glReadPixels() का उपयोग करता है।

texture for YUV420 to RGB conversion in OpenGL ES

+0

यह सही नहीं है। एंड्रॉइड पर, वाईयूवी-> आरजीबी रूपांतरण दृश्यों के पीछे स्वचालित रूप से होता है। Https://stackoverflow.com/questions/46244179/android-mediacodec-output-format-gles-external-texture-yuv-nv12-to-gles-tex – tmm1

2

मुझे लगता है कि यह समस्या हो सकती है:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
GL_TEXTURE_EXTERNAL_OES, cameraTexture, 0); 

आप फ्रेमबफर को cameraTexture संलग्न नहीं करना चाहिए, बजाय आप GL_TEXTURE_2D

की
glGenTextures(1, mTextureHandle, 0); 

glBindTexture(GL_TEXTURE_2D, mTextureHandle[0]); 

... 
प्रारूप में एक नया बनावट उत्पन्न करनी चाहिए

कैमरा सतह सतह मिश्रण से प्राप्त होता है, और यह प्रस्तुति के लिए उपयोग किया जाने वाला स्रोत है। यह नया बनावट वह है जिसे आपको प्रस्तुत करना चाहिए (जिसे बाद में प्रतिपादन पाइपलाइन में उपयोग किया जा सकता है)। तब ऐसा करते हैं:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
GL_TEXTURE_2D, mTextureHandle[0], 0); 

cameraTexture, फ्रेमबफर के संलग्न बनावट के लिए तैयार की है एक सरल शेडर प्रोग्राम का उपयोग, आकर्षित करने के लिए cameraTexture बाँध जब शेडर कार्यक्रम उपयोग में है:

glBindTexture(GL_TEXTURE_EXTERNAL_OES, cameraTexture); 
+1

इस उत्तर का क्या समाधान लाता है? –

+0

मुझे लगता है कि सही समाधान को दो उत्तरों को एक साथ जोड़ना होगा, पहले एक नया फ्रेमबफर और एक नया बनावट और glFramebufferTexture2D बनाएं, फिर आप फ्रेम बफर में YUV डेटा खींचने के लिए शेडर का उपयोग कर सकते हैं और फिर इसे glReadPixels के माध्यम से पढ़ा जा सकता है। थोड़ा जटिल! –

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