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_float
和GL_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:帧缓冲渲染到半浮点纹理适用于某些设备,而不是其他设备的主要内容,如果未能解决你的问题,请参考以下文章