我有这个片段着色器代码,在iOS模拟器(非视网膜)和iPad2(非视网膜)之间显示不同:
highp vec2 textCoord;
textCoord.x = gl_FragCoord.x / uViewPortWidth;
textCoord.y = gl_FragCoord.y / uViewPortHeight;
highp vec4 resultColor = texture2D(uTexture, textCoord);
gl_FragColor = resultColor;
在某种程度上,在真实设备中,结果是锯齿状的。但是在模拟器中,它很顺利。
真实设备:
是不是因为gl_FragCoord的精度问题?奇怪的是它只能在模拟器上运行......
如何处理gl_FragCoord的任何提示?谢谢!
答案 0 :(得分:2)
gl_FragCoord
定义为mediump
。因此,ES 2的兼容实现可以为其提供少至10位的存储。但是,ES没有设置上限,因此另一个同等兼容的实现可能会丢弃精度修饰符并将所有内容视为16位(或更高)类型。
它还规定:
用于内部评估操作的精度,以及 精确资格随后与任何结果相关联 中间值,必须至少与最高精度一样高 操作消耗的操作数的限定。
因此,用于执行计算的精度至少为mediump
- 或highp
,如果这是uViewPortWidth/Height
的声明。
然而,确切地说,给你的精确度依赖于实现。有趣的是,模拟器通常使用更高的精度。
因此,作为第一次尝试,请确保以任何方式划分highp
。如果没有达到你想要的精度,那么GPU可能不会在一个单元中提供它,因此你将不得不考虑一个更复杂的解决方案。