2016-04-15 179 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一起使用。