【Unity URP】Shader Graph 全流程打造动态水面:从深度计算到折射扭曲
1. 从零开始搭建URP水面场景在Unity中创建逼真水面效果的第一步是搭建基础场景。我建议新建一个URP项目因为URP对移动端和PC端都有良好的性能优化而且支持我们需要的Scene Color和Scene Depth节点。实测下来URP的水面渲染效率比内置管线高出30%左右。创建水面模型时我踩过最大的坑就是网格密度问题。很多人觉得用个简单的Plane就行但实际测试发现至少需要100x100的细分网格才能呈现自然的水波起伏。这里有个小技巧在Blender中创建高密度平面后导出为FBX比直接在Unity中用ProBuilder创建的网格更规整。环境配置有三个关键点在URP Asset中开启Depth Texture和Opaque Texture设置合理的HDR和抗锯齿参数添加适当的天空盒和雾效增强空间感我常用的基础配置参数如下参数名称推荐值作用说明MSAA4x抗锯齿质量HDR开启高动态范围Shadow Distance50-100阴影渲染距离2. Shader Graph核心架构设计2.1 主图框架搭建创建Water.shadergraph时Surface Type一定要设为Transparent。这里有个细节很多人会忽略Alpha模式建议选Premultiply这样处理半透明叠加效果更自然。我在最近的一个湖泊项目中对比发现Premultiply模式下的水岸过渡比Alpha Blend平滑20%左右。主图需要连接五个关键子图WaterDepth深度计算WaterNormal法线生成WaterPosition顶点动画WaterColor颜色混合WaterRefraction折射效果建议把Smoothness和Metallic参数暴露出来方便后期调整材质质感。我通常会设置Smoothness在0.85-0.95之间模拟水面的高光反射。2.2 深度计算子系统WaterDepth子图是整个水面的眼睛它决定了哪里是浅水区、哪里是深水区。核心原理是通过Scene Depth节点获取水底深度再用Screen Position的w分量减去这个值。这里有个重要技巧添加一个Clamp节点限制深度范围避免出现极端值导致的渲染异常。深度计算公式可以表示为waterDepth saturate((sceneDepth - screenDepth) * depthScale depthBias)我常用的参数组合depthScale: 0.5-1.0depthBias: -0.2-0.2Clamp Min/Max: 0-53. 动态波纹与法线生成3.1 多层级波纹叠加真实水面的波纹从来不是单一频率的。我通常采用三层噪声叠加大尺度流动波纹Noise Scale 50-100中尺度细节波纹Noise Scale 20-30小尺度高频扰动Noise Scale 5-10在WaterNormal子图中使用Simple Noise节点生成基础波纹通过Time节点驱动动画。有个实用技巧对X和Z轴使用不同的速度参数可以创造出更自然的非均匀流动效果。3.2 深度感知波纹强度通过将WaterDepth的输出连接到Normal Strength参数可以实现深浅水区的波纹差异。我在一个海岛项目中发现深水区波纹强度设为0.3浅水区设为0.8时效果最真实。这个效果的关键是用Power节点对深度值进行非线性变换normalStrength pow(waterDepth, depthAttenuation)4. 高级折射效果实现4.1 Scene Color采样技巧WaterRefraction子图的核心是Scene Color节点。这里有个重要注意事项Scene Color在URP中的采样位置需要根据Normal进行偏移。我推荐使用以下节点组合用Normal节点获取水面法线通过Multiply控制折射强度用DDX/DDY节点消除边缘锯齿折射偏移的黄金参数平静水面0.01-0.03湍急水流0.05-0.1暴风雨场景0.15-0.24.2 边缘泡沫模拟BubbleColor子图需要处理两个关键效果岸边泡沫聚集水面随机气泡岸边泡沫可以通过深度值的梯度检测实现foam saturate(ddx(waterDepth)*100) saturate(ddy(waterDepth)*100)随机气泡则使用Voronoi噪声配合Time节点生成动态图案。建议将BubbleDensity设为50-100BubbleSpeed设为0.1-0.3这样既不会太密集也不会显得呆板。5. 性能优化实战经验5.1 移动端适配方案在Android设备上测试时发现两个主要性能瓶颈Scene Color采样次数顶点动画计算量我的优化方案将折射采样降频到半分辨率用顶点着色器替代片元着色器计算简单波浪减少噪声层数到2层实测在Redmi Note 10上帧率从22fps提升到了48fps。5.2 LOD分级策略根据摄像机距离动态调整水面质量近距离20米全精度渲染中距离20-50米简化折射和泡沫远距离50米只保留基础颜色和法线实现方法是创建三个不同复杂度的Shader变体通过脚本控制切换。这个方案在我的开放世界项目中节省了35%的渲染耗时。