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

时间:2016-11-29 02:33:38

标签: android ios opengl-es glsles

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

在片段着色器中需要highp支持的实际安全性如何?我已经在各种设备上试过它,它适用于我尝试过的每一台设备。我只是想要定位,比如Android 4.1+和iOS 8+,所以如果它只是那些不支持它的硬件旧设备那么我就可以了。

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

1 个答案:

答案 0 :(得分:1)

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

然而,这可能会产生误导,因为GLES扩展程序已被撤销,因此即使某些设备支持highp,也许某些设备不再报告它,因此您可以考虑最低50% - 它可能是更高。扩展名被GetShaderPrecisionFormat取代,我无法为此找到一个好的数据库。

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

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

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

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