哈希格点噪声

1 / 15
使用简单哈希函数,为每个网格单元生成随机值。

把画面切成 64×64 的格子,每格一个随机灰度,核心就是这两行:

下面拆解它。


hash21 是什么

hash21 是一个"伪随机函数"——给它一个二维坐标,它返回一个 0.0 到 1.0 之间的数。

关键词是伪随机:它不是真正随机的,相同的输入永远返回相同的输出。这正是我们需要的——同一个格子在每次渲染时应该是同一个颜色,不能每帧闪烁。

你不需要记忆这些数字,把它当作工具直接用就行。


floor 的作用

vUv 是 0.0 到 1.0 的连续坐标。用 floor(vUv * 64.0) 之后:

  • 乘以 64 把坐标放大到 0.0–64.0
  • floor 砍掉小数,只保留整数:0, 1, 2 ... 63

同一格内所有像素的 floor 结果相同,传给 hash21 得到同一个随机值,整格变成同一颜色。系数越小格子越大,系数越大格子越细。


试着改一改

改动效果
64.0 改成 8.0格子变大,马赛克感更明显
64.0 改成 256.0格子极小,像真正的随机噪点
vec3(n) 改成 vec3(n, n*0.5, 0.2)每格变成黄橙色调
34.345 改成 12.0随机分布发生变化,视觉结构相似

练习

main 函数里用 hash21(floor(vUv * 64.0)) 计算格点随机值,并将它输出为灰度图。

答案解析

关键改动只有一行:把 n = 0.0 替换成 n = hash21(floor(vUv * 64.0))

  • vUv * 64.0:把 UV 放大,决定格子密度
  • floor(...):把同一格内所有像素压到同一个整数坐标
  • hash21(...):对这个整数坐标取伪随机值,得到 0–1 的灰度
  • vec3(n):把单个浮点数扩展成灰度颜色

初始代码 n = 0.0 让所有像素都是黑色。替换之后每个格子拿到属于自己的随机数,画面就变成马赛克噪声。

试着把 64.0 改成 16.0,感受格子大小和噪声粗细的关系。

GLSL 代码编辑器

正确代码预览

当前代码预览