2

有人可以回答我这条线是怎么来的:

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?

顺便说一句,我没有将它附加到帧缓冲区,我将它用作只读纹理。ARM 上返回的代码是 1280,Tegra 完全“不抱怨”。

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

4

1 回答 1

1

这个电话在我看来完全有效。错误 1280 是GL_INVALID_ENUM,这表明 3 个枚举类型参数之一无效。但每一个本身,以及它们的组合,都是符合规范的。

最可能的解释是驱动程序错误。我发现几个 ES 3.0 驱动程序有很多问题,所以发现问题并不奇怪。


下面的部分是在假设纹理将用作渲染目标(FBO 附件)的情况下编写的。如果您正在寻找问题的直接答案,请忽略。


GL_R16F在标准 ES 3.0 中不可显色。

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

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

这意味着设备需要EXT_color_buffer_half_float 扩展来支持渲染到R16F. 在 ES 3.1 中也是如此。

于 2014-12-16T16:24:38.033 回答