用途
该技能用于在 Unity 中创建、修改或优化水、海洋、河流、湖泊、池塘、流体、岩浆或液体着色器,尤其面向移动端或 WebGL。触发场景包括:water shader、ocean、waves、foam、shoreline、refraction、caustics、Gerstner、fluid、depth coloring、stylized water、toon water,以及任何与水相关的视觉效果;当用户引用 NVJOB、bmjoy 或 Alexander Ameye 的水体着色器仓库时同样适用。
主要能力
-
移动端水体约束规则:移动端不使用曲面细分,改用现有网格上的顶点位移;水体着色器纹理采样不超过 4 次(典型预算:1 张平铺滚动的法线贴图、1 张深度纹理用于岸边/泡沫、1 张场景颜色用于折射、1 张泡沫/细节纹理,超预算时优先去掉场景颜色折射);需在 URP Asset 设置中启用 Depth Texture 与 Opaque Texture 以支持基于深度的岸边检测与折射(会额外增加一次拷贝 pass,移动端约 1ms,若开销过高可改用基于顶点颜色的深度);使用单层法线(桌面端常混合 2–3 张不同缩放的法线采样,移动端用 1 张法线贴图配合 UV 滚动做动画);Gerstner 波仅在顶点着色器中计算,移动端限制 2–3 个波八度(桌面端 4 个以上);除世界坐标与 UV 坐标外,所有水体计算使用 half 精度。
-
移动端水体着色器最小模板(URP HLSL):提供名为 "Mobile/Water_Simple" 的完整着色器代码,包含 Shallow Color、Deep Color、Depth Max Distance、Normal Map、Normal Scale、Wave Speed、Foam Color、Foam Distance、Foam Cutoff 等属性,实现基于深度的颜色渐变、单次采样的动画法线、岸边泡沫与简单菲涅尔,并设置 Transparent 渲染队列、ZWrite Off 与 Fallback。
-
Gerstner 波实现:提供 GerstnerWave 函数代码,基于色散关系计算相位速度,返回顶点位移;示例在顶点着色器中叠加 2 个波八度(不同方向、波长、陡度),并提示通过偏导数叉积重算法线。
-
水体特性成本层级:Tier 1 超低成本(低端移动端,约 0.5ms):基于顶点颜色或 UV 的深度着色(无深度纹理)、单张滚动法线贴图、无泡沫无折射、不透明渲染;Tier 2 标准移动端(约 1–2ms):深度纹理岸边着色、基于深度阈值的岸边泡沫、单张滚动法线贴图、基于菲涅尔的透明度、1–2 个 Gerstner 波八度;Tier 3 高质量移动端(约 2–4ms):深度 + 不透明纹理折射、双法线贴图混合、3 个 Gerstner 波八度、动画泡沫纹理、主光高光、焦散(投影纹理或着色器生成);Tier 4 仅桌面端:平面反射或 SSR、曲面细分、基于 FFT 的海洋模拟、次表面散射、4 个以上 Gerstner 八度。
-
Shader Graph 水体节点搭建指南:Depth Fade(Scene Depth 节点减去 Fragment Eye Depth,除以最大距离,saturate,在浅/深颜色间 lerp);Normal Animation(UV 节点加 Time × 速度向量,采样法线贴图,Normal Strength 节点);Shoreline Foam(相同深度计算但距离更小,Step 节点,乘以泡沫颜色,加到水体颜色);Fresnel(Fresnel Effect 节点,power 约 3,在基础 alpha 与 1.0 间 lerp);Vertex Displacement(Position 节点 Object Space,自定义 sine/cosine 子图,加到 Position 输出)。移动端水体着色器节点总数建议控制在 60 个以内,使用 Sub Graph 组织。
-
参考仓库:列出可参考的开源水体着色器,包括 nvjob/nvjob-water-shader-simple-and-fast(移动端适用,法线映射、视差、无曲面细分,MIT)、nvjob/nvjob-water-shaders-v2(移动端适用,V1 加反射与岸边泡沫,MIT)、bmjoy/Stylized-Water-Shader-Unity-URP(移动端适用,URP、深度颜色、泡沫、折射)、N7RX/Simple-Water-Shader(移动端适用,轻量移动优先)、danielshervheim/unity-stylized-water(部分适用,风格化与材质预设,约 953 星)、MatrixRex/Uber-Stylized-Water(部分适用,Unity 6,高度可定制)、tuxalin/water-shader(不适用移动端,多平台、Gerstner、焦散)。
-
来源教程:Alexander Ameye 的 Stylized Water Shader、Roystan 的 Toon Water、Cyanilux 的 2D Water Shader Breakdown、Harry Alisavakis 的 Water Shaders(CC0)、Catlike Coding 的 Flow 系列、80.lv 的 Nature Shaders(水 + 沙)与 Lava Lamp(流体模拟)、Brabl 的 Mobile Water Shader、Linden Reid 的 Simple Water Shader、Gabriel Aguiar 的 2D Water / Waterfall VFX。
使用方式
当用户提出创建、修改或优化 Unity 水体/流体着色器需求时触发该技能。按移动端约束选择特性层级,使用提供的 HLSL 模板或 Shader Graph 节点方案实现,并按需参考开源仓库与教程。
适用场景
移动端或 WebGL 平台的水、海洋、河流、湖泊、池塘、流体、岩浆等液体着色器开发与优化;也可用于桌面端水体着色器,但需按 Tier 4 说明调整特性。
限制
移动端不支持高效硬件曲面细分;纹理采样与深度/不透明纹理拷贝 pass 有性能预算限制;Gerstner 波八度数在移动端受限;具体性能数值(如 0.5ms、1–2ms 等)为资料给出的参考预算,实际表现取决于设备与项目。