二维 Value Noise
11 / 15
通过对格点随机值插值,构造平滑噪声。
哈希格点噪声每格颜色突变,看起来像马赛克。Value Noise 的做法是对相邻格点的随机值做插值,让颜色平滑过渡,核心就是:
下面拆解 valueNoise 内部是怎么做的。
取四个角的随机值
把坐标分成整数部分 i 和小数部分 f:
i 代表当前在哪个格子,f 代表在格子内的位置(0% 到 100%)。然后取这个格子四个角的哈希值:
平滑插值
直接用 f 插值会有线性过渡,边缘处会有轻微棱角感。用一条叫做"平滑阶梯"的曲线代替:
这条曲线在 0% 和 100% 处斜率为零,也就是说在格点边界处两侧切线相同,过渡自然没有折痕。
然后用 mix 沿 X 和 Y 两个方向各插一次:
试着改一改
| 改动 | 效果 |
|---|---|
8.0 改成 2.0 | 噪声变大块,像起伏的山丘 |
8.0 改成 32.0 | 噪声更细腻,接近烟雾感 |
u = f * f * (3.0 - 2.0 * f) 改成 u = f | 改回线性插值,格子边界处出现轻微棱角 |
把 vec3(n) 改成 vec3(n, n*0.8, n*0.6) | 暖色调噪声 |
练习
在 main 函数里调用 valueNoise(vUv * 8.0),将结果输出为灰度噪声图。
答案解析
把 n = 0.0 替换成 n = valueNoise(vUv * 8.0) 即可。
vUv * 8.0:放大坐标,控制噪声的粗细程度valueNoise(...):对四个格角插值,返回平滑的 0–1 灰度值vec3(n):灰度输出
初始 n = 0.0 是全黑。替换之后每个像素根据自己在格子内的位置得到插值后的灰度,画面就变成平滑流动的噪声。
试着把 8.0 换成 4.0,看看噪声是否变得更大、更柔和。