GLSL 效果示例

值噪声

GLSL 里的平滑二维噪声:在网格上放随机值,再用 smoothstep 式的插值把它们融合起来。

在线示例

修改右侧代码,左侧预览会实时更新。

工作原理

只用随机数,得到的是边缘生硬的方块。噪声保留了随机性,但让它变得平滑,云、地形、大理石这些自然的东西看起来就是这样。

值噪声分两步:

  1. 在每个网格角点上放一个随机值,对角点的整数坐标调用 random(i)。
  2. 对格子里的某个像素,根据它所在的位置混合四个角的值。f 就是这个位置:从 0%(左边或下边)到 100%(右边或上边)。

混合时用的是 f * f * (3.0 - 2.0 * f) 而不是直接用 f,这就是 smoothstep 曲线。直线混合会在网格线上留下明显的折痕;曲线在靠近角点时放慢,相邻格子就能无缝衔接。

试着改一改

修改效果
uv * 8.0 改成 uv * 3.0大块、柔和的斑块
vec2 u = f * f * (3.0 - 2.0 * f) 改成 vec2 u = f线性混合:能看到菱形的网格痕迹
vec3(n) 改成 vec3(step(0.5, n))随机的黑白岛屿
vec3(n) 改成 mix(vec3(0.1, 0.2, 0.5), vec3(0.9, 0.95, 1.0), n)偏蓝色调的噪声

用到的内置函数

一步步学会这个效果