忽略 GLSL 精度限定符

GLSL precision qualifiers ignored

我们的 OpenGLES2.0 着色器在 IOS 和大多数 Android 设备上运行良好,但在 Amazon Kindle Fire 7 上,我们的不同组件之一似乎正在失去精度

它在顶点着色器和像素着色器中定义为

varying highp vec4 v_worldposition;

我们还有

precision highp float;

在每个文件的顶部。

然而,在这台设备上,数字越高,精度就越差。精度在 0 左右有很多,但随着位置达到 200+,精度下降到大约 0.1 个单位——所以看起来着色器正在使用 16 位浮点数。在我看来,一点也不高,但也许这就是它所能做的?

它可能对所有不同的组件使用 16 位浮点数,但它在我们的例子中表现得非常糟糕,因为我们在基于世界坐标的像素着色器中进行纹理处理。

有谁知道是否有办法在着色器或其他代码中强制使用 32 位浮点数,或者 Amazon Fire 7 是否甚至可以支持它。它可能是清单中的设置吗?这是我们发现此问题的唯一 Android 台设备。

OpenGLES 2 规范允许设备在片段着色器中仅支持中等精度。

据推测,Amazon Kindle Fire 7 的 Mali-450MP4 GPU 就是这样一种设备。可以在运行时使用 glGetShaderPrecisionFormat.

进行查询

您要么必须放弃对此类设备的支持(说起来容易做起来难,因为没有简单的清单选项),要么必须重构着色器以便不依赖高精度,或者在运行时检测并使用这种设备的低细节着色器。我倾向于后者。