0

好吧,我制作了一个应用程序,它使用 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()它说一切都很好。

我还尝试将代码放在onDrawFrame()用 if 子句包围的方法中,以便它只执行一次。结果也是黑色纹理。

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

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

纹理显示没有问题,因为它使用一种方法。我还尝试在代码中添加深度缓冲区,但结果是一样的。因此,由于我的应用程序中不需要它,因此我将其注释掉。

有没有人可以说一下是怎么回事?如果有人有一个可以运行的应用程序但不知道我的问题是什么,那么如果那个人可以上传该项目会很好,因为我没有找到一个有安卓项目可供下载的教程。

4

1 回答 1

0

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

于 2018-02-16T16:28:36.777 回答