2016-04-15 76 views
1

来自我的相机的预览呈现为纹理。我有textureId,并试图在FBO上渲染纹理,所以我可以glReadPixelsAndroid OpenGL ES读取纹理像素

当我实际上读取像素时,它们都显示为黑色。

这是我使用的那一刻代码:

//called when the camera first connects to the texture 
public void initBackBuffer() 
    { 
    // For use in getFramePixels() 
     intBuffer = ByteBuffer.allocateDirect(width * 
      height * 4) 
      .order(ByteOrder.nativeOrder()) 
      .asIntBuffer(); 
     IntBuffer framebuffer = IntBuffer.allocate(1); 
     glGenFramebuffers(1, framebuffer); 
     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get(0)); 
     int status = glGetError(); 
     if(status != GL_NO_ERROR) 
     { 
      Log.e("RENDERER", status + ""); 
     } 

     IntBuffer depthBufferName = IntBuffer.allocate(1); 

     glGenRenderbuffers(1, depthBufferName); 
     glBindRenderbuffer(GL_RENDERBUFFER, depthBufferName.get(0)); 
     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); 
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 
       depthBufferName.get(0)); 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 
       mTangoCameraTexture.getTextureId(), 0); 
     mOffscreenBuffer = framebuffer.get(0); 
     status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 

     if(status != GL_FRAMEBUFFER_COMPLETE) { 
      if(status == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT) 
       Log.e("RENDERER","GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"); 
      if(status == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT) 
       Log.e("RENDERER", "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT"); 
      Log.e("RENDERER", "FRAMEBUFFER ERROR:"+status); 

     } 
     glBindFramebuffer(GL_FRAMEBUFFER, 0); 

    } 
// called onFrameAvailable 
public void getFramePixels() { 
    glBindFramebuffer(GL_FRAMEBUFFER, mOffscreenBuffer); 
    int status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
    if(status != GL_FRAMEBUFFER_COMPLETE) 
    { 
     Log.e(TAG, "FRAMEBUFFER STATUS:"+status); 
    } 
    glReadPixels(0, 0, width, height, GL_RGBA, 
      GL_UNSIGNED_BYTE, 
      intBuffer.clear()); 
    StringBuilder str = new StringBuilder(); 
    for(int i = 0; i < intBuffer.capacity(); i++) 
    { 
     str.append(intBuffer.get();); 
    } 
    Log.d(TAG, "IMAGE:" + str.toString()); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

} 

如果我在屏幕上显示的质感,我能看出来 - 所以没有被真正束缚于相机的质感被排除。

编辑:GL_INVALID_OPERATION发生在glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, getTextureId(), 0);出于某种原因。

从文档:如果零被绑定到目标生成

GL_INVALID_OPERATION。 如果textarget和texture不兼容,则会生成GL_INVALID_OPERATION。

我的textureId1

回答

0

请仔细阅读文档。你的纹理ID可能是1,但是你目前绑定到目标的实际上可能是0.如果你不叫glBindTexture(GL_TEXTURE_2D, mTangoCameraTexture.getTextureId());那么GL_TEXTURE_2D(目标)就是你设置的最后一个值,我倾向于说的是大概是0.

如果你发现你有关于glReadPixels()的性能问题,你应该考虑将它与Pixel Buffer Object一起使用。