2016-11-29 38 views
0

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

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

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

回答

1

有一个数据库,在这里你可以查找GL_OES_fragment_precision_high这表明Android设备的略低于50%的支持highp在片段着色器。你可以检查哪些有和没有这个扩展名。 link

但是,这可能是误导性的,因为GLES扩展已被撤销,所以也许有些设备不再报告它,即使它们确实支持highp,所以您可以认为这至少50% - 它可能是一个很高。扩展名被替换为GetShaderPrecisionFormat,我无法找到一个好的数据库。

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

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

最后,当你提到“精密mediump浮动;” IMO你应该选择对案件逐案基础上的精度,而不是选择整个着色器的水平。如果你对所有东西都使用highp(特别是基于颜色的操作,很容易变得很低),你会在某些GPU上浪费很多性能。当然,你可以设置一个默认精度,然后在必要时重写,也许这就是你正在做的事情,但是我个人并不喜欢在片段着色器中设置默认精度,然后编译器迫使我做到明确。

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

+0

是的,我目前使用'mediump'作为默认值,并在任何地方明确指定'lowp'。我只是将需要它的变量碰到'highp'并保留缺省值。 – Karu

+1

关于回退行为,规范意味着如果设备不支持它,则“highp”是一个编译错误:“顶点语言要求任何使用lowp,mediump和highp的编译和链接而不出错。 lowp和mediump编译没有错误,支持highp是可选的。“ – Karu

+0

Yikes我认为你是对的。Spec还说:“如果实现无法提供在编译单元中存储变量的声明精度,则必须导致编译或链接错误。”实际上,我在片段着色器中使用highp发布了很多游戏,并且从来没有发生错误。似乎我可能会依赖司机的不正确行为并逃避。 – Columbo

相关问题