2012-11-14 61 views
4

我是Android中的新手OpenGL ES。但现在,我需要使用OpenGL ES 2.0来做一些照片编辑。我在Android 4.1.2中找到示例代码"Hello-effect",它完成了编辑照片并将其呈现到窗口的工作。但现在,我还需要将编辑的照片保存到本地位图。我想可能有一些方法可以直接从纹理获取数据,但我发现的唯一方法是glReadPixels(...)。所以,我的一些尝试使用它:将2D纹理保存到Android OpenGL ES中的PNG

的第一个测试我做的:

  1. 我用GLSurfaceView表明已被android.media.effect API编辑的照片。
  2. 我在包含GLSurfaceView的相同布局中添加一个按钮。
  3. 单击按钮时,我会调用glReadPixels(...)来获取照片数据。 但是,作为第3步,我只得到了botton的数据。
我想,当我点击按钮时,窗口的framebuffer已被按钮的内容所取代。

第二次测试我做的:

  1. 我创建了一个FBO保存编辑后的照片,并使用glReadPixels(...)来获取照片的数据,但它是一个黑色的照片。

的代码看起来是这样的:

public void renderTextureOffscreen (int texId) { 
    // Bind default FBO 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, offScreenFrameBuffer[0]); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D, texId , 0); 

    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); 
    if(status == GLES20.GL_FRAMEBUFFER_COMPLETE) 
    { 
     // Set viewport 
     GLES20.glViewport(0, 0, mViewWidth, mViewHeight); 
     GLToolbox.checkGlError("glViewport"); 

     // Disable blending 
     GLES20.glDisable(GLES20.GL_BLEND); 

     // Set the vertex attributes 
     GLES20.glVertexAttribPointer(mTexCoordHandle, 2, GLES20.GL_FLOAT, false, 
      0, mTexVertices); 
     GLES20.glEnableVertexAttribArray(mTexCoordHandle); 
     GLES20.glVertexAttribPointer(mPosCoordHandle, 2, GLES20.GL_FLOAT, false, 
      0, mPosVertices); 
     GLES20.glEnableVertexAttribArray(mPosCoordHandle); 
     GLToolbox.checkGlError("vertex attribute setup"); 

     // Set the input texture 
     GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
     GLToolbox.checkGlError("glActiveTexture"); 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId); 
     GLToolbox.checkGlError("glBindTexture"); 
     GLES20.glUniform1i(mTexSamplerHandle, 0); 

     // Draw 
     GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
     GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
    } 

我的问题是,我的猜测是否正确?而作为FBO的方法,我是否失去了完成工作的关键步骤。

回答

0

尝试后

GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 

也是正确读出象素确保glReadPixels从右边线程调用,即在你的渲染器的子类。

另一件事,我看到你绑定用于FBO的纹理作为着色器的输入,你不能那样做。

我想RTT后,你正在渲染结果到一个四屏或在屏幕上的东西是正确的?

您可以显示您用于读取像素的其余代码吗?