帧缓冲区 OES 不完整,android

Posted

技术标签:

【中文标题】帧缓冲区 OES 不完整,android【英文标题】:framebuffer OES is incomplete, android 【发布时间】:2017-02-11 16:22:04 【问题描述】:

当我尝试创建帧缓冲区 OES 时,我需要一些帮助来弄清楚我做错了什么。

outTex = new int[1];
        GLES20.glGenTextures(2, outTex, 0);
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, outTex[0]);

        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

        GLES20.glTexImage2D(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                0,
                GLES11Ext.GL_RGBA8_OES,
                vp.width,
                vp.height,
                0,
                GLES11Ext.GL_RGBA8_OES,
                GLES20.GL_UNSIGNED_BYTE,
                null);
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);

        fbo = new int[1];

        GLES11Ext.glGenFramebuffersOES(1, fbo, 0);
        GLES11Ext.glBindFramebufferOES(GLES11Ext.GL_FRAMEBUFFER_OES, fbo[0]);

        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, outTex[0]);

        GLES11Ext.glFramebufferTexture2DOES(
                GLES11Ext.GL_FRAMEBUFFER_OES,
                GLES11Ext.GL_COLOR_ATTACHMENT0_OES,
                GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
                outTex[0],
                0
        );

        int  status = GLES11Ext.glCheckFramebufferStatusOES(GLES11Ext.GL_FRAMEBUFFER_OES);
        if  (status != GLES11Ext.GL_FRAMEBUFFER_COMPLETE_OES) 
            throw  new  RuntimeException("Framebuffer is not complete: " +
                    Integer.toHexString(status));
        

        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);

        GLES11Ext.glBindFramebufferOES(GLES11Ext.GL_FRAMEBUFFER_OES, 0);

我得到的状态是 36055,我不知道为什么它不完整。 有关更多信息,我想做的事情如下所示:

我想在下一个管道中使用外部 OES 纹理(来自媒体播放器),我们称之为 tex0: tex0 -> GPU 进程 ->(使用帧缓冲区)结果 tex1。 tex1 也必须是 GL_TEXTURE_EXTERNAL_OES。

我已尝试并成功使用绑定到帧缓冲区的 TEXTURE_2D 一切都使用正常的帧缓冲区。

所以我需要一些帮助来解决我在代码中做错了什么或寻找另一种方式(可能使用普通帧缓冲区)从 GPU 获取 TEXTURE EXTERNAL OES。

非常感谢。

【问题讨论】:

如果是ogl es 2.0,调用glGenFramebuffers(,) 主要问题是我从未使用过外部纹理和 oes 帧缓冲区,我真的不知道如何正确使用它们。我稍微修改了代码,保留了上面定义的纹理,并从帧缓冲区生成中删除了“oes”后缀。但现在我在 glFramebufferTexture2D 行得到 gl 错误 1280。 代码现在看起来像这样:GLES20.glGenFramebuffers(1, fbo, 0); GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fbo[0]); checkGLError("gen si 绑定帧缓冲"); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, outTex[0]); GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES11Ext.GL_TEXTURE_EXTERNAL_OES, outTex[0], 0); 检查纹理的宽度和高度。可能你需要一个 POT 纹理(2 的幂)。如果它们不是 POT,请尝试在生成纹理时将 vp.width 和 vp.height 替换为一些 POT 值(例如 1024),以查看是否可以解决问题。 你解决了吗?我在 ios 上有同样的问题。我只能使用渲染缓冲区创建 FBO,但不能仅使用纹理。我的代码和你的很相似。 【参考方案1】:

来自关于glTexImage2D 的目标[第一个参数] 的man 页面:

指定活动纹理单元的目标纹理。

必须是 GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_ TEXTURE_CUBE_MAP_POSITIVE_Z,或 GL_T EXTURE_CUBE_MAP_NEGATIVE_Z。

您正尝试在GLES11Ext.GL_TEXTURE_EXTERNAL_OES 上调用glTexImage2D,这不是上述之一。

根据我迄今为止的有限研究,您必须将 OES 纹理实际绘制到绑定到 texture_2d 的帧缓冲区中。从那里您可以通过帧缓冲区或 texture_2d 访问像素。

【讨论】:

以上是关于帧缓冲区 OES 不完整,android的主要内容,如果未能解决你的问题,请参考以下文章

WebGL2:不完整的帧缓冲区

多样本帧缓冲区仅与渲染缓冲区不完整

英特尔高清显卡 - 帧缓冲区不完整?

Android glClear 导致 glError 1286

Android OpenGLES3绘图 - 帧缓冲

设置 GL_TEXTURE_2D_ARRAY,帧缓冲不完整