簡體   English   中英

Android OpenGL ES讀取紋理像素

[英]Android OpenGL ES read texture pixels

我相機的預覽渲染為紋理。 我有textureId,我試圖在FBO上渲染紋理,所以我可以glReadPixels

當我實際讀取像素時,所有像素看起來都是黑色的。

這是我目前使用的代碼:

//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 glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D, getTextureId(), 0); 由於某些原因。

來自文檔:

如果零綁定到目標,則生成GL_INVALID_OPERATION。 如果textarget和紋理不兼容,則生成GL_INVALID_OPERATION。

我的textureId1

更仔細地閱讀文檔。 你的紋理ID可能是1,但你當前綁定到目標的可能實際為0.如果不調用glBindTexture(GL_TEXTURE_2D, mTangoCameraTexture.getTextureId()); 然后GL_TEXTURE_2D (目標)是你設置的最后一個,我傾向於說它可能是0。

如果您發現圍繞glReadPixels()存在性能問題,則應考慮將其與Pixel Buffer Object一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM