OpenGLES Android上的噪音屏幕

时间:2015-12-23 08:29:31

标签: android opengl-es glsl shader

我尝试在Android设备上创建噪音屏幕。为了获得随机我使用这个公式:

fract((sin(dot(gl_FragCoord.xy ,vec2(0.9898,78.233)))) * 4375.85453)

我在http://glslsandbox.com/进行了测试,结果很完美。

结果表单http://glslsandbox.com/

enter image description here

但是在手机和平​​板电脑上我还有其他结果

在Nexus 9上,我收到了这个:

enter image description here

但它并没有那么糟糕。在LG-D415上,我收到了这个

enter image description here

有人可以帮我吗?

着色器:

 #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);
 }

1 个答案:

答案 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