Glsl 平滑低倍频程柏林噪声

Glsl 平滑低倍频程柏林噪声,glsl,shader,webgl,fragment-shader,Glsl,Shader,Webgl,Fragment Shader,我正在尝试使用找到的噪波函数在片段着色器中创建超级简单的柏林噪波云 在低八度音阶时,由于缺少更好的词,我的输出是“blobby”。我只是想平滑这些斑点区域,并有平滑的噪音,但有一个比仅仅一个倍频程更详细一点 片段着色器: #ifdef GL_ES precision mediump float; #endif uniform float time; uniform vec2 resolution; // Noise related functions go here .. float su

我正在尝试使用找到的噪波函数在片段着色器中创建超级简单的柏林噪波云

在低八度音阶时,由于缺少更好的词,我的输出是“blobby”。我只是想平滑这些斑点区域,并有平滑的噪音,但有一个比仅仅一个倍频程更详细一点

片段着色器:

#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 resolution;

// Noise related functions go here ..

float surface3 ( vec3 coord ) {
        float frequency = 4.0;
        float n = 0.0;  

        n += 1.0    * abs( cnoise( coord * frequency ) );
        n += 0.5    * abs( cnoise( coord * frequency * 2.0 ) );
        n += 0.25   * abs( cnoise( coord * frequency * 4.0 ) );

        return n;
}

void main( void ) {
        vec2 position = gl_FragCoord.xy / resolution.xy;

        float n = surface3(vec3(position, time * 0.1));

        gl_FragColor = vec4(n, n, n, 1.0);
}
现场示例:


左边是我现在拥有的。我怎样才能实现更符合正确图像的功能?

最简单的方法是去掉surface函数中的两个noise调用。只留下第一条噪音呼叫线路,您就会得到与第一条类似的东西:

多倍频程噪声中的尖锐线条来自于使用abs(),拆下abs()并将其替换为使噪声值平方或执行类似于0.5*(1.0+cnoise())的操作(如果cnoise输出介于-1..1之间)

这是一些摆弄的结果

谢谢你,伊尔马里。我考虑过你的解决方案,只使用了一个八度的噪声,但结果似乎仍然显得很模糊。我也不太喜欢黑白区域之间的高对比度。我的理解是,增加额外的八度音阶会增加细节,但也会降低结果的对比度(基于),这正是我想要的。我讲道理吗?