OpenGL ES 2.0 Framebuffer还给黑屏



好吧,我制作了一个应用程序,该应用程序使用FBO呈现质地,然后使用此纹理将其显示在四Quad上。

那是我用来初始化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-sar的onDrawFrame()方法中,以便仅执行一次。结果也是黑色纹理。

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

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

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

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

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

相关内容

  • 没有找到相关文章