我尝试在Android设备上创建噪音屏幕。为了获得随机我使用这个公式:
fract((sin(dot(gl_FragCoord.xy ,vec2(0.9898,78.233)))) * 4375.85453)
我在http://glslsandbox.com/进行了测试,结果很完美。
但是在手机和平板电脑上我还有其他结果
在Nexus 9上,我收到了这个:
但它并没有那么糟糕。在LG-D415上,我收到了这个
有人可以帮我吗?
着色器:
#ifdef GL_ES
precision mediump float;
#endif
float rand(vec2 co){
return fract((sin(dot(co.xy ,vec2(0.9898,78.233)))) * 4375.85453);
}
void main() {
vec2 st = gl_FragCoord.xy;
float rnd = rand(st);
gl_FragColor = vec4(vec3(rnd),1.0);
}
答案 0 :(得分:3)
这几乎肯定是一个精确的问题。您的基于mediump的代码可能在某些设备上以标准单精度浮点数执行,或在其他设备上执行半精度(或在其间的任何位置)。
半精度仅仅不足以进行任何精度的计算。
您可以将计算更改为使用highp,但是您将遇到下一个问题,即许多旧设备在片段着色器中不支持highp。
我强烈建议您创建一个噪声纹理,然后从中进行采样。它可以在各种设备上产生更加一致的结果,我希望它能在大多数移动GPU上快得多。
这是一篇关于浮点精度的有趣文章:http://www.youi.tv/mobile-gpu-floating-point-accuracy-variances/
这是Google Play商店中的related app。
这是对GPU精度的更深入讨论:https://community.arm.com/groups/arm-mali-graphics/blog/2013/05/29/benchmarking-floating-point-precision-in-mobile-gpus