如何修复Perlin Noise中的块状伪像

时间:2017-07-02 04:48:13

标签: perlin-noise

我尝试在Rust语言中制作2D Perlin噪音,如:https://en.wikipedia.org/wiki/Perlin_noise

中所述

我的随机渐变函数如下:

fn random_gradient_vector(rng : &mut rand::Rng) -> (f64, f64)
{
    let theta = rng.next_f64() * 2.0 * 3.1415926536;

    return (theta.cos(), theta.sin());
}

我的插值功能:

fn interpolate(a : f64, b : f64, x : f64) -> f64
{
    let mut w = x*x*x*(x*(x*6.0 - 15.0) + 10.0);
    return a * (1.0-w) + b * (w);
}

结果,充其量:

enter image description here

我做错了什么导致清晰可见的网格线?我想到了三种解决方法:

1)我需要找到的代码中存在一个错误。 2)尝试在噪声中添加不同的八度音程,也许每个都被转换以消除伪像。 3)尝试不同的噪声算法。

史蒂夫

1 个答案:

答案 0 :(得分:1)

"块状文物"如果距离矢量计算不正确,则会发生。他们应该从角落指向点:

var d0 = vec2.dot(vx0, [u,v]);
var d1 = vec2.dot(vx1, [u-1,v]);
var d2 = vec2.dot(vx2, [u,v-1]);
var d3 = vec2.dot(vx3, [u-1,v-1]);

正确的结果:https://jsfiddle.net/f65w5jqa/

块状工件(uv和交换的工件):https://jsfiddle.net/p17fh1qp/