好吧我制作了一个应用程序,它使用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()
收到错误时,它说一切都很好。
我还尝试将代码放在if-clause包围的onDrawFrame()
方法中,这样它只执行一次。结果也是黑色纹理。
(3. onDrawFrame()
和onSurfaceChanged()
中的代码)
我尝试的最后一件事是将代码放在两种方法中。我想减少onDrawFrame()
方法中的代码,直到找到使纹理正常工作的代码行。但是当我启动应用程序时,四边形闪烁,从黑色纹理变为正确的纹理。
纹理显示没有问题,因为它适用于一种方法。我还尝试在代码中添加深度缓冲区,但结果是一样的。因为我在我的应用程序中不需要它,所以我对它进行了评论。
有没有人可以说明发生了什么?如果有人有一个有效的应用程序,但不知道我的问题是什么,如果那个人可以上传项目,那将是很好的,因为我没有找到一个有Android项目下载的教程。
答案 0 :(得分:0)
好的,感谢Rabbid76为我提供了一份清单,以便找到我的问题。我试着用fbo作为纹理。这是正确的绑定:GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex)
。在教程中我读过FBO也受到了约束。当我在onDrawFrame()
方法中初始化FBO并将其用作纹理时,我仍然不知道它为什么会起作用。