【问题标题】:Confusion on the return value of turbulence of Perlin noisePerlin噪声湍流返回值的困惑
【发布时间】:2023-01-20 23:04:53
【问题描述】:

湍流函数

按照我的理解,Perlin noise中的湍流就是把不同频率不同权重的Perlin noise累加起来。基于这种理解,湍流的返回值应该具有相同的颜色(或像素)范围。

但是,在某些实现中 (Ray Tracing: The Next Week),turbulence 的范围与 [0, 1] 的范围不匹配

double turb(const point3& p, int depth=7) const {
    auto accum = 0.0;
    auto temp_p = p;
    auto weight = 1.0;

    for (int i = 0; i < depth; i++) {
        accum += weight*noise(temp_p);
        weight *= 0.5;
        temp_p *= 2;
    }

    return fabs(accum);
}

weight的初始值为1,noise的取值范围为[-1, 1]。所以有可能在第一次迭代后,accum变成了1,后面的迭代可能使它大于1。

我也阅读了original paper中的相关部分,但是,伪代码似乎非常相似:

function turbulence(p)
  t = 0
  scale = 1
  while (scale > pixelsize)
      t += abs(Noise(p / scale) * scale)
      scale /= 2
  return t

根据以下行,Perlin 原始论文中的颜色表示似乎也在 [0, 1] 范围内:

例如, 变量列表 [red green blue] 的一个可能像素是 [0.5 0.3 0.7]。

所以我想知道 turbulence 函数是否是这样设计的,因为返回超出范围的值的可能性极低。或者我错过了什么?

噪声函数

另外,原论文中对Noise()函数的描述相当混乱。 Perlin 没有明确写出返回值的范围。但他是这样使用的:

通过在模拟对象的可见表面点评估 Noise(),我们可以创建一个简单的“随机”表面纹理(图 Spotted.Donut): 颜色 = 白色 * 噪声(点)

所以我假设它应该是 [0, 1] 这使得表达式 white * Noise(point) 在 [0, 1] 的范围内

但是在turbulence函数中添加了一个abs()函数。

【问题讨论】:

    标签: graphics noise perlin-noise


    【解决方案1】:

    噪声函数或湍流函数(也称为分形噪声)的范围在很大程度上取决于它的实现和使用。例如,值噪声包括在范围 [0, 1] 的均匀间隔的随机值之间进行插值,因此它的范围也是 [0, 1]。另一方面,梯度噪声存在于通过原点的线性函数之间进行插值,因此它的范围是 [-a, a](我猜它是 [-1, 1] 但我不确定)。如果范围不符合应用程序,则可以简单地重新映射。 我熟悉的分形噪声的实现使用范围 [0, 1] 的噪声,包括添加频率 k*2^i 乘以 1/2^(i+1)i 从 0 开始的噪声,因此其范围是 [0, a<1 ].

    另外,正如您所说,如果超过某个值的概率非常小(这里就是这种情况,因为噪声往往具有较小的标准偏差),这在图形应用程序中并不是什么大问题,因为结果被限制在无论如何都是0和1。

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2014-04-18
      • 2013-06-29
      • 2014-02-15
      • 2020-06-06
      • 2011-09-20
      • 2021-06-30
      • 2020-06-22
      • 2011-03-19
      相关资源
      最近更新 更多