Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS/Android上使用highp片段着色器可以吗?_Android_Ios_Opengl Es_Glsles - Fatal编程技术网

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

在iOS/Android上使用highp片段着色器可以吗?,android,ios,opengl-es,glsles,Android,Ios,Opengl Es,Glsles,根据,片段着色器中对highp的支持是可选的。所以我一直在使用precision mediump float在我所有的片段着色器中,因此我没有设备兼容性问题。在某些情况下,仅以10位的相对精度就很难产生好看的输出,我希望能够在必要时切换到highp 在片段着色器中要求highp支持在实践中有多安全?我在各种设备上都试过,而且在我试过的每一台设备上都有效。我只想瞄准安卓4.1+和iOS 8+,所以如果只是一些不支持它的老旧设备,那么我可以接受 我知道有运行时检查等,我应该这样做,但首先我想大致了解

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

在片段着色器中要求
highp
支持在实践中有多安全?我在各种设备上都试过,而且在我试过的每一台设备上都有效。我只想瞄准安卓4.1+和iOS 8+,所以如果只是一些不支持它的老旧设备,那么我可以接受


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

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

但是,这可能是误导性的,因为GLE扩展已经被撤回了,所以也许一些设备不再报告它,即使它们支持HIPP,所以你可以认为50%最小,它可能会高很多。扩展名被GetShaderPrecisionFormat替换,我找不到一个好的数据库

使用更小的数据集,我在28台设备上测试了我的游戏,其中8台不支持highp in fragment shader,包括运行Android 4.4的Nexus 7和三星Galaxy Note II,以及运行4.3的三星Galaxy S3(我拥有的其他不支持highp in fragment shader的设备都是相当模糊的品牌)

我很确定你所有的目标iOS设备都支持highp in fragment shader,但是现在找不到任何证据来支持它

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


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

是的,我目前使用
mediump
作为默认设置,并在任何地方明确指定
lowp
。我只需要将需要它的变量增加到
highp
,并保留默认值。关于回退行为,规范暗示如果设备不支持它,则
highp
是一个编译错误:vertex语言要求使用lowp、mediump和highp进行编译和链接,不会出现错误。片段语言需要使用lowp和mediump来编译而不会出错。对highp的支持是可选的。“Yikes,我想你是对的。规范还说”如果一个实现不能为编译单元中的变量存储提供声明的精度,那么它必须导致编译或链接错误。在实践中,我已经发布了很多在片段着色器中使用highp的游戏,并且从未出现过错误。看来我可能依赖于司机的不正确行为,并侥幸逃脱。