好吧,我制作了一个应用程序,该应用程序使用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并将其用作纹理时,我仍然不知道为什么它可以工作。