OpenGLES Android中的噪点屏幕

4

我试图在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);
 }

sin()的实现可能是系统特定的。查看这个问题的答案可以更好地了解您的噪音/随机函数如何工作。 - plastique
1个回答

3
几乎可以确定这是一个精度问题。您的mediump代码可能在某些设备上以标准单精度浮点执行,而在其他设备上以半精度执行(或在两者之间的任何位置)。
仅使用半精度无法以任何准确度进行这些计算。
您可以更改计算以使用highp,但接下来会遇到另一个问题,即许多旧设备不支持片段着色器中的highp。
我强烈建议您创建噪声纹理,并从中进行采样。它将在设备之间产生更一致的结果,并且我期望它在大多数移动GPU上速度更快。
这是一篇有关浮点精度的有趣文章:http://www.youi.tv/mobile-gpu-floating-point-accuracy-variances/ 这是Google Play商店上的相关应用程序
这是关于GPU精度更深入的讨论:https://community.arm.com/groups/arm-mali-graphics/blog/2013/05/29/benchmarking-floating-point-precision-in-mobile-gpus

我已经改成了highp,它起作用了。真的很有帮助,谢谢你。我仍然看到一些对比度问题,但根据http://www.youi.tv/mobile-gpu-floating-point-accuracy-variances/的说法,我无法完全消除它。 - Dima
嗨@Columbo,你对我的安卓应用有什么想法吗?它也会出现噪音屏幕,但是是使用Unity+Android Studio构建的-请参见https://stackoverflow.com/questions/61571759/how-to-solve-noise-screen-error-in-android-like-noise-in-tv - questionasker
@coderInrRain 不是这个问题。这个问题与某人在着色器中尝试生成噪声时遇到困难有关(在特效中通常很有用)。你的问题是Unity场景中的渲染错误,看起来像噪声 - 完全不同的情况。 - Columbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接