【Vertex着色器】Unity实现-体积雪效果

110 阅读5分钟

【Unity Shader Graph 使用与特效实现】专栏-直达

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 PositionVector3输入(只读),模型顶点的世界空间坐标,作为积雪的空间基准
HeightFloat输入(可调节),模型的高度分量(Y 轴)
DensityFloat输入(可调节),积雪的密度/厚度系数
Wind DirectionVector2输入(可调节),雪片漂移的水平方向(如 XZ 平面)
Wind SpeedFloat输入(可调节),雪片漂移的速度(值为负时反向)
Snow ColorColor输入(可调节),积雪的颜色,支持 Alpha 通道控制透明度
Fall SpeedFloat输入(可调节),雪花飘落的速度
Noise ScaleFloat输入(可调节),噪声缩放比例,控制雪层的不规则程度
Base ColorColor输入(可调节),模型的基础颜色
Out ColorVector4输出,最终的着色器颜色

体积雪效果的实现步骤(可复现)

前置准备

  1. 环境要求:Unity 2021.3+,URP 渲染管线,已安装 Shader Graph 插件。
  2. 素材准备:任意 3D 模型(如 Cube、Ground),用于测试体积雪效果。
  3. 创建基础 Shader:
    • 在 Project 窗口右键→Create→Shader→Universal Render Pipeline→Lit Shader Graph,命名为"VertexSnowShader"。

步骤 1:获取空间高度与时间变量

  • 添加 Height 节点:从 World Position 提取 Y 分量(模型的高度)。
  • 添加 Time 节点:选择"Time > Float",作为雪花飘落的时间驱动。

步骤 2:构建体积雪的密度场

  • 噪声生成:
    1. 添加"Simplex Noise"节点,将 Height 与 Noise Scale 相乘后输入 In 端口。
    2. 添加"Sine"节点,对噪声输出进行周期性调制,实现雪层的起伏效果。

步骤 3:风场驱动的积雪漂移

  • 向量场构建:
    1. 添加"Vector2"节点,命名为"Wind Direction",默认值设为 (0,1)(垂直向下飘落)。
    2. 添加"Multiply"节点,将 Wind Direction 与 Wind Speed 相乘,得到风场向量。
    3. 将时间变量与风场向量相加:drift = time * windVector。

步骤 4:体积雪的叠加输出

  • 积雪颜色混合:
    1. 添加"Multiply"节点,将 Snow Color 与密度场遮罩相乘。
    2. 添加"Add"节点,将上述结果与 Base Color 混合,得到最终颜色。

步骤 5:保存并应用 Shader

  • 保存着色器,创建材质并应用于场景模型,进入 Play 模式即可看到体积雪效果。

体积雪效果的实战调优与扩展案例

基础案例:地面降雪效果(场景积雪)

调整步骤
  1. 参数设置:
    • Density:设为 0.8(较厚的积雪)。
    • Wind Direction:设为 (0,1)(垂直向下飘落)。
    • Wind Speed:设为 0.5(缓慢下落)。
  2. 效果增强:将 Snow Color 连接到 Emission 端口,Emission 强度设为 0.3,使积雪微微发光。

进阶案例:风雪天气效果(动态漂移)

调整步骤
  1. 修改风场:将 Wind Direction 设为 (-1,1)(向左上方漂移)。
  2. 参数调整:
    • 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 使用与特效实现】专栏 - 直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)