好吧,我制作了一个应用程序,它使用 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()
方法中的代码,直到找到使纹理正常工作的代码行。但是当我启动应用程序时,四边形闪烁,从黑色纹理变为正确的纹理。
纹理显示没有问题,因为它使用一种方法。我还尝试在代码中添加深度缓冲区,但结果是一样的。因此,由于我的应用程序中不需要它,因此我将其注释掉。
有没有人可以说一下是怎么回事?如果有人有一个可以运行的应用程序但不知道我的问题是什么,那么如果那个人可以上传该项目会很好,因为我没有找到一个有安卓项目可供下载的教程。