2013-07-01 7 views
5

हम 10नेक्सस 10 - बाहरी rendertarget को प्रस्तुत करना ही परिदृश्य में काम करता है

लाइव वॉलपेपर 2 छोटे (128x128) बाहरी framebuffers का उपयोग करता है उन दोनों के बीच पिंगपांग प्रतिपादन बनाने के लिए नेक्सस पर OpenGL ES 2.0 के साथ लाइव वॉलपेपर विकसित कर रहे हैं छवि धुंधला करने के लिए।

हालांकि यह किसी भी डिवाइस (यहां तक ​​कि वृद्ध मोटोरोला मीलस्टोन पर) पर पूरी तरह से ठीक काम करता है, यह Nexus 10 के साथ एक अजीब समस्या है। यह केवल तभी काम करता है जब डिवाइस लैंडस्केप ओरिएंटेशन में हो। यदि डिवाइस किसी अन्य स्थिति (90, 180 या 270 डिग्री) में घुमाया गया है तो फ्रेमबफर के पास केवल स्पष्ट रंग होता है। मैंने glClearColor को लाल रंग में सेट किया है, इसलिए यह स्पष्ट रूप से दिखाई देता है कि इन फ्रेमबफर को साफ़ कर दिया गया है लेकिन उनमें कुछ भी प्रस्तुत नहीं किया गया है।

मैंने इसे टेग्रा 2, टेग्रा 3, एड्रेनो 200, एड्रेनो 320, 2 पावरवीआर जीपीयू पर परीक्षण किया है और यह ठीक काम करता है।

यह कुछ अजीब चालक बग की तरह दिखता है, लेकिन माली ड्राइवर के कुछ विनिर्देश भी हो सकते हैं। कृपया सलाह दें।

कोड अंश।

Init framebuffers:

private void initBloomStuff() { 
    mBloomTextureID = loadTexture("textures/empty128.png"); 
    mBloomVertTextureID = loadTexture("textures/empty128.png"); 

    mBloomFBHeight = 128; 
    mBloomFBWidth = 128; 

    float blurSize = 1.0f; 

    // Texel offset for blur filter kernel 
    m_fTexelOffset = 1.0f/mBloomFBWidth/blurSize; 

    ByteBuffer tmpFB, tmpRB; 
    IntBuffer handle, renderbuffers; 
    int result; 

    tmpFB = ByteBuffer.allocateDirect(4); 
    tmpFB.order(ByteOrder.nativeOrder()); 
    handle = tmpFB.asIntBuffer(); 
    GLES20.glGenFramebuffers(1, handle); 
    framebufferHandle = handle.get(0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomTextureID); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebufferHandle); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, mBloomTextureID, 0); 

    checkGlError("FB 1"); 
    tmpRB = ByteBuffer.allocateDirect(4); 
    renderbuffers = tmpRB.asIntBuffer(); 
    GLES20.glGenRenderbuffers(1, renderbuffers); 
    checkGlError("FB 1 - glGenRenderbuffers"); 
    depthbufferHandle = renderbuffers.get(0); 
    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthbufferHandle); 
    checkGlError("FB 1 - glBindRenderbuffer"); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, mBloomFBWidth, mBloomFBHeight); 
    checkGlError("FB 1 - glRenderbufferStorage"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, depthbufferHandle); 
    checkGlError("FB 1 - glFramebufferRenderbuffer"); 

    result = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); 
    if (result != GLES20.GL_FRAMEBUFFER_COMPLETE) { 
     Log.d(TAG, "Error creating framebufer 1: " + result); 
    } else { 
     Log.d(TAG, "Created framebufer 1: " + result); 
    } 

    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, 0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 

    tmpFB = ByteBuffer.allocateDirect(4); 
    tmpFB.order(ByteOrder.nativeOrder()); 
    handle = tmpFB.asIntBuffer(); 
    GLES20.glGenFramebuffers(1, handle); 
    framebufferVertHandle = handle.get(0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomVertTextureID); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebufferVertHandle); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, mBloomVertTextureID, 0); 

    checkGlError("FB 2"); 
    tmpRB = ByteBuffer.allocateDirect(4); 
    renderbuffers = tmpRB.asIntBuffer(); 
    GLES20.glGenRenderbuffers(1, renderbuffers); 
    checkGlError("FB 2 - glGenRenderbuffers"); 
    depthbufferVertHandle = renderbuffers.get(0); 
    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthbufferVertHandle); 
    checkGlError("FB 2 - glBindRenderbuffer"); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, mBloomFBWidth, mBloomFBHeight); 
    checkGlError("FB 2 - glRenderbufferStorage"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, depthbufferVertHandle); 
    checkGlError("FB 2 - glFramebufferRenderbuffer"); 

    result = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); 
    if (result != GLES20.GL_FRAMEBUFFER_COMPLETE) { 
     Log.d(TAG, "Error creating framebufer 2: " + result); 
    } else { 
     Log.d(TAG, "Created framebufer 2: " + result); 
    } 

    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, 0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 

    mTriangleVerticesVignette = ByteBuffer.allocateDirect(mQuadTriangles.length * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); 
    mTriangleVerticesVignette.put(mQuadTriangles).position(0); 
} 

अमेरिकन प्लान को प्रदान:

GLES20.glUseProgram(mProgram); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mStemTextureID); 
    drawBird(); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mSphereTextureID); 
    drawSphere(); 

    GLES20.glViewport(0, 0, mBloomFBWidth, mBloomFBHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebufferHandle); 
    // GLES20.glBindRenderbuffer(GLES20.GL_FRAMEBUFFER, depthbufferHandle); 

    GLES20.glClearColor(1.0f, 0.5f, 0.5f, 1.0f); 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mStemTextureID); 
    drawBird(); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mSphereTextureID); 
    drawSphere(); 

    GLES20.glViewport(0, 0, screenWidth, screenHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
    // GLES20.glBindRenderbuffer(GLES20.GL_FRAMEBUFFER, 0); 

2 के बीच पिंग-पांग प्रतिपादन एफबीएस छवि को धुंधला करने के:

GLES20.glUseProgram(mBloomProgram); 
    GLES20.glUniform1i(mBloom_sTexture, 0); 
    GLES20.glUniform1f(mBloom_bloomFactor, 0.8f); 

    GLES20.glActiveTexture(GL10.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomTextureID); 
    GLES20.glViewport(0, 0, mBloomFBWidth, mBloomFBHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebufferVertHandle); 
    GLES20.glUniform1f(mBloom_TexelOffsetX, m_fTexelOffset); 
    GLES20.glUniform1f(mBloom_TexelOffsetY, 0.0f); 
    GLES20.glActiveTexture(GL10.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomTextureID); 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    drawBloom(); 
    GLES20.glViewport(0, 0, screenWidth, screenHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 

    GLES20.glActiveTexture(GL10.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomVertTextureID); 
    GLES20.glViewport(0, 0, mBloomFBWidth, mBloomFBHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebufferHandle); 
    GLES20.glUniform1f(mBloom_TexelOffsetX, 0.0f); 
    GLES20.glUniform1f(mBloom_TexelOffsetY, m_fTexelOffset); 
    GLES20.glActiveTexture(GL10.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomVertTextureID); 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    drawBloom(); 
    GLES20.glViewport(0, 0, screenWidth, screenHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 

    GLES20.glActiveTexture(GL10.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomTextureID); 
    GLES20.glViewport(0, 0, mBloomFBWidth, mBloomFBHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, framebufferVertHandle); 
    GLES20.glUniform1f(mBloom_TexelOffsetX, m_fTexelOffset/2); 
    GLES20.glUniform1f(mBloom_TexelOffsetY, m_fTexelOffset/2); 
    GLES20.glActiveTexture(GL10.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mBloomTextureID); 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    drawBloom(); 
    GLES20.glViewport(0, 0, screenWidth, screenHeight); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 

टेस्ट आवेदन बग पुन: पेश करने

आप यहां परीक्षण एपीके डाउनलोड कर सकते हैं: https://dl.dropboxusercontent.com/u/7197208/LiveWallpaperAnimTest.apk यह एक लाइव वॉलपेपर ऐप है, इसे इंस्टॉल करें और 'टेस्ट' लाइव वॉलपेपर चुनें (गुलाब के साथ एक आइकन है)।

जैसा कि आप देख सकते हैं, डिफ़ॉल्ट परिदृश्य अभिविन्यास में आपको पक्षी के चारों ओर कुछ 'खिलना' प्रभाव दिखाई देगा जो 2 फ्रेमबफर के बीच पिंग-पोंग प्रतिपादन द्वारा कार्यान्वित किया जाता है। किसी अन्य डिवाइस अभिविन्यास में यह काम नहीं करता है और स्पष्ट रंग (लाल) के साथ एफबी भरता है।

अतिरिक्त लिंक

मैं भी माली डेवलपर केंद्र और गूगल कोड इस समस्या को पोस्ट किया है:

http://forums.arm.com/index.php?/topic/16894-nexus-10-render-to-external-rendertarget-works-only-in-landscape/

http://code.google.com/p/android/issues/detail?id=57391

उत्तर

1

माली चालक सहायता टीम की पुष्टि कि यह एक ड्राइवर बग है और इसे ठीक करेगा अगले ड्राइवर संस्करण में। एक अस्थायी कामकाज के रूप में, वे glBindFramebuffer के बाद glViewport पर कॉल करने का प्रस्ताव करते हैं। यह कामकाज काम करता है - कॉल ऑर्डर बदलने के बाद मैंने सही प्रतिपादन प्राप्त करने में कामयाब रहे।

मैंने Google को एआरएम से संपर्क करने का प्रस्ताव दिया है ताकि आप निश्चित ड्राइवर उपलब्ध होने पर नेक्सस 10 के लिए एक निश्चित ओपनजीएल ईएस ड्राइवर शामिल कर सकें।अगर किसी को भी इस तेजी से होने की तैयार है, आप Android बग ट्रैकर में इस मुद्दे को तारांकित कर सकते हैं: http://code.google.com/p/android/issues/detail?id=57391

माली डेवलपर केंद्र मंचों जहां मैं इस मुद्दे को मामला दर्ज किया है के लिए लिंक: इस ड्राइवर बग है के रूप में http://forums.arm.com/index.php?/topic/16894-nexus-10-render-to-external-rendertarget-works-only-in-landscape/

एआरएम द्वारा सत्यापित और पुष्टि की गई, कृपया इस SO प्रश्न के लिए मतदान करने के बजाय Android issue #57391 पर जाएं और तारांकित करें। उम्मीद है कि यह Google को मुद्दे पर ध्यान देने और एक फर्मवेयर अपडेट जारी करने के लिए मजबूर करेगा, जिससे नेक्सस 10 बेहतर होगा। यही कारण है कि मैंने इस प्रश्न के लिए बक्षीस सौंपा है।

संपादित करें। यह बग अंततः एंड्रॉइड 4.4 में तय किया गया है।

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