← ALL ARTICLES
数学与采样6 MIN READ

程序噪声

全库目录221
本文目录15

每个像素独立取随机数,只能得到颗粒。地形和云需要邻近位置相关,而且相同坐标再次求值时结果相同。程序噪声用格点、梯度或特征点建立这份结构,多尺度叠加再分别控制大形和细节。

空间相关性

Shader 中的噪声通常需要两个性质:可重复、空间连续。只给每个像素独立随机值会得到白噪声,邻域没有结构。

频谱形态对比

几种噪声在频域的区别比实现细节更能指导选型:

  • 白噪声:理想模型的功率谱密度平坦,有限随机样本的频谱会波动。空间独立取值呈沙粒状;每帧重新取值才会产生对应的时间闪烁;
  • 值噪声与梯度噪声:通过局部插值产生平滑变化,格点布局、哈希和插值核共同影响频谱与方向性;
  • Worley:最近特征点距离产生细胞结构,频谱取决于点分布、距离度量与所用距离组合;
  • 蓝噪声:抑制低频聚集,把误差更多分配到较高频率。在后续滤波和显示条件合适时,这种分布较少形成大块结构;缩放与平铺仍可能暴露图案。

多尺度叠加可以形成幂律式的能量分布,但具体谱斜率取决于基础噪声、维数与幅度参数。不能只凭加倍频率、减半振幅认定严格1/f谱。

Value Noise

在格点生成随机值,再在格子内部插值。实现简单,但低质量插值会暴露方格方向。

Perlin Noise

格点保存随机梯度,采样点与梯度做点积后插值。它产生连续的自然起伏,适合扭曲、云、地形和材质变化。

Simplex Noise

把空间划分为单纯形,例如二维三角形、三维四面体。高维时参与计算的邻居比规则网格少,方向性也更均匀。

Worley Noise

空间中分布特征点,结果由采样点到最近或若干特征点的距离决定。常见输出有 F1F_1、F2F_2 和 F2−F1F_2-F_1,适合细胞、裂纹和云团结构。

格点梯度与连续插值

先看一维位置x=2.25。它位于整数格点2和3之间,局部坐标t=0.25。固定种子和格点编号决定每个格点的梯度g0、g1,一维梯度可取−1或+1。两个格点各自给出一条局部直线:a=g0*t、b=g1*(t-1)。

直接线性混合会让格点接缝的导数发生变化。改用f(t)=6t⁵−15t⁴+10t³作为混合权重,得到a+f(t)*(b-a)。该权重在两端的一、二阶导数为零,因此相邻单元可以共享同一格点梯度,并在边界保持相应的平滑性。负位置必须用floor定位格子,例如−0.25属于[−1,0],向零截断会选错格子。

二维版本对四个角分别计算梯度与局部位移的点积,再沿两轴插值;三维版本使用八个角。高维成本随邻角数量增长,这也是考虑单纯形划分的原因。值噪声的格点存标量,梯度噪声的格点存方向,两者不能只换一个名称就视为同一算法。

基础噪声连续以后,多层叠加才有意义。若基础坐标以米计,baseFrequency单位为每米;增大频率会缩小结构尺寸。像素在世界中的足迹扩大时,继续计算超出采样能力的高频层会引入闪烁,所以远景应停止高频层或按足迹平滑衰减。

二维格点求值

二维位置p=(2.25,3.5)位于格子i=(2,3),局部坐标t=(0.25,0.5)。对四个角c=(0,0),(1,0),(0,1),(1,1),哈希(i+c,seed)取得单位梯度,分别计算dot(gradient,t-c);先沿X用fade(t.x)混合上下两对,再沿Y用fade(t.y)混合。格点的哈希只依赖整数位置与种子,相邻格子因此会共享同一角的梯度。

例如四角梯度依次取(1,0)、(0,1)、(0,-1)、(-1,0),四份点积为0.25、0.5、0.5、0.75。fade(0.25)=0.103515625、fade(0.5)=0.5,两次X混合得到0.27587890625和0.52587890625,再沿Y混合得到0.40087890625。这份数值只演示插值,实际哈希需避免方向偏置与过短周期。

值噪声沿同样四角插值,但角点直接保存随机标量。梯度噪声先把方向与位移点积,两种输入在格点处具有不同性质;因此仅替换随机数来源并不能保证统计形态相同。

特征点距离与邻域搜索

Worley在每个格子内生成特征点。对当前位置,收集候选点的距离并保留最小两项F1、F2。例如当前位置(0.2,0.3),三个候选点为(0,0)、(0.5,0.5)、(1,0),距离平方为0.13、0.13、0.73,故F1=F2≈0.3606,F2−F1=0。等距位置形成细胞分界,离某个特征点近时F1小。

搜索不能只看当前格:当前位置靠近格边时,邻格点可能更近。固定3×3邻域是否充分取决于每格点数、点抖动范围、距离度量,以及求F1还是F2。可审查的通用策略是维护当前第二近距离,以查询点到未访问格AABB的距离作为下界;下界不小于当前F2时,该格不会改变前两项。若未建立这个停止证明,扩大邻域只是经验预算。

单纯形定位与有限支撑贡献

二维Simplex先把等边三角网格斜切成容易取整的格子。令F=(sqrt(3)-1)/2、G=(3-sqrt(3))/6,输入p=(x,y)先加s=(x+y)*F,得到整数格坐标i=floor(x+s)、j=floor(y+s)。再以t=(i+j)*G把格原点还原成(i−t,j−t),当前位置相对该原点的位移记为d0。

若d0.x>d0.y,中间角的整数偏移k=(1,0),否则k=(0,1)。剩下两个角的位移分别为d1=d0−k+(G,G)、d2=d0−(1,1)+(2G,2G)。三个角的整数身份为(i,j)、(i,j)+k、(i+1,j+1),用于固定种子哈希;位移则保留在原始空间,用于距离与梯度点积。

每角贡献可写成max(0,0.5-dot(d,d))^4 * dot(gradient,d),三项相加后按选定梯度集合做幅度标定。圆形有限支撑让离角点足够远的贡献变成零;四次幂使支撑边界平滑消失,不需要像方格梯度噪声那样对四项分别沿XY插值。哈希梯度是否单位化会改变输出尺度,不能换梯度以后继续套用别的实现的归一化系数。

例如p=(0.2,0.1)时,斜切后仍在格(0,0),d0=(0.2,0.1),k=(1,0),d1约(-0.588675,0.311325),d2约(-0.377350,-0.477350)。三项核的底数约为0.45、0.056538、0.129744,均为正。设这一教学输入的三个单位梯度依次取(1,0)、(0,1)、(-1,0),即可分别点积并按四次幂权重求和;最终未标定值约为0.00831。换一个位置需重新定位,不能固定使用这三个角。

公式核对 Gustavson的二维参考源码 中snoise2的斜切、反斜切与角贡献;本页使用独立单位梯度示例,输出幅度不复用源码的梯度及缩放。测试应包含负坐标、跨三角形边界和固定种子重复输入。

FBM 和多尺度细节

分形布朗运动(Fractal Brownian Motion,FBM)把多层不同频率和振幅的噪声相加:

f(p)=∑i=0n−1ai noise(fip)f(\mathbf p)=\sum_{i=0}^{n-1} a_i\,noise(f_i\mathbf p)

通常频率逐层增大,振幅逐层减小。低频负责大形,高频负责细节。不是层数越多越好:每层都增加采样或计算成本,高频还可能超过像素采样能力并产生闪烁。

最小多尺度求值

下面是API中立伪代码。位置使用约定单位,基础噪声由固定种子确定;输出是归一化幅度的标量。输入要求octaveCount>0、有限正的baseFrequency、有限且大于1的lacunarity,以及0<=gain<1。宿主按层数预算检查所有层频率、坐标乘积和累计量都可表示;出现非有限值时返回失败。

text
value = 0; amplitude = 1; frequency = baseFrequency; amplitudeSum = 0
repeat octaveCount times:
    value += amplitude * Noise(position * frequency, seed)
    amplitudeSum += amplitude
    frequency *= lacunarity
    amplitude *= gain
return value / amplitudeSum

频率增长决定细节尺度,振幅衰减决定每层贡献。octaveCount>0且初始振幅为正;增加层数同时增加成本,高频超出像素足迹时应停止或预过滤。

验证方法

固定种子重复求值,结果应相同。可视化每个octave及其频谱,检查格点方向与平铺周期;改变分辨率时保持世界尺度,观察高频是否闪烁。FBM的谱形取决于基础噪声、维数、gain和lacunarity,不能把任意参数组合都称为严格1/f谱。

一维梯度噪声参考实现见 math_models.py,运行 python 知识库/examples/revision/test_math.py 检查负坐标、整数边界和重复求值。该模型用于解释格点插值,未验证二维频谱、GPU精度或时域表现。

相关主题

参考资料

  • Matt Pharr, Wenzel Jakob, Greg Humphreys, Physically Based Rendering, Sampling and Reconstruction chapters.
  • Ken Perlin,Improved Noise参考实现,noise、fade与grad;2026-10-22核读。一维教学模型使用独立哈希,未复制作者置换表。
  • Stefan Gustavson, Simplex Noise Demystified.