域扭曲

15 / 15
学习程序化噪声的基础构件与常见风格化手法。

Domain Warp 是用噪声来扭曲坐标、再对扭曲后的坐标再次采样噪声,得到一种卷曲感极强的有机形态:

下面拆解它。


思路:先扭曲坐标

普通噪声是对坐标 p 采样:fbm(p)

域扭曲多了一步:先用两次独立的 fbm 计算出一个偏移向量 w,再用 p + w 作为新坐标采样:

w.xw.y 是两个方向的偏移量,分别用不同的偏置(3.17.7)让它们互相独立,不产生对称。最终每个像素的采样坐标被噪声本身"推开"了一段距离,产生漩涡卷曲的形态。


1.2 是什么

w * 1.2 中的 1.2 是扭曲强度。值越大,坐标被推得越远,图案卷曲越剧烈;值接近 0,结果退化成普通 fbm。


试着改一改

改动效果
1.2 改成 3.0扭曲更剧烈,出现大漩涡
1.2 改成 0.2扭曲很轻微,接近普通 fbm
3.17.7 改成 1.02.0偏置不够独立,两个方向可能产生对称感
在最终 fbm 外再套一层域扭曲二次扭曲,形态更复杂

练习

main 函数里,用两次 fbm 构造偏移向量 w,然后对 p + w * 1.2 做最终采样,输出域扭曲噪声。

答案解析

float n = fbm(p) 替换成两行:先算 w,再用扭曲后的坐标算 n

  • fbm(p + 3.1)fbm(p + 7.7):两个独立的噪声场,分别作为 X 和 Y 方向的偏移量
  • p + w * 1.2:把坐标用噪声向量推移后再采样
  • 1.2:扭曲强度,决定推移距离

初始代码直接 fbm(p) 是普通分形噪声,没有卷曲感。加上 w 之后,坐标先被噪声场扭曲,再采样,结果出现漩涡般的有机形态。

试着把 1.2 改成 4.0,看看卷曲感急剧增强的效果。

GLSL 代码编辑器

正确代码预览

当前代码预览