想象你正在为游戏世界“捏”地形:山峰、云朵、火焰、木纹,全都希望自动生成,而不是一块一块手工雕刻。如果直接往平面上撒一把随机数,得到的是一堆孤立噪点,像打翻的线团;但如果先在绣布上打方格,在每个交叉点埋一根方向随机的小线头,再用柔和渐变色把格与格之间的缝隙填满,就能绣出连绵起伏、看起来像真山岭的图案。这套“方格绣法”就是 Perlin 噪声。另一位绣娘发现,方格绣在四针交汇处容易起皱,于是改用三角形拼布来绣,针脚更少、接缝更顺滑——这就是 Simplex 噪声。这篇文章会用“刺绣峰峦图”这个比喻,带你拆解两种噪声的底层原理、梯度计算、插值细节,以及为什么叠加多层之后,山会越来越像山。
程序化内容生成(PCG)是游戏开发与 AI 美术管线的重要地基。掌握 Perlin/Simplex 噪声的原理,你才能读懂地形、材质、特效背后的自动生成逻辑,做出可复现、可调参的高质量内容。
目录
可视化演示
展示数据包在多阶段处理管道中的流动过程,包含输入、变换、过滤、输出四个阶段,支持调节流速观察吞吐量变化。
本节配有交互动效(进入视口后自动加载,约 3KB)。
数据流处理管道 数据包从左到右流经四个处理阶段 每个节点对数据进行变换和过滤 吞吐量 = 数据包数 / 处理时间 调整流速观察管道性能变化
噪声基础:乱线团里的秩序
绣娘阿琳第一次拿到一堆彩色丝线时,试着把线随意甩在布上——结果是一团杂乱线头,谁也看不出山形。她这才明白:自然界的山峰、云朵、树纹并不“完全随机”,而是“局部相近、整体随机”的。真正的随机数是每一点都毫无关联,像洒了一地的芝麻;而像 Perlin 这样的噪声,则是一匹被温柔拉伸过的布,远处看有变化,近处看又连续。
这正是“噪声”与“随机”的分水岭。随机数你连续采十个点,十个点互不相干;噪声却保证相邻坐标的值缓慢起伏。用数学语言说,噪声是一个以坐标为输入、以数值为输出的确定性函数:同一个坐标,无论调用多少次,都返回同一个值;坐标稍微挪一点,返回值也只稍微变化一点。这种“可复现”特性极其重要,因为程序需要随时重新生成同样的世界,而不是每次打开游戏都换一副新面孔。
程序化内容生成的价值也因此而来:不需要美术手绘整张大地图,只需要几行噪声代码加一个种子(seed),就能在任意时刻、任意地点生成无限延伸的地形。绣娘不需要预先把整座山绣完,她只需要掌握“针法”,走到哪儿绣到哪儿。自然感则来自噪声本身的平滑性——山峰不是一根一根竖立的筷子,而是彼此勾连、渐变的曲线,这正是噪声函数天生具备的连续性格局。
回到绣布上:乱线团是随机,峰峦图是噪声。Perlin 噪声之所以能成为程序化生成的“针法基础”,正是因为它把“无序”和“秩序”用一块连续布匹缝合了起来。
- $n$ 代表噪声函数它是一个绣工,给定绣布上的位置,就报出一个明暗程度。
- 输入 $\vec p$绣布上的任意一点,包含横、纵两个分量。
- 映射符号 $\mapsto$表示输入集合到输出集合的对应关系。
- 输出区间 $[0,1]$所有结果都落在 0 到 1 之间,方便当作灰度、高度或密度使用。
梯度机制:每根线头都有自己的方向
阿琳发现,想要绣出柔和的山坡,不能只给格子填色,得先在每个交叉点埋下“方向”。她画好方格后,在每个格点放一枚极小的箭头——有的朝右上方,有的朝左下方——这些箭头就像绣线在布面上“预埋”的走向。箭头指向哪个方向,附近布料就会被“牵”向哪个方向。
这一根根预埋箭头,在 Perlin 噪声里叫“梯度向量”(gradient vector)。梯度不是格点的颜色,而是格点对周围区域的“坡度指令”。当前要计算某个采样点的明暗值时,做法很简单:先确认这个点落在哪个格子;再连接采样点与四个格点,得到四条偏移向量;然后用每条偏移向量和对应格点的梯度做“点积”,算出一个标量贡献。点积的结果相当于在问:“我这根线头朝那个方向牵,能把它牵多大?”
那这些箭头是怎么“随机”选出来的?靠一个叫“哈希”的小机关。哈希函数接收格点的整数坐标,输出一个固定编号,再从预置的梯度表里选出一个方向。它像一本永远不变的绣谱:坐标 (3,2) 永远对应同一种箭头,不会因为第二次调用就变得不同。这个机制保证了噪声函数的“确定性”,也保证了整个世界可以被种子复现。
阿琳的明白之处在于:单独一根箭头看不出山,但把所有箭头穿在一起,布面就有了起伏的方向感。这就是梯度噪声比单纯“给格子填随机颜色”更像自然地貌的根本原因。
- 格点中心 $\vec c_i$当前格子第 $i$ 个角点的坐标,例如左下角 $(x_0,y_0)$。
- 偏移向量 $\vec p-\vec c_i$从格点指向采样点的小箭头,表示采样点离这根“线头”有多远、在哪个方向。
- 梯度向量 $\vec g_i$格点上预埋的方向箭头,来自哈希查表。
- 点积 $\cdot$把两个向量的对应分量相乘再相加,得到一个标量。
- $d_i$ 贡献值$d_i$ 大于 0 表示“顺着箭头方向”,小于 0 表示“逆着箭头方向”,最后会参与插值合成。
Perlin流程:一针一线把四个角缝起来
现在阿琳要在某个采样点落针。她先找到这个点落在哪个方格,就像裁缝先找到布上的定位线;然后取出该方格四个角的“预埋箭头”,分别计算贡献。然而,如果直接对四个贡献做普通线性插值,接缝处会出现明显的折痕,像两块颜色不同的布硬拼在一起。
Perlin 的解决办法,是引入一条特别设计的“缓动曲线” $w(t)$。这条曲线在 $t=0$ 和 $t=1$ 两端的斜率都是 0,因此在格子边界上,渐变的“速度”正好为零——两格交界处不会出现突然拐弯,绣布就像被蒸汽熨斗抚平过一样。这个缓动函数常被称为 smoothstep,是 Perlin 噪声平滑感的灵魂。
最终的噪声值,就是先用 $w(x)$ 在水平方向把左边两点、右边两点分别插值,再用 $w(y)$ 在垂直方向把两个中间结果再插值一次——也就是“双线性插值”。四根箭头、两次插值、一条缓动曲线,阿琳手中的绣布便从方格子变成了一座连绵的峰峦。动画演示里第一层那团平滑的云雾,就是这一步的功劳。
阿琳的针脚之所以看不出接缝,正是因为每次落针都在格子边缘“轻轻放、轻轻收”。一个 smoothstep,就把方格绣的棱角全部软化成了山的曲线。
- 局部坐标 $t$$t=0$ 表示贴着格子左/下边,$t=1$ 表示贴着右/上边。
- 二次项 $3t^{2}$负责让权重起步平滑,不出现陡峭突变。
- 三次项 $-2t^{3}$负责在末端“收住劲”,让变化率归零。
- 端点性质$w(0)=0$、$w(1)=1$,且两端一阶导数为 0,因此相邻格子在边界处连续且平滑。
Simplex改进:三角拼布,少缝两针
方格绣虽然温柔,但阿琳注意到一个问题:正方形格子在斜方向上特别容易“拧巴”,四根线头汇到一处时,偶尔会冒出小疙瘩。另一位绣娘提出改用三角形拼布——把每个方格沿对角线切成两个三角形。这样每个采样点最多只需要同时关照三个顶点,而不是四个,针脚更省,结构也更自然。
Simplex 噪声就是这样一次“换布”式的改革。它先用一个坐标倾斜变换,把普通坐标系里的正方形网格,变形成由等边三角形铺成的网格;然后找到采样点所在的三角形,只对这三个顶点做贡献求和。权重不再是双线性插值,而是一个“径向衰减”公式:距离越近,贡献越大;超过一定半径,贡献直接归零。因为三角形比正方形更紧凑,所以需要计算的顶点从 4 个降为 3 个,维度越高省得越多。
从效果上看,Simplex 噪声比 Perlin 更少出现方向性的人为痕迹,纹理更“干净”;从性能上看,2D 下每层少算一个格点,到 3D、4D 时差距更加明显。阿琳拿起三角形拼布试了试,发现峰峦还是那座峰峦,但针脚轻松了不少,接缝也更顺了。
三角拼布的好处,阿琳在绣第三座山时感受得最明显:同样的峰峦,只需要更少的针脚,而且再也没有方格绣那种斜向的小褶皱。这就是 Simplex 在“低格点数”与“平滑度”之间找到的平衡点。
- 三个顶点 $k=0,1,2$2D Simplex 中每个点只需关注所在三角形的三个角。
- 距离平方 $\lVert \vec d_k \rVert^{2}$衡量采样点离哪根线头近,距离越远权重越小。
- 影响半径 $r^{2}- \lVert \vec d_k \rVert^{2}$距离超过 $r$ 时该顶点不再影响当前采样点。
- 四次方 $(\cdot)^4$让权重在与 $r$ 交汇处也平滑归零,不产生接缝。
- 梯度点积项继续沿用 Perlin 的梯度思想,用顶点箭头牵引出方向变化。
分形叠加:层层叠绣出高山碎石
单层噪声像一片温柔起伏的沙丘,和真正的大山还差得远——真山有绵延千里的主脊线,也有近处细碎的岩石裂纹。阿琳想通了一个道理:一层绣布只表现一种尺度的起伏;如果把不同粗细的针脚叠着绣,大尺度山脉套小尺度碎石,自然感就出来了。
这就是“分形噪声”,也叫 fBm(fractal Brownian motion,分形布朗运动)。做法是把同一套噪声函数按倍数缩放:第一层频率最低、振幅最大,负责大骨架;第二层频率翻倍、振幅减半,负责中细节;第三层频率再翻倍、振幅再减半,负责更多的碎石纹理。每一层被称为一个“八度”(octave),就像音乐里每升高八度,频率就翻一番。
调参时主要看三个旋钮:八度数 $N$ 控制细节层数;频率倍数 $f$(常取 2)控制每次加密的密度;振幅衰减 $a$(常取 0.5)控制每层对总高度的贡献比例。层数太少,地形像馒头;层数太多,计算量上升且画面可能发花。阿琳的经验是:先定骨架层,再逐层加细节,直到“远看有山、近看有石”。
阿琳把三层绣布叠在一起后,山脊与碎石同时呈现。所谓“鬼斧神工”的分形感,其实只是一句重复的绣法:大套小,小套更小,层次无穷。
- 八度数 $N$总共叠几层针脚,$N$ 越大细节越丰富,计算量也越大。
- 频率项 $f^{i}$第 $i$ 层把坐标缩放 $2^{i}$ 倍,让起伏更“密”。
- 振幅项 $a^{i}$第 $i$ 层把高度缩小 $0.5^{i}$,让高层细节只做“微调”。
- 求和归一所有层叠加并归一化,使最终结果仍然落在 $[0,1]$。
典型应用:山川、云雾与纹理
绣法学会了,该绣什么?第一个最直接的应用是地形生成:把 fBm 的计算结果当成高度值,得到的就是一片片程序化山峦。游戏中“世界地图随机生成”的背后,通常就是一张由 Perlin 或 Simplex 噪声填充的高度图,种子一变,世界立刻换新。
第二个应用是云朵与火焰。这类效果不能只靠高度值,还需要“扭曲”:先对坐标采样一层噪声,再用该噪声的数值去偏移原始坐标,最后用偏移后的坐标重新采样。这样云朵的边缘会被“拧”出毛茸茸的轮廓,火焰会产生翻滚的卷舌感,这就是域扭曲(domain warping)。阿琳绣云朵时,不会画一朵标准的圆云,而是让针脚跟着风的方向微微摆动,出来的云才自然。
第三个应用是程序化纹理:木纹、岩石、布料、皮肤……都可以用多层噪声叠加颜色映射表得到。与普通位图贴图相比,程序化纹理几乎没有接缝、不占存储、还能支持无限放大级别。绣娘的作品不再受布幅限制,想要多宽阔的绣面都行。
阿琳的峰峦图终于有了完整用途:一针绣地形,一针绣风与火,再一针绣出木头和云石。噪声不是最终的画,而是画家手中那支会自动起伏的笔。
- 基础噪声 $n(\vec x)$第一次采样,得到当前位置的基准明暗。
- 扰动偏移 $k \cdot n(\vec x)$把噪声值乘以强度系数,作为坐标的“拉扯力”。
- 扭曲强度 $k$$k$ 越大,云和火焰拧得越猛;太小则几乎没有变化。
- 第二次采样 $n'$用被拉扯过的坐标重新进噪声函数,得到扭曲后的新场。
工程实践:绣娘的工具箱
真到了工程里,阿琳还要解决几个实际问题:第一是“种子”。想让不同的存档拥有不同的世界,只需给噪声函数加一个种子偏移:把采样坐标整体平移一个种子向量,山形就会跟着变化,而且同一种子下永远可复现。第二是参数调优。绘制大尺度地形图时,选择较低的频率和 3 到 5 个八度;制作精细纹理时,则要提高频率并发扬高频细节。性能与质量之间,始终靠“视距”和“分辨率”来权衡。
第三是性能对比。Perlin 在 2D 中每层需要处理 4 个格点,而 Simplex 只需要 3 个;随着维度升高,差距还会拉大,因为 Perlin 需要处理 $2^d$ 个格点,Simplex 只需要 $d+1$ 个。可问题在于,2D 下 Perlin 实现更简单、很多旧代码库都已完成高度优化,不一定要强行换成 Simplex。第四是选型建议:如果你的噪声主要用于二维纹理和简单地形,Perlin 完全够用;如果要生成 3D/4D 噪声,或者对导数连续性和计算量敏感,Simplex 更合适。
阿琳的工具箱里,方格绣和三角绣都不可少:绣细节密集的小幅纹理,方格绣熟门熟路;绣需要无限延伸的无缝大世界,三角绣更省力气。选针法没有唯一解,只看你要绣什么画、站在多远的地方看它。
- $N$ 八度层数fBm 中叠加的噪声层数。
- Perlin 系数 42D 正方形网格中,每个采样点周围有 4 个角点。
- Simplex 系数 32D 三角剖分后,每个采样点周围只有 3 个顶点。
- 相对开销同样八度下,Simplex 每层约少算 25% 的格点贡献。
AI 应用场景
游戏地形与无限世界生成
阶段:程序化内容生成(PCG)中的采样与合成阶段。
解决的问题:手工逐格雕刻地形极其耗时,且无法生成“无限世界”。Perlin/Simplex 噪声可以用几行代码加一个种子,生成任意大小、可复现的地形高度图,内存占用几乎为零。
具体案例:在《我的世界》类沙盒游戏中,每个方块的 y 坐标由 fBm(x, z) 计算得出。同一个种子、同一个坐标,永远得到同一个高度;玩家走远后,系统可以在后台按区块继续采样,真正做到无缝扩展。
云朵与火焰的动态扭曲
阶段:视觉内容批量化合成阶段。
解决的问题:静态贴图做云朵可以,但做流动的云、翻卷的火焰就显得假。手绘每一帧动画成本过高,而噪声的连续性和确定性让“随时间变化的自然扭曲”变得简单可控。
具体案例:在特效着色器中,用域扭曲公式把像素 uv 坐标先偏移再采样噪声,然后随动画时间推进,令扭曲中心不断移动。最终画面中,火焰舌片自然翻卷而不穿帮,云层缓慢流动而不跳变。
程序化纹理与 AI 数据增强
阶段:数据生成与增强阶段。
解决的问题:深度学习需要大量训练数据,但真实摄影纹理往往有版权、光照和接缝问题。程序化生成的噪声纹理天然无缝、可参数化批量生成,非常适合做数据增强。
具体案例:生成木纹、岩石、皮革等材质时,用多层噪声叠加做高度扰动,再映射到颜色表;还可以通过改变种子快速产生成百上千个变体,供 GAN 或扩散模型当作训练输入。
Python 演示
import math GRADS = ((1, 1), (-1, 1), (1, -1), (-1, -1)) def grad_index(ix, iy, seed=0): h = ix * 374761393 + iy * 668265263 + seed * 1442695040888963407 h = (h ^ (h >> 13)) * 1274126177 return (h ^ (h >> 16)) % 4 def dot_grad(ix, iy, x, y, seed=0): gx, gy = GRADS[grad_index(ix, iy, seed)] return gx * (x - ix) + gy * (y - iy) def fade(t): return t * t * (3 - 2 * t) def perlin2(x, y, seed=0): xi, yi = math.floor(x), math.floor(y) xf, yf = x - xi, y - yi u, v = fade(xf), fade(yf) a = dot_grad(xi, yi, x, y, seed) b = dot_grad(xi + 1, yi, x, y, seed) c = dot_grad(xi, yi + 1, x, y, seed) d = dot_grad(xi + 1, yi + 1, x, y, seed) nx0 = a + (b - a) * u nx1 = c + (d - c) * u return (nx0 + (nx1 - nx0) * v + 1) / 2 def fbm(x, y, octaves=5, seed=0): total = 0.0 amp = 0.5 freq = 1.0 norm = 0.0 for _ in range(octaves): total += amp * perlin2(x * freq, y * freq, seed) norm += amp amp *= 0.5 freq *= 2.0 return total / norm def main(): w, h = 64, 24 chars = " .:-=+*#%@" for y in range(h): row = [] for x in range(w): v = fbm(x / 10.0, y / 5.0, octaves=5, seed=42) row.append(chars[int(v * (len(chars) - 1))]) print("".join(row)) if __name__ == "__main__": main()
def perlin2(x, y, seed=0):输入一个平面坐标,返回 [0,1] 的 Perlin 噪声值。xi, yi = math.floor(x), math.floor(y)先用向下取整锁定当前方格,相当于“找到针脚落在哪一格”。a = dot_grad(xi, yi, x, y, seed)计算左下角格点梯度对当前点的贡献。nx0 = a + (b - a) * u水平方向第一次插值,把左右两个角点“缝”起来。return (nx0 + (nx1 - nx0) * v + 1) / 2垂直方向第二次插值,并映射到 [0,1]。total += amp * perlin2(x * freq, y * freq, seed)按当前八度的频率和振幅累加噪声层。row.append(chars[int(v * (len(chars) - 1))])把高度映射成字符,让山脉的起伏“肉眼可见”。
常见误区
误区“不就是生成几个随机小数吗?要多随机有多随机,和随机函数没区别。”
正解随机数之间完全没有关联,像撒了一地盐粒;噪声则强调“连续”——相邻坐标的值必须平滑过渡,并且同一个坐标永远返回同一个值。Perlin 噪声通过格点梯度 + 插值保证这一点。如果直接拿随机数填地形图,会得到像素雪花而不是山峦。
为何常见:名字里带“噪声”二字,且初次看到的噪声图确实杂乱无章,容易让人误判成随机序列。
误区“fBm 就是不断叠加更多层,层数越多细节越丰富,画面肯定越好。”
正解八度数增加会成倍放大计算量,而且当你渲染的分辨率或采样间距固定时,过高频率的细节会超过采样能力,产生“高频混叠”,画面出现细碎颗粒。实践上通常取 3~5 层,并结合视距与分辨率决定是否继续加层。
为何常见:因为演示里 1 层到 5 层的变化直观且惊艳,容易让人以为“更多层 = 更高级”。
误区“Simplex 是改良版,更高维、更平滑、性能更好,所以永远应该用 Simplex。”
正解在 2D 场景下,Perlin 实现简单、历史优化充分,视觉差异很小;Simplex 的真正优势在高维噪声和更低顶点数,同时它也带来更复杂的坐标变换实现。选型要看维度、平台、代码维护成本,而不是盲目追新。
为何常见:教科书和文章总强调 Simplex 的“改进”,却省略了它在工程落地中的复杂度和适用边界。
误区“每个格子内部随便存一个数字,然后插值就行,梯度就是那个数。”
正解梯度是一个方向向量(通俗说是“小箭头”),它决定周围区域往哪个方向倾斜;最终数值要靠“梯度向量与偏移向量做点积”得到。只用随机数字插值的是“值噪声”,效果会偏方块化,与 Perlin 的梯度噪声在旋转不变性和视觉质感上明显不同。
为何常见:初学者先接触简单插值填色,容易把 Perlin 中的梯度误认为是“更好的随机小数”。
面试题
Q1. Perlin噪声的本质是什么?
- A.一串完全不相关的随机数
- B.空间连续可复现的伪随机函数← 正确答案
- C.对图像做傅里叶变换的结果
- D.依靠深度神经网络学习的函数
答案:B。Perlin 噪声是“坐标进、数值出”的确定性函数,相邻坐标的值连续变化,同一个坐标永远得到同一个结果。A 是纯随机,C、D 与噪声生成机制无关。
Q2. Perlin噪声中,每个格点上保存的数据是什么?
- A.一个随机的颜色值
- B.一个方向向量即梯度← 正确答案
- C.一个固定不变的常数
- D.上一帧渲染的画面
答案:B。Perlin 在每个格点保存方向向量(梯度),它指示周围区域的坡度走向。颜色值是后续计算的结果,不是格点保存的底层数据。
Q3. 点积 \(\vec g_i\cdot(\vec p-\vec c_i)\) 在Perlin中的作用是什么?
- A.计算格点之间颜色差值
- B.计算梯度对当前点的方向贡献← 正确答案
- C.将噪声值投影到屏幕上
- D.随机生成本次采样的种子
答案:B。点积把一个方向向量和一个偏移向量合成一个标量,表示该格点对采样点的“顺坡/逆坡”牵引力。它不负责颜色差值、屏幕投影或种子生成。
Q4. Smoothstep函数 \(3t^2-2t^3\) 的主要目的是什么?
- A.增加额外计算开销
- B.让插值在两端平滑过渡← 正确答案
- C.把二维坐标变成三维坐标
- D.将噪声值强制裁剪到区间内
答案:B。smoothstep 在 \(t=0\) 和 \(t=1\) 两端的一阶导数为 0,保证格子边界处渐变速率归零,从而避免接缝痕迹。它不改变维度,也不做裁剪。
Q5. 在fBm分形噪声中,哪两个参数决定每一层的细节尺度和起伏强度?
- A.频率,决定细节尺度← 正确答案
- B.振幅,决定起伏强弱← 正确答案
- C.纹理分辨率,决定颜色数量
- D.光照方向,决定明暗分布
答案:AB。fBm 每层把频率翻倍并获得一半振幅,频率管“有多密”,振幅管“有多强”。纹理分辨率和光照方向属于渲染阶段,不属于噪声合成参数。
Q6. Simplex相比Perlin在2D中的重要改进是什么?
- A.增加采样格点到八个
- B.用三角形剖分取代正方形网格← 正确答案
- C.完全去掉网格结构
- D.改用指数函数计算噪声
答案:B。Simplex 将正方形剖分为三角形,使每个采样点只与 3 个顶点相关,减少计算量并改善方向性伪影。它没有去掉网格,更不是用指数函数。
Q7. 当八度数 octaves=4、lacunarity=2、gain=0.5时,第4层的频率和振幅分别是多少?
- A.频率8,振幅0.125← 正确答案
- B.频率16,振幅0.5
- C.频率4,振幅0.25
- D.频率8,振幅0.25
答案:A。第 1 层频率为 1、振幅为 0.5;此后每层频率乘 2、振幅乘 0.5。第 4 层频率 \(1\times2^{3}=8\),振幅 \(0.5\times0.5^{3}=0.125\),故选 A。
Q8. 下列哪些属于Perlin/Simplex噪声的典型应用?
- A.程序化地形高度图← 正确答案
- B.云朵与火焰的扭曲← 正确答案
- C.数据库索引加速查询
- D.无缝纹理贴图生成← 正确答案
答案:ABD。地形高度图、云朵火焰扭曲、无缝纹理都是噪声函数的典型落地场景。数据库索引与噪声生成无关,属于结构性数据加速手段。
Q9. 在fBm叠加中,更高八度开始出现“细碎颗粒”而不是平滑细节,合理的解决方式有哪些?
- A.降低最高八度频率← 正确答案
- B.提高采样分辨率或滤波← 正确答案
- C.把振幅改成负值
- D.直接删除基础噪声层
答案:AB。颗粒感的本质是高频细节超出了采样间距,即混叠。降低最高频率或提高采样/滤波都能缓解;把振幅变负没有意义,删除基础层会失去地形骨架。
Q10. 为什么fBm叠加多尺度噪声后,地形会格外接近真实自然地貌?
- A.高频细节与低频结构自相似,符合分形规律← 正确答案
- B.更多层数会把噪声值放大到超过1
- C.频率翻倍会让地形颜色变暖
- D.振幅减半会抹掉光照方向信息
答案:A。自然界的山脉、海岸线都具有“多尺度自相似性”:远看与近看的细节规律相似。fBm 用频率倍增、振幅减半的叠加,精确模仿了这种分形特征,所以视觉上格外自然。