Unity Shader Graph - 体积雪效果
Vertex 着色器体积雪效果的核心原理与数学基础
体积雪的视觉本质与空间分布
Vertex 着色器体积雪效果本质是在三维空间中构建粒子化的积雪系统,并结合高度场、密度场等数学模型,模拟出"堆积"的视觉特征。其核心数学逻辑围绕以下两点展开:
- 空间堆叠性:利用高度场函数(Height Field)在模型表面构建雪层厚度分布,积雪的厚度、范围由高度值和密度参数控制。
- 体积粒子化:将雪花表示为顶点偏移量(Vertex Offset),通过时间变量与噪声函数模拟自然的飘落轨迹。
关键数学特性
- 高度映射 :将三维空间坐标的高度分量映射到雪层厚度,实现公式:
snowDepth = height * density + time * drift。 - 值域约束:通过阈值处理将高度场输出转换为二值化的积雪遮罩,控制积雪的显示/隐藏区域。
- 风场驱动:通过向量场(Vector Field)模拟雪片在水平方向的漂移运动,支持风向、风速调节。
体积雪效果的 Shader Graph 节点设计
核心节点功能概述
在 Unity Vertex Shader Graph 中实现体积雪效果,需整合高度采样、噪声生成、向量场等节点,核心功能包括:
- 高度空间采样:获取模型的世界空间高度(World Position.y),作为积雪厚度的空间基准。
- 动态时间驱动:通过 Time 节点获取实时时间,控制雪花飘落的速度和节奏。
- 体积密度分布:利用噪声函数构建雪层的厚度与覆盖范围。
关键端口与参数定义
| 端口名称 | 类型 | 功能说明 |
|---|---|---|
| World Position | Vector3 | 输入(只读),模型顶点的世界空间坐标,作为积雪的空间基准 |
| Height | Float | 输入(可调节),模型的高度分量(Y 轴) |
| Density | Float | 输入(可调节),积雪的密度/厚度系数 |
| Wind Direction | Vector2 | 输入(可调节),雪片漂移的水平方向(如 XZ 平面) |
| Wind Speed | Float | 输入(可调节),雪片漂移的速度(值为负时反向) |
| Snow Color | Color | 输入(可调节),积雪的颜色,支持 Alpha 通道控制透明度 |
| Fall Speed | Float | 输入(可调节),雪花飘落的速度 |
| Noise Scale | Float | 输入(可调节),噪声缩放比例,控制雪层的不规则程度 |
| Base Color | Color | 输入(可调节),模型的基础颜色 |
| Out Color | Vector4 | 输出,最终的着色器颜色 |
体积雪效果的实现步骤(可复现)
前置准备
- 环境要求:Unity 2021.3+,URP 渲染管线,已安装 Shader Graph 插件。
- 素材准备:任意 3D 模型(如 Cube、Ground),用于测试体积雪效果。
- 创建基础 Shader :
- 在 Project 窗口右键→Create→Shader→Universal Render Pipeline→Lit Shader Graph,命名为"VertexSnowShader"。
步骤 1:获取空间高度与时间变量
- 添加 Height 节点:从 World Position 提取 Y 分量(模型的高度)。
- 添加 Time 节点:选择"Time > Float",作为雪花飘落的时间驱动。
步骤 2:构建体积雪的密度场
- 噪声生成 :
- 添加"Simplex Noise"节点,将 Height 与 Noise Scale 相乘后输入 In 端口。
- 添加"Sine"节点,对噪声输出进行周期性调制,实现雪层的起伏效果。
步骤 3:风场驱动的积雪漂移
- 向量场构建 :
- 添加"Vector2"节点,命名为"Wind Direction",默认值设为 (0,1)(垂直向下飘落)。
- 添加"Multiply"节点,将 Wind Direction 与 Wind Speed 相乘,得到风场向量。
- 将时间变量与风场向量相加:
drift = time * windVector。
步骤 4:体积雪的叠加输出
- 积雪颜色混合 :
- 添加"Multiply"节点,将 Snow Color 与密度场遮罩相乘。
- 添加"Add"节点,将上述结果与 Base Color 混合,得到最终颜色。
步骤 5:保存并应用 Shader
- 保存着色器,创建材质并应用于场景模型,进入 Play 模式即可看到体积雪效果。
体积雪效果的实战调优与扩展案例
基础案例:地面降雪效果(场景积雪)
调整步骤
- 参数设置 :
- Density:设为 0.8(较厚的积雪)。
- Wind Direction:设为 (0,1)(垂直向下飘落)。
- Wind Speed:设为 0.5(缓慢下落)。
- 效果增强:将 Snow Color 连接到 Emission 端口,Emission 强度设为 0.3,使积雪微微发光。
进阶案例:风雪天气效果(动态漂移)
调整步骤
- 修改风场:将 Wind Direction 设为 (-1,1)(向左上方漂移)。
- 参数调整 :
- Wind Speed:设为 2.0(快速漂移)。
- Noise Scale:设为 0.3(增加不规则度)。
体积雪效果的使用技巧与注意事项
空间坐标选择
- 世界空间(World Space):积雪固定于场景,适合户外雪景。
- 对象空间(Object Space):积雪随模型移动,适合角色/物体的积雪装饰。
性能优化
- 控制噪声复杂度:Simplex Noise 的输入建议不超过 3 个维度。
- LOD 适配:为不同 LOD 等级设置不同的 Density 值。
常见问题排查
- 积雪不显示:检查 Density 是否过大或过小(建议 0.1~2.0)。
- 漂移效果卡顿:降低 Wind Speed 值或使用 Delta Time。
总结与拓展应用
总结
Unity Vertex Shader Graph 中的体积雪效果核心是通过"空间高度采样 + 噪声密度场 + 风场漂移驱动",实现从静态积雪到动态飘落的视觉转换。通过调整密度、风速、风向等参数,可适配户外雪景、风雪天气、角色积雪装饰等多种场景需求。
拓展应用
- 交互踩雪效果:结合射线检测,当玩家踩踏模型时,触发积雪凹陷/塌陷效果,用于第一人称游戏的雪地行走体验。
- 雪崩模拟:将体积雪与高度场阈值结合,超过临界高度时产生雪崩动画效果。
- 多层积雪叠加:将不同厚度的雪层通过透明度混合,实现新旧雪迹的层次感。
【Unity Shader Graph 使用与特效实现】专栏 - 直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)