OpenGL ES 3.0半浮点(R16F)纹理

3
有人能告诉我为什么这行代码:
GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0,  GLES30.GL_R16F, width, height, 0,  GLES30.GL_RED, GLES30.GL_HALF_FLOAT, myBuffer);

在tegra4上工作,但在ARM Mali-T628 MP6上无法工作?顺便说一下,我没有将其附加到framebuffer上,而是将其用作只读纹理。在ARM上返回的代码是1280,而Tegra则“没有抱怨”。

另外,我知道Tegra4获得了半浮点纹理的扩展,而该特定Mali没有该扩展,但既然它是OpenGL ES 3.0,难道不应该支持这样的纹理吗?

1个回答

1
那个调用对我来说看起来完全有效。错误1280是GL_INVALID_ENUM,这表明3个枚举类型参数中的一个无效。但每个参数本身以及它们的组合都符合规范。最可能的解释是驱动程序错误。我发现一些ES 3.0驱动程序存在许多问题,所以发现问题并不令人意外。

以下部分是基于纹理将被用作渲染目标(FBO附件)的假设而编写的。如果您正在寻找直接回答问题的答案,请忽略此内容。


GL_R16F在标准ES 3.0中不支持颜色渲染。

如果您打开规范文档,可以在www.khronos.org(直接链接)上找到,第130-132页的表3.13列出了所有纹理格式及其属性。R16F在“可渲染颜色”列中没有复选标记,这意味着它不能用作渲染目标。

相应地,在第129-130页的“必需纹理格式”部分中,“R16F”也列在“仅纹理颜色格式”下。

这意味着设备需要EXT_color_buffer_half_float扩展来支持对R16F的渲染。这在ES 3.1中仍然适用。


1
我写道:"我没有将其附加到帧缓冲区",我不使用它作为渲染目标。我想将其用作只读LUT纹理。 - user1577566
好的,我编辑了答案尽可能地恢复了它。对于最初的误解表示歉意。 - Reto Koradi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接