【发布时间】: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