水下气泡与焦散光效:UE5 环境特效的高级技巧

上周有位学员发来一个水下场景的截图,气泡像漂浮的塑料球,焦散光效生硬得像贴图。他问:“为什么我照着教程调了参数,效果还是假?”这其实不是参数问题,而是缺乏对物理机制的理解。今天,我们就用 UE5.3 的 Niagara 粒子系统和材质系统,从零打造一套专业级水下环境特效。

一、气泡系统:从浮力到折射的物理模拟

1.1 粒子发射器的核心设置

在 UE5.3 中,新建一个 Niagara 发射器(右键 Content Browser → FX → Niagara System → 选择 “Sprite” 模板)。关键参数如下:

  • Emitter PropertiesSim Target 设为 “GPU Compute”(GPU 模拟支持更多粒子,水下场景建议 5000-10000 个粒子)。
  • Spawn Rate:0.5-1.0 秒/粒子(根据场景大小调整,小场景用 0.5 秒,大场景用 1.0 秒)。
  • Particle Life:Min=3.0, Max=6.0(气泡上升速度较慢,生命周期要长)。
  • 1.2 浮力与随机运动

    在 Particle Spawn 模块添加 Add VelocityScale Color

  • VelocityZ 轴设为 15-25 cm/s(模拟气泡上升速度)。
  • 添加 Random Walk 模块:Walk Speed=5-10 cm/s,Walk Frequency=2-4 Hz(让气泡产生横向漂移)。
  • 1.3 折射材质:让气泡“活”起来

    气泡的核心是透明材质中的“折射”效果。新建材质(右键 → Material → 选择 “Surface” → Blend Mode 设为 “Translucent”):

  • Shading Model 选 “Default Lit”。
  • Opacity 连入 Constant 值 0.1-0.3(太透明会消失,太实会像玻璃球)。
  • Refraction 节点:Refraction Depth Bias=0.5,Refraction Vector 连入 World Position Offset 的修改。
  • 关键步骤:在材质中创建 Custom 节点,输入以下代码模拟球面折射:

    float3 normal = normalize(WorldNormal);
    float3 viewDir = normalize(CameraVector);
    float refraction = 1.33; // 水的折射率
    float3 refracted = refract(viewDir, normal, 1.0/refraction);
    return refracted;
    

    然后将输出连到 Refraction 引脚,Refraction Depth Bias 设为 0.3-0.5。

    气泡粒子系统参数面板

    二、焦散光效:动态光照的数学之美

    2.1 材质函数的数学基础

    焦散的本质是水面对光线的折射汇聚。在 UE5.3 中,通过材质函数(Material Function)实现动态焦散纹理。

    创建一个 Material Function(右键 → Materials & Textures → Material Function),命名为 `MF_CausticsPattern`。内部节��:

  • Time 节点 → 乘以 Speed 参数(默认 0.5)。
  • Sine 节点:Frequency=2.0,Amplitude=1.0。
  • 将结果输入到 Texture CoordinateUV 偏移。
  • 使用 Panner 节点:Speed X=0.1,Speed Y=0.15(让纹理缓慢漂移)。
  • 2.2 多层叠加实现真实感

    单层焦散纹理太规则,需要叠加 3-4 层不同频率的噪声:

    1. 第一层:Texture Sample 使用 `T_Caustics_01`(引擎自带纹理),UV 缩放 0.5,Speed=0.3。
    2. 第二层:Texture Sample 使用 `T_Caustics_02`,UV 缩放 0.8,Speed=0.5。
    3. 第三层:Noise 节点,Scale=0.2,Speed=0.7。

    将三层纹理通过 Multiply 节点混合,再通过 Power 节点(Exponent=2.0)增强对比度。

    2.3 投影到场景的实战操作

    在场景中创建一个 Directional Light 作为主光源,然后在它的 Light Function 槽位应用刚才的焦散材质函数。

  • Light Function Material:选择 `MF_CausticsPattern`。
  • Source Angle:0.5(角度越小,焦散越锐利)。
  • Intensity:2.0-3.0(���据场景亮度调整)。
  • 注意:焦散光效需要配合 Volumetric Fog 才能产生散射效果。在 Post Process Volume 中启用 Volumetric FogScattering Distribution 设为 0.5,Albedo 设为浅蓝色(R=0.2, G=0.4, B=0.6)。

    焦散材质函数节点结构

    三、性能优化:让特效跑在 60fps

    3.1 粒子系统优化

  • LOD:在 Niagara 发射器属性中,设置 LOD Distance 为 2000-5000 cm(远处粒子数量减半)。
  • Particle Culling:启用 Cull by DistanceCull Distance=3000 cm(超出范围直接隐藏)。
  • Texture Atlas:将气泡纹理打包到 512×512 的图集,减少 Draw Call。
  • 3.2 材质优化

  • 焦散材质:Shader Complexity 控制在 50 以下(查看方式:`r.ShaderComplexity 1`)。
  • 禁用 Translucency Lighting(在材质详情中取消勾选,除非需要光照反射)。
  • 使用 Simple Forward 渲染路径(项目设置 → Rendering → Forward Shading 启用)。
  • 3.3 场景级优化

  • 将焦散光效限制在 10×10 米的范围内(使用 Light FunctionAttenuation 参数)。
  • 气泡粒子:Max Particles 限制为 2000-3000(根据场景复杂度调整)。
  • 使用 Static Lighting 预计算焦散光照(仅适用于静态物体)。
  • 性能分析工具 Profiler 截图

    四、总结与进阶建议

    通过本文的步骤,你已经掌握了水下气泡和焦散光效的核心技术。总结关键点:
    1. 气泡的物理模拟:浮力(Z轴速度)+随机漂移(Random Walk)+折射材质(Refraction节点)
    2. 焦散光效:多层噪声叠加 + Light Function + Volumetric Fog
    3. 性能优化:LOD、粒子数量限制、材质复杂度控制

    进阶学习建议:

  • 尝试用 NiagaraGPU Compute 模拟气泡之间的碰撞(使用 Collision 模块)。
  • 研究 Subsurface Scattering 材质,模拟水下物体的半透明效果。
  • 结合 Water Body 系统(UE5.3 新增),实现完整的海洋/湖泊环境。
  • 常见问题 FAQ

    Q1:气泡粒子在远处突然消失,怎么解决?
    A:检查 Niagara 发射器的 Cull by DistanceLOD 设置。建议将 Cull Distance 设为 5000 cm,并启用 LODFade 模式(在 LOD Settings 中设置 Fade Time=1.0)。

    Q2:焦散光效只出现在特定角度,如何调整?
    A:焦散光效依赖于光源方向。在 Light Function 材质中,添加 Dot Product 节点计算光源与法线的点积,再乘以焦散纹理,实现全角度覆盖。

    Q3:气泡材质折射效果不明显,参数怎么调?
    A:检查 Refraction Depth Bias 值(建议 0.3-0.8),以及 Opacity 值(0.1-0.3)。如果使用自定义 HLSL 代码,确认 CameraVectorWorldNormal 连接正确。

    Q4:场景中有多个光源,焦散应该用哪个?
    A:通常只对主方向光(Directional Light)应用焦散。其他光源(点光、聚光)会破坏效果。在 Light Function 中通过 Light Direction 节点判断光源类型。

    Q5:性能优化后效果变差,如何平衡?
    A:优先降低粒子数量(从 10000 降到 3000),然后降低焦散纹理的分辨率(从 2048×2048 降到 512×512)。最后调整 Volumetric Fog 的 Step Size(从 10 调到 20)。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。