【问题标题】:Is it OK to use highp in fragment shaders for iOS/Android?在 iOS/Android 的片段着色器中使用 highp 可以吗?
【发布时间】:2016-11-29 02:33:38
【问题描述】:

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

在片段着色器中要求highp 支持在实践中有多安全?我已经在各种设备上尝试过它,并且它适用于我尝试过的每台设备。我只希望定位到 Android 4.1+ 和 iOS 8+,所以如果只是不支持它的硬壳旧设备,那么我可以接受。

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

【问题讨论】:

    标签: android ios opengl-es glsles


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 是的,我目前使用mediump 作为默认值,并在任何我可以的地方明确指定lowp。我只是将需要它的变量增加到highp 并保留默认值。
    • 关于回退行为,规范暗示 highp 如果设备不支持它是一个编译错误:“顶点语言需要任何使用 lowp、mediump 和 highp 来编译和链接而不会出现错误.片段语言需要任何使用lowp和mediump才能正确编译。对highp的支持是可选的。”
    • 哎呀,我认为你是对的。 Spec 还说:“如果实现不能为在编译单元中存储变量提供声明的精度,则它必须导致编译或链接错误。”。在实践中,我已经在片段着色器中使用 highp 发布了很多游戏,并且从未出现过错误。似乎我可能依赖于司机的不正确行为并侥幸逃脱。
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多