Android GLES 2.0:帧缓冲渲染到半浮点纹理适用于某些设备,而不是其他设备

Posted

技术标签:

【中文标题】Android GLES 2.0:帧缓冲渲染到半浮点纹理适用于某些设备,而不是其他设备【英文标题】:Android GLES 2.0: framebuffer rendering to half-float texture works on some devices, not others 【发布时间】:2014-12-09 19:42:31 【问题描述】:

android 上使用 GLES 2.0,我正在尝试渲染到由纹理支持的帧缓冲区。纹理和帧缓冲区是这样创建的:

final int GL_RGB16F_EXT = 0x881B;
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, width, height, 0,
        GL_RGB16F_EXT, type, null);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
    GLES20.GL_TEXTURE_2D, textureHandle, 0);

对于type=GL_HALF_FLOAT_OES,这适用于某些设备,但在其他设备上提供GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 状态。

纹理是使用GL_NEAREST 缩小和放大模式创建的。

请注意,在某些设备(Nexus 5)上,上述内容仅在我使用“GL_RGB”而不是“GL_RGB16F_EXT”作为内部格式时才有效,在某些设备(Nexus 6/7)上它仅适用于 @ 987654327@,在某些情况下它适用于 (Nexus 9),而在某些情况下它不适用于任何一种 (Nexus 4)。

奇怪的是,我所有的设备,包括故障设备,都报告了GL_OES_texture_half_floatGL_EXT_color_buffer_half_float

我还能在这里遗漏什么?

【问题讨论】:

【参考方案1】:

我认为 ES 2.0 的正确参数组合是:

final int GL_HALF_FLOAT_OES = 0x8D61;
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, width, height, 0,
        GLES20.GL_RGB, GL_HALF_FLOAT_OES, null);

遗憾的是,ES 2.0 不支持 glTexImage2D() 的大小内部格式。它从格式/类型参数派生内部格式。在 ES 3.0 中添加了调整大小的内部格式。

基于EGL_color_buffer_half_float spec,GL_RGB16F_EXT 仅支持作为glRenderbufferStorage() 的内部格式。

【讨论】:

嗯,这也是我的第一次尝试,但它似乎不适用于 Nexus 6 或 7(帧缓冲区状态返回 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)。我同意 EXT_color_buffer_half_float 文档仅针对 glRenderbufferStorage() 提及 GL_RGB16F_EXT,但这似乎与 GLES 驱动程序在某些设备上的实际行为不一致。不过感谢您的建议。 可悲的现实是许多移动 OpenGL 驱动程序存在很多问题。所以仅仅因为它不起作用,这并不意味着调用不正确。

以上是关于Android GLES 2.0:帧缓冲渲染到半浮点纹理适用于某些设备,而不是其他设备的主要内容,如果未能解决你的问题,请参考以下文章

Android GLES3.0 帧缓冲不完整

使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是不是可以保留多重采样?

帧缓冲区 OES 不完整,android

android opengl 2.0 模板缓冲区不起作用

OpenGL ES 2.0 剪裁测试

OpenGLES 2.0 帧缓冲区可以同时绑定到纹理和渲染缓冲区吗?