2016-04-15 7 views
1

私のカメラからのプレビューは、テクスチャにレンダリングされます。私はtextureIdを持っており、テクスチャをFBOにレンダリングしようとしていますので、glReadPixelsとすることができます。Android 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); 

} 

は、私はそれを見ることができています - ので、実際にカメラに拘束されないテクスチャが除外されています。

編集:何かの理由でglFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, getTextureId(), 0);GL_INVALID_OPERATIONが発生しています。ドキュメントから

:ゼロがターゲットにバインドされている場合

GL_INVALID_OPERATIONが生成されます。 textargetとtextureが互換性がない場合、GL_INVALID_OPERATIONが生成されます。

私のtextureId1です。

答えて

0

ドキュメントをよく読んでください。あなたのテクスチャIDは1かもしれませんが、現在ターゲットに縛られているものは実際には0でしょう。glBindTexture(GL_TEXTURE_2D, mTangoCameraTexture.getTextureId());に電話をしないと、GL_TEXTURE_2D(ターゲット)はあなたが最後に設定したものですおそらく0.

glReadPixels()のパフォーマンスに関する問題がある場合は、ピクセルバッファオブジェクトと一緒に使用することを検討する必要があります。

関連する問題