Shader-程序化噪声
随机数回答“这个位置抽到什么”,噪声还要回答“相邻位置怎样连续变化”。自然材质、云雾与流动特效往往需要后者,完全独立的随机像素反而缺乏可读结构。
噪声不是一种固定外观。值噪声、梯度噪声、细胞噪声和多尺度叠加提供不同结构;先确定需要的空间关系,再选算法,比不断叠加层数更有效。
1. 值噪声与梯度噪声
值噪声在格点存伪随机标量,再在格内插值。梯度噪声在格点放方向,把格点梯度与采样点偏移做点积,再插值这些贡献。
Perlin Noise 通常指梯度噪声的一类经典构造,不应把任意值噪声统一称作“PerlinValue”。名字相似不代表算法、导数连续性与数值范围一致。
平滑插值可以使用 6t^5-15t^4+10t^3,改善格点连接处的导数行为。它解决的是连接平滑性,不保证完全没有方向性或周期伪影。
2. 一个二维值噪声示意
以下代码使用一个简单 Hash 演示机制,Hash 的统计质量与跨平台一致性不作生产保证:
1 | |
世界坐标直接输入在大场景中可能丢精度;周期平铺需要对格点索引采用一致的周期规则,而不只是对最终颜色做 frac。
3. Worley 与 Voronoi 的关系
在空间分布特征点,计算查询点到最近、次近特征点的距离,可以产生细胞纹理。最近点决定区域划分,距离值决定区域内的渐变。
F1、F2 或 F2-F1 可形成不同结构,但 F2-F1 不应不加条件地视为到 Voronoi 边界的精确欧氏距离。若要用于几何追踪或准确描边,需要对应距离构造。

原笔记配图:Voronoi 节点产生的细胞结构示例;节点参数与球面坐标共同影响最终纹样。
4. fBM 是多尺度组合
程序化材质中常用 fBM(分形布朗运动式叠加)将噪声以逐级升高频率、降低振幅的方式组合:
1 | |
频率倍率常称 lacunarity,振幅倍率常称 gain。这类有限层实现借用了自相似思想,不等于完整数学随机过程的全部性质。
层数增加会提升高频细节与采样成本,也可能只增加走样。需要根据屏幕足迹减弱超出分辨率的 octave,而不是始终计算所有层。
5. 域扭曲与旋度噪声
域扭曲使用一组噪声偏移另一组噪声的输入坐标,让条带或等值线弯曲。幅度过大可能造成密度、梯度和局部尺度剧烈变化,生成法线时应考虑链式法则。
旋度噪声从势场构造速度场。理想连续构造的散度可为零,但离散差分、边界与数值误差仍然存在。它提供适合运动的方向场,不是把标量 Noise 归一化就完成了流体模拟。
6. 把噪声用作材质数据
先确定输入空间:模型空间跟物体走,世界空间容易统一大范围结构,屏幕空间适合某些采样抖动。再明确输出用途,是颜色、法线、高度、遮罩还是速度。
不同用途需要不同过滤。用噪声驱动 Alpha Clip 时,远处的覆盖率与时域稳定性尤其重要;用噪声扰动法线时,必须检查频率与坡度关系。
总结
噪声的价值在可控制的相关性。基础构造提供局部结构,多尺度叠加提供层次,域扭曲提供形态变化;过滤与坐标约定则决定它能否稳定进入实际画面。