GameTech/URP 渲染实战

案例 4.5白噪声、Value、Gradient、Simplex 并排对比进阶

目标:用同一个 Shader、同样的缩放,把四种噪声并排画出来,叠加整数格线,直观看到它们的区别。

Assets/Cookbook/Ch04/C04_05_Noise.shader(节选:select)
if (_Mode < 0.5)      n = Hash21(p);                         // 每格一个随机值,格内不变
else if (_Mode < 1.5) n = ValueNoise(p);                     // [0,1]
else if (_Mode < 2.5) n = GradientNoise(p) * 0.5 + 0.5;      // [-1,1] → [0,1]
else                  n = SimplexNoise(p) * 0.5 + 0.5;
if (_Mode < 0.5)      n = Hash21(p);                         // 每格一个随机值,格内不变
else if (_Mode < 1.5) n = ValueNoise(p);                     // [0,1]
else if (_Mode < 2.5) n = GradientNoise(p) * 0.5 + 0.5;      // [-1,1] → [0,1]
else                  n = SimplexNoise(p) * 0.5 + 0.5;

Gradient 和 Simplex 的输出大致在 [−1, 1],显示前要用 * 0.5 + 0.5 映射到 [0, 1]。在 Shader 里用噪声时也要时刻记得它的值域:拿 [−1, 1] 的噪声直接当 lerp 的 t,一半的区域会超出范围。

图 4-10缩放均为 6,橙线是整数格线。从左到右:哈希白噪声(每格一个值);Value Noise(亮暗块常以格点为中心,能看出网格感);Gradient Noise(格点处都是中间灰,起伏在格内,更自然);Simplex Noise(三角形网格,特征尺寸比同缩放的方格噪声小,且没有轴向偏好)
线性空间下的灰度本书工程使用线性色彩空间,Shader 输出的 0.5 在屏幕上显示为约 73% 亮度的浅灰,而不是“中灰”。所以直接显示噪声值时,画面会整体偏亮、对比偏低。本章把噪声值作为 lerp 的权重在两种颜色之间混合,颜色属性本身会被正确转换;更系统的色彩空间讨论在第 9 章和第 13 章。