在 iOS/Android 的片段着色器中使用 highp 可以吗?

Is it OK to use highp in fragment shaders for iOS/Android?

根据 GLSL ES reference,在片段着色器中支持 highp 是可选的。所以我一直在我所有的片段着色器中使用 precision mediump float; 所以我没有设备兼容性问题。在某些情况下,只有 10 位的相对精度很难产生好看的输出,我希望能够在必要时切换到 highp

在片段着色器中要求 highp 支持在实践中有多安全?我已经在各种设备上尝试过它,并且它适用于我尝试过的所有设备。我只是想瞄准 Android 4.1+ 和 iOS 8+,所以如果它只是不支持它的硬壳旧设备那么我没问题。

我知道有运行时检查等。我应该这样做,但首先我想大致了解一下我们正在谈论的设备在野外的百分比。我无法在任何地方找到此信息。如果只有 75% 的设备支持 highp,那么我会坚持使用 mediump。如果 99.9% 的设备都支持它,highp 我们来了。

有一个数据库,您可以在其中查找 GL_OES_fragment_precision_high,这表明只有不到 50% 的 Android 设备在片段着色器中支持 highp。您可以检查哪些有和没有此扩展名。 link

但是,这可能会产生误导,因为 GLES 扩展已被撤销,因此即使某些设备支持 highp,也可能不再报告它,因此您可以考虑至少 50% - 它可能是高很多。该扩展已替换为 GetShaderPrecisionFormat,我找不到合适的数据库。

我使用小得多的数据集在 28 台设备上测试了我的游戏,其中 8 台不支持片段着色器中的 highp,包括 Nexus 7 和 Samsung Galaxy Note II 运行 Android 4.4 和 Samsung Galaxy S3 运行 4.3(我拥有的其他设备在片段着色器中不支持 highp 是非常不起眼的品牌)

我很确定你所有的目标 iOS 设备都支持片段着色器中的 highp,但现在找不到任何证据来支持它。

最后,正如您提到的 "precision mediump float;",IMO 您应该根据具体情况选择精度,而不是为整个着色器选择级别。如果你在所有事情上都使用 highp(特别是基于颜色的操作,很容易成为 lowp),你会在某些 GPU 上浪费很多性能。当然,您可以设置默认精度,然后在必要时覆盖,也许这就是您正在做的,但我个人不喜欢在片段着色器中设置默认精度,然后编译器强制我明确。

编辑:此外,即使对于不支持它的设备,也允许在片段着色器中使用 highp,您将获得 mediump。在很多情况下,回退行为很好——高端设备获得更好的精确照明或其他,低端设备回退到不太完美但仍然可以接受的东西。