噪声函数是程序化内容生成的基石,它将数学的优雅与自然的随机性完美结合。在游戏资产设计中,从怪物皮肤的细微纹理到异星地貌的宏观结构,从能量场的流动到生物组织的生长模式,噪声函数无处不在。Ken Perlin在1985年为电影《Tron》开发的Perlin噪声,开启了程序化纹理的新纪元,至今仍是我们创造虚拟世界的核心工具。
本章将深入探讨各类噪声函数的数学原理与艺术应用。我们不仅要理解噪声的生成机制,更要掌握如何将这些看似随机的模式转化为富有生命力的视觉元素。从微观的细胞结构到宏观的地质纹理,从静态的表面细节到动态的能量流动,噪声函数为我们提供了无限的创造可能。
完成本章学习后,你将能够:
Perlin噪声的核心思想是在整数格点上定义随机梯度向量,然后通过插值生成连续平滑的噪声函数。其数学定义如下:
对于2D Perlin噪声,给定点 $(x, y)$:
\[n(x, y) = \sum_{i,j \in \{0,1\}} w_i(x) \cdot w_j(y) \cdot (g_{i,j} \cdot d_{i,j})\]其中:
梯度向量的生成通常使用哈希函数确保伪随机性:
格点梯度示意:
G00 ←---→ G10
↑ \ / ↑
| P | P: 采样点
↓ / \ ↓
G01 ←---→ G11
分数布朗运动通过叠加多个不同频率和振幅的噪声层来创建自相似的分形纹理:
\[FBM(p) = \sum_{i=0}^{n-1} a^i \cdot noise(f^i \cdot p)\]其中:
每一层称为一个octave,高频层添加细节,低频层控制整体形状:
振幅
↑
1.0|█████ 第1层 (基频)
|
0.5| ███████ 第2层 (2倍频)
|
0.25| ██████████ 第3层 (4倍频)
|
+------------------→ 频率
1 2 4 8
湍流函数使用噪声的绝对值创造更加尖锐和不规则的效果:
\[turbulence(p) = \sum_{i=0}^{n-1} \frac{|noise(2^i \cdot p)|}{2^i}\]这种技术特别适合模拟:
通过使用噪声函数扭曲采样坐标,可以创造更加有机和流动的模式:
\[pattern(p) = noise(p + noise(p + offset))\]多重域变形可以产生极其复杂的有机结构:
原始网格: 一次变形: 二次变形:
┌─┬─┬─┬─┐ ╱╲╱╲╱╲╱╲ ≈≈≈≈≈≈≈≈
├─┼─┼─┼─┤ ╱ ╲ ╱ ╲ ≈≈≈≈≈≈≈≈
├─┼─┼─┼─┤ ╲ ╲╱ ╱ ≈≈≈≈≈≈≈≈
├─┼─┼─┼─┤ ╲ ╱ ╲ ╱ ≈≈≈≈≈≈≈≈
└─┴─┴─┴─┘ ╲╱╲╱╲╱╲╱ ≈≈≈≈≈≈≈≈
以生成异星爬虫类生物的皮肤为例,我们可以组合多种Perlin噪声技术:
在游戏中,静态纹理往往缺乏生命力。通过引入时间维度,我们可以创造呼吸、脉动、流动等动态效果:
\[animatedNoise(p, t) = noise(p.x, p.y, t \cdot speed)\]应用场景:
精确控制Perlin噪声的视觉效果需要理解各参数的影响:
频率(Frequency):控制噪声的”密度”
振幅(Amplitude):控制噪声的”强度”
Octaves数量:控制细节层次
Persistence(持续度):控制高频层的贡献
Worley噪声(也称为细胞噪声)基于Voronoi图的概念。给定一组种子点,空间中的每个点都属于距离它最近的种子点的区域:
\[V_i = \{p \in \mathbb{R}^n : d(p, s_i) \leq d(p, s_j), \forall j \neq i\}\]其中 $s_i$ 是第 $i$ 个种子点,$d$ 是距离度量(通常是欧几里得距离)。
Worley噪声的核心是计算到最近几个种子点的距离:
Voronoi单元示意:
• | • • 种子点
\ | / | 边界
\ | /
----•--|--•----
/ | \
/ | \
• | •
不同的距离度量产生不同的视觉效果:
欧几里得距离(Euclidean): \(d_E = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}\) 产生圆形的细胞,适合有机纹理
曼哈顿距离(Manhattan): \(d_M = |x_2-x_1| + |y_2-y_1|\) 产生菱形细胞,适合晶体结构
切比雪夫距离(Chebyshev): \(d_C = \max(|x_2-x_1|, |y_2-y_1|)\) 产生方形细胞,适合规则图案
闵可夫斯基距离(Minkowski): \(d_p = \left(\sum_{i=1}^{n} |x_i - y_i|^p\right)^{1/p}\) 通过调节 $p$ 值在圆形和方形之间过渡
通过组合F1和F2,可以提取细胞边缘:
\[edge = F2 - F1\]当这个值接近0时,表示点位于两个细胞的边界附近。这可用于生成:
边缘锐化技术: \(sharpEdge = 1.0 - smoothstep(0.0, width, F2 - F1)\)
鳞片是Worley噪声的经典应用。以爬行动物鳞片为例:
Worley噪声特别适合生成晶体和矿物的几何结构:
晶体生长模拟:
矿脉纹理: 结合Worley和Perlin噪声: \(mineral = worley(p) \cdot 0.7 + perlin(p \cdot 8) \cdot 0.3\)
Voronoise(Voronoi + Noise): 在每个细胞内添加局部噪声,保持细胞结构的同时增加有机变化:
\[voronoise(p) = F1 + perlin(p \cdot frequency) \cdot amplitude\]距离场组合: 创造更复杂的图案:
多分辨率Worley: 类似FBM,叠加不同尺度的Worley噪声:
\[multiWorley(p) = \sum_{i=0}^{n} \frac{worley(p \cdot 2^i)}{2^i}\]湍流在自然界中无处不在,从云层的翻滚到岩浆的流动。在程序化纹理中,湍流函数通过噪声的非线性变换创造复杂的有机模式:
基础湍流函数: \(turbulence(p) = \sum_{i=0}^{n-1} \frac{|noise(2^i \cdot p)|}{2^i}\)
带偏置的湍流: \(biasedTurbulence(p, bias) = \sum_{i=0}^{n-1} \frac{(|noise(2^i \cdot p)| \cdot 2 - 1)^{bias} + 1}{2^{i+1}}\)
偏置参数控制湍流的”尖锐度”:
域变形通过扭曲采样空间创造流动和扭曲的效果:
单次变形: \(warp_1(p) = noise(p + q)\) 其中 $q = noise(p + offset)$
递归变形: \(warp_n(p) = noise(p + \alpha \cdot warp_{n-1}(p))\)
向量场变形: 使用梯度噪声创建流场: \(\vec{v}(p) = \nabla noise(p)\) \(warped = noise(p + \vec{v}(p) \cdot strength)\)
大理石纹理是湍流函数最经典的应用之一:
\[marble(p) = \sin(p.x + turbulence(p) \cdot strength)\]增强版大理石纹理:
纹理脉络控制:
肌肉纤维: 结合方向性噪声和湍流: \(muscle = anisotropicNoise(p) + turbulence(p) \cdot 0.2\)
血管网络: 使用分支湍流模拟:
脂肪组织: 多层Worley噪声加湍流变形: \(fat = worley(p + turbulence(p) \cdot 0.3)\)
等离子体效果: \(plasma = \sum_{i=1}^{4} \sin(p.x \cdot i + turbulence(p) \cdot i)\)
能量涡流: 使用极坐标湍流: \(r = length(p)\) \(\theta = atan2(p.y, p.x)\) \(vortex = turbulence(vec2(r, \theta + time))\)
魔法护盾: 球面湍流映射:
虽然真实的流体模拟需要求解Navier-Stokes方程,但使用湍流函数可以快速创建类似效果:
烟雾效果: \(smoke = FBM(p + vec3(0, time \cdot rise, 0)) \cdot density\)
水流扰动: \(water = sin(p.x \cdot waveFreq + turbulence(p) \cdot 0.5 + time)\)
岩浆流动: 结合温度梯度和湍流: \(lava = gradient(p.y) + turbulence(p) \cdot heat\)