दिलचस्प पोस्ट
DOMContentLoaded और लोड घटनाओं के बीच का अंतर आईफोन – घटनाओं के लिए मतदान के लिए पृष्ठभूमि क्यों पो (10,5) = 9, 99 9 सी ++ में क्या मुझे सीएसएस में महत्वपूर्ण इस्तेमाल करना चाहिए? एचटीएमएल चपलता पैक – पार्सिंग टेबल जैक्सन का उपयोग करके JSON स्ट्रिंग को सुंदर प्रिंट JSON आउटपुट में कनवर्ट करें अपरिवर्तित अपवाद java.sql.SQLException; पकड़े जाने या घोषित करने के लिए फेंक दिया जाना चाहिए? पसंदीदा इंटरफेसऑरेंटेशनफॉरियोजन को एक समर्थित इंटरफ़ेस ओरिएंटेशन वापस करना होगा एचटीएमएल 5 स्थानीय स्टोरेज में ऑब्जेक्ट संग्रहित करना Google मानचित्र एपीआई v3 का उपयोग करके सड़क पर पॉलीलाइन स्नैप आईफ़ोन वेबकिट सीएसएस एनिमेशन का कारण झिलमिलाहट जब जावा में बुलाया अंतिम रूप () विधि है? उद्देश्य सी में एक स्ट्रिंग खाली है, तो मैं कैसे परीक्षण कर सकता हूं? MATLAB में अंडाकार और अंडाकार आकर्षित jqGrid: फ़िल्टरटूलबार चयन बक्से को भरने के लिए प्रसंस्करण से पहले का उपयोग करना

तेजी से पिक्सेल कॉपी के लिए ईजीएल_केएचएचआरआईआईजी_बेस के साथ glReadPixels की जगह

मैं glrheadpixels को बदलने के लिए एक एंड्रॉइड मूल प्रक्रिया में ईजीएल_केएचआर_आईजेजी_बेस का उपयोग करने की कोशिश कर रहा हूं क्योंकि यह धीमा है (1280×800 आरजीबीएएम के लिए 220 एमएमएस)।

यह अब तक मेरे पास है, लेकिन मेरा यह एक खाली बफर पैदा करता है (केवल शून्य)

uint8_t *ptr; GLuint mTexture; status_t error; GraphicBufferAlloc* mGraphicBufferAlloc = new GraphicBufferAlloc(); sp<GraphicBuffer> window = mGraphicBufferAlloc->createGraphicBuffer(width, height, PIXEL_FORMAT_RGBA_8888, GraphicBuffer::USAGE_SW_READ_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE,&error); EGLClientBuffer buffer = (EGLClientBuffer)window->getNativeBuffer(); EGLint eglImageAttributes[] = {EGL_WIDTH, width, EGL_HEIGHT, height, EGL_MATCH_FORMAT_KHR, EGL_FORMAT_RGBA_8888_KHR, EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; EGLImageKHR image = eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,buffer, eglImageAttributes); glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); window->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, (void**)&ptr); memcpy(texture, ptr, width * height * 4); window->unlock(); 

मैं क्या गलत कर रहा हूं ?

वेब के समाधान से एकत्रित समाधान "तेजी से पिक्सेल कॉपी के लिए ईजीएल_केएचएचआरआईआईजी_बेस के साथ glReadPixels की जगह"

आप खाली बफर बना रहे हैं और फिर उसमें से सामग्री को पढ़ रहे हैं। कोड के माध्यम से चलना:

 GraphicBufferAlloc* mGraphicBufferAlloc = new GraphicBufferAlloc(); sp<GraphicBuffer> window = mGraphicBufferAlloc->createGraphicBuffer(width, height, PIXEL_FORMAT_RGBA_8888, GraphicBuffer::USAGE_SW_READ_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE,&error); 

यह निर्दिष्ट आयाम और पिक्सेल प्रारूप के साथ एक नया GraphicBuffer बनाता है (कभी-कभी "ग्रॉलोक बफर" कहा जाता है)। उपयोग झंडे इसे बनावट के रूप में इस्तेमाल करने या सॉफ़्टवेयर से पढ़ते हैं, जो कि आप क्या चाहते हैं

 EGLClientBuffer buffer = (EGLClientBuffer)window->getNativeBuffer(); EGLint eglImageAttributes[] = {EGL_WIDTH, width, EGL_HEIGHT, height, EGL_MATCH_FORMAT_KHR, EGL_FORMAT_RGBA_8888_KHR, EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; EGLImageKHR image = eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,buffer, eglImageAttributes); 

यह ANativeWindow ऑब्जेक्ट (जो कि हुड के नीचे बफ़र्स की एक कतार है) EGLImage और इसके लिए एक EGLImage "हैंडल" संलग्न करता है

 glGenTextures(1, &mTexture); glBindTexture(GL_TEXTURE_2D, mTexture); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); 

यह एक नया बनावट ऑब्जेक्ट बनाता है, और इसके लिए EGLImage को जोड़ता है। तो अब एक ANativeWindow को टेक्सचर ऑब्जेक्ट के रूप में इस्तेमाल किया जा सकता है।

 window->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, (void**)&ptr); memcpy(texture, ptr, width * height * 4); window->unlock(); 

यह बफर को पढ़ने के लिए ताला लगाता है, डेटा को उसमें से बाहर निकालता है, और इसे अनलॉक करता है चूंकि आपने कुछ भी नहीं खींचा है, पढ़ने के लिए कुछ भी नहीं है।

इसके लिए उपयोगी कुछ करने के लिए, आपको बनावट में कुछ प्रस्तुत करना होगा। आप इसे एक FBO बनाकर और बनावट को रंग बफर के रूप में glCopyTexImage2D() या फ्रेमबफर से बनावट को पिक्सेल कॉपी करने के लिए glCopyTexImage2D() का उपयोग कर कर glCopyTexImage2D()

मैं आपके उदाहरण को grallocBuffer->lock() से पहले कॉल करने से पहले निम्नलिखित को जोड़कर काम करने में सक्षम था:

 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0); glFinish(); 

यह सुनिश्चित करने के लिए glFinish() आवश्यक है कि जीएल ने पिक्सल की प्रतिलिपि तैयार कर ली है इससे पहले कि हम उन्हें देखने की कोशिश करें।

संपादित करें: मेरे कार्यालय-साथी ने सुझाव दिया है कि GL_TEXTURE_2D को GL_TEXTURE_2D आवश्यकता है। अभी तक इसे करने की कोशिश नहीं की है

संपादित करें: यह प्रश्न भी देखें

GraphicBuffer एंड्रॉइड सोर्स कोड का एक हिस्सा है, GraphicBuffer में नहीं। यह आपके संदर्भ के लिए देखें: https://github.com/fuyufjh/GraphicBuffer