Glsl 为什么webgl噪波不提供随机值?

Glsl 为什么webgl噪波不提供随机值?,glsl,shader,sfml,Glsl,Shader,Sfml,我正在使用以下代码,以及webgl noise的生成器 void main() { float noise = snoise(vec3(gl_FragCoord.x, gl_FragCoord.y, 0.0)); vec4(1.0, 1.0, 1.0, noise); } 我期待一个完全随机的输出,但我得到的是: 我做错了什么 编辑:您看到的是单个纹理,我在SFML中将着色器应用于该纹理,如下所示: window.draw(myTexture, myShader); 据我所知,噪音

我正在使用以下代码,以及webgl noise的生成器

void main() {
float noise = snoise(vec3(gl_FragCoord.x, gl_FragCoord.y, 0.0));
    vec4(1.0, 1.0, 1.0, noise);
}
我期待一个完全随机的输出,但我得到的是:

我做错了什么

编辑:您看到的是单个纹理,我在SFML中将着色器应用于该纹理,如下所示:

window.draw(myTexture, myShader);

据我所知,噪音并不是随机的,而是看起来更自然的“随机性”。给出了柏林噪声的一个很好的概述,我认为这就是您正在使用的

你的图像太不随机了,我怀疑你的编码有错误。我们能看看整个应用程序吗


好的,@Andon已经破解了它。

如果您包含noise3D库的功能,您可以将“分割屏幕”与“随机性”进行比较

//我自己的随机数生成器
//请参阅堆栈溢出:http://stackoverflow.com/questions/5149544/can-i-generate-a-random-number-inside-a-pixel-shader/10625698#10625698
浮点随机(vec2p)
{
vec2 r=vec2(23.14069263277926,2.665144142690225);
返回分数(cos(mod(12345678,256.*dot(p,r)));
}
void main()
{
vec2p=(-iResolution.xy+2.0*gl_FragCoord.xy)/iResolution.y;
float th=(-iResolution.x+2.0*imuse.x)/iResolution.y;
if(imuse.z th)
噪声=随机(p);
vec3颜色=vec3(噪音,噪音,噪音);
颜色*=平滑步长(0.006,0.008,绝对值(p.x-th));
gl_FragColor=vec4(颜色,1.0);
}

ShaderToy版本与“分屏”比较:

首先,这不是perlin噪波应该使用的方式

此无平铺柏林函数每1x1单位生成渐变

    snoise(vec3(gl_FragCoord.x, gl_FragCoord.y, 0.0))
这句话很愚蠢。因为它正在调用snoise(1,1,0),snoise(1,2,0)。。 这里它等于一个随机函数

你应该得到snoise(1.001,1,0),snoise(1.002,1,0)的值。。 然后你会看到美丽的天然柏林噪音

perlin噪波着色器的简化版本使用了一种快速但较差的方法来生成随机渐变。作者假设你会放大噪音,重复的模式将不明显


我建议使用基于纹理的着色器来获得良好的随机效果。纹理应该包含复杂的排列信息,这有助于着色器生成随机效果。

为了更好地表达@Alchesman的意图:

snoise(vec3(gl_FragCoord.x, gl_FragCoord.y, 0.0));
正在使用变化太快(频率太高)的
x
y
值。像snoise这样的柏林噪音在这个尺度上看起来并不好。它的设计具有大致单位大小的特征。您使用像素(或多或少)作为单位,因此随机特征是像素大小的,使其不平滑,并且周期也太小

相反,使用

float r = 10.0 / iResolution.y; // pseudocode
snoise(vec3(gl_FragCoord.x * r, gl_FragCoord.y * r, 0.0));

其中
iResolution.y
是窗口的y分辨率。现在,噪波图案将足够大,可以像预期的那样看起来平滑,并且周期将足够大,不会在图像中明显重复。

图像应该可以工作,这里有一个直接链接:问题是,我的图像有清晰的图案,而柏林噪波看起来应该像这样随机:我现在看到了。一分钟前,直接链接也失败了。不要指望噪音会带来“随机性”。尤其是柏林/单纯形(顺便说一下,这是单纯形噪音,经常重复)。如果您通过一些不同的输入来调制噪声,那么您将得到类似“随机性”的结果。例如,如果您将采样纹理乘以
gl\u FragCoord
处噪声函数的输出……而此链接可能会回答这个问题,最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。这如何回答“为什么webgl noise不提供随机值?”的问题?实际上,您引用的这行代码并不是(在所有环境中)使用整数值调用snoise():如果您尝试将
snoise(q)
更改为
snoise(floor(q))
(靠近底部),结果改变了。这也不愚蠢。。。OP引用的snoise()实现没有描述适当输入的文档。(这也不是一个真正的随机函数……这正是OP的问题。)然而,你的观点是正确的,柏林噪声设计用于更小的尺度值。
float r = 10.0 / iResolution.y; // pseudocode
snoise(vec3(gl_FragCoord.x * r, gl_FragCoord.y * r, 0.0));