二维 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,看看噪声是否变得更大、更柔和。

GLSL 代码编辑器

正确代码预览

当前代码预览