【发布时间】:2018-02-15 19:43:08
【问题描述】:
好吧,我创建了一个应用程序,它使用 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() 方法中的代码,直到找到使纹理正常工作的代码行。但是当我启动应用程序时,四边形闪烁,从黑色纹理变为正确的纹理。
纹理显示没有问题,因为它使用一种方法。我还尝试在代码中添加深度缓冲区,但结果是一样的。因此,由于我的应用程序中不需要它,所以我将其注释掉。
有没有人能说出发生了什么事?如果有人有一个可以运行的应用程序,但不知道我的问题是什么,那么如果那个人可以上传该项目,那就太好了,因为我没有找到一个有 android 项目可供下载的教程。
【问题讨论】:
-
你能不能至少说一下我问错了什么。
-
你问错了什么 - 你的问题不完整。仅解决问题的一部分非常困难。
标签: android opengl-es framebuffer texturing