OpenGL ES 2.0 FrameBuffer返回黑屏

时间:2018-02-15 19:43:08

标签: android opengl-es framebuffer texturing

好吧我制作了一个应用程序,它使用FBO渲染到纹理,然后使用这个纹理在四边形上显示它。

这是我用来初始化FBO和纹理的代码:

    IntBuffer intBuffer = IntBuffer.allocate(1);
    GLES20.glGenFramebuffers(1, intBuffer);
    fbo = intBuffer.get(0);

    GLES20.glGenTextures(1, intBuffer);
    tex = intBuffer.get(0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex);
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fbo);

    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, tex, 0);

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

(1. onDrawFrame()中的代码)

问题在于我不知道将代码放在何处,所以首先我将代码放在onDrawFrame()方法中。当我这样做时,纹理效果很好,我得到了我想要的结果。但是因为我正在创建一个新的FBO并且纹理每一帧,一段时间后应用程序开始滞后,最后模拟器崩溃。

(2. onSurfaceChanged()中的代码)

在注意到这种行为后,我决定将代码放在onSurfaceChanged()方法中。这次应用程序没有崩溃,但整个纹理是黑色的。我试图清除纹理或在其上绘制一个白色四边形,但没有任何效果。当我尝试从GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER)GLES20.glGetError()收到错误时,它说一切都很好。

我还尝试将代码放在if-clause包围的onDrawFrame()方法中,这样它只执行一次。结果也是黑色纹理。

(3. onDrawFrame()onSurfaceChanged()中的代码)

我尝试的最后一件事是将代码放在两种方法中。我想减少onDrawFrame()方法中的代码,直到找到使纹理正常工作的代码行。但是当我启动应用程序时,四边形闪烁,从黑色纹理变为正确的纹理。

纹理显示没有问题,因为它适用于一种方法。我还尝试在代码中添加深度缓冲区,但结果是一样的。因为我在我的应用程序中不需要它,所以我对它进行了评论。

有没有人可以说明发生了什么?如果有人有一个有效的应用程序,但不知道我的问题是什么,如果那个人可以上传项目,那将是很好的,因为我没有找到一个有Android项目下载的教程。

1 个答案:

答案 0 :(得分:0)

好的,感谢Rabbid76为我提供了一份清单,以便找到我的问题。我试着用fbo作为纹理。这是正确的绑定:GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex)。在教程中我读过FBO也受到了约束。当我在onDrawFrame()方法中初始化FBO并将其用作纹理时,我仍然不知道它为什么会起作用。