【URP】Unity[内置Shader]粒子简单光照ParticlesSimpleLit

【从UnityURP开始探索游戏渲染】专栏-直达

作用与原理

ParticlesSimpleLit是Unity URP(Universal Render Pipeline)中专门为粒子系统设计的简化光照着色器,主要用于实现高性能的粒子渲染效果。其核心原理是通过简化光照计算模型,牺牲部分物理准确性来换取更高的渲染效率,特别适合移动端或低端设备使用。

该着色器不计算物理正确性和能量守恒,而是采用一个简单的近似照明模型,这使得它在渲染时可以忽略复杂的物理计算。ParticlesSimpleLit主要包含三个关键部分:

  • Surface Options:控制材质的基本渲染方式,如颜色和光照模式
  • Surface Inputs:描述表面特性,如湿度、粗糙度等
  • Advanced选项:提供更底层的渲染设置如阴影和反射

发展历史

ParticlesSimpleLit随着URP的发展经历了多个版本迭代:

  • 最初作为URP核心着色器之一引入,替代了传统Built-in渲染管线中的简单粒子着色器
  • 在URP 7.x版本中进行了性能优化,特别针对移动平台
  • URP 12.0版本后增加了对Shader Graph的支持
  • 最新版本(如URP 16.0.6)进一步优化了变体管理和GPU实例化支持

具体使用方法

基本应用示例

在Unity中使用ParticlesSimpleLit的步骤如下:

  • 创建或选择粒子系统
  • 在粒子系统的Renderer模块中指定材质
  • 创建新材质或选择现有材质
  • 在材质Inspector窗口的Shader下拉菜单中选择"Universal Render Pipeline > Particles > Simple Lit"

代码说明:这个C#脚本示例展示了如何通过代码动态为粒子系统应用ParticlesSimpleLit着色器。

  • ParticleSimpleLitExample.cs

    csharp 复制代码
    // 在代码中动态设置材质Shader的示例
    using UnityEngine;
    
    public class ParticleShaderSetter : MonoBehaviour
    {
        public ParticleSystem particleSystem;
    
        void Start()
        {
            var renderer = particleSystem.GetComponent<ParticleSystemRenderer>();
            Material mat = new Material(Shader.Find("Universal Render Pipeline/Particles/Simple Lit"));
            renderer.material = mat;
        }
    }
    // 以下是Shader Graph的节点设置参考:
    /*
    1. 添加Texture2D节点作为Base Map输入
    2. 添加Color节点作为Base Color输入
    3. 添加Slider节点控制Specular(0-1范围)
    4. 添加Slider节点控制Smoothness(0-1范围)
    5. 连接这些节点到PBR Master的对应输入
    6. 在PBR Master节点中禁用高级光照计算
    */

参数配置

ParticlesSimpleLit提供了多个可调参数:

  • Base Map‌:基础纹理,定义粒子外观
  • Base Color‌:基础颜色,与纹理相乘
  • Specular‌:控制高光强度
  • Smoothness‌:控制表面光滑度
  • Emission‌:控制自发光强度和颜色

Shader Graph中的应用

在Shader Graph中使用ParticlesSimpleLit需要以下步骤:

  • 创建新的Shader Graph
  • 在Graph Inspector中将"Target"设置为"Universal Render Pipeline"
  • 使用"PBR Master"节点并调整设置以匹配SimpleLit特性
  • 添加必要的纹理和参数输入

代码说明:这个伪代码描述了在Shader Graph中重建ParticlesSimpleLit基本功能所需的节点配置。

  • ParticleSimpleLitExample.cs

    csharp 复制代码
    // 在代码中动态设置材质Shader的示例
    using UnityEngine;
    
    public class ParticleShaderSetter : MonoBehaviour
    {
        public ParticleSystem particleSystem;
    
        void Start()
        {
            var renderer = particleSystem.GetComponent<ParticleSystemRenderer>();
            Material mat = new Material(Shader.Find("Universal Render Pipeline/Particles/Simple Lit"));
            renderer.material = mat;
        }
    }
    
    // 以下是Shader Graph的节点设置参考:
    /*
    1. 添加Texture2D节点作为Base Map输入
    2. 添加Color节点作为Base Color输入
    3. 添加Slider节点控制Specular(0-1范围)
    4. 添加Slider节点控制Smoothness(0-1范围)
    5. 连接这些节点到PBR Master的对应输入
    6. 在PBR Master节点中禁用高级光照计算
    */

高级应用示例

结合粒子系统的其他模块,如Lights模块和Trails模块,可以创建更复杂的效果。例如创建一个带有拖尾效果的火焰粒子:

  • 启用粒子系统的Trails模块
  • 使用ParticlesSimpleLit材质并设置适当的Emission值
  • 调整Base Color为橙黄色渐变
  • 根据需要启用Lights模块为部分粒子添加点光源效果

ParticlesSimpleLit因其高效的性能表现,特别适合需要大量粒子的场景,如魔法效果、烟雾、火焰等视觉效果

火焰与烟雾效果

通过调整Surface Type为Transparent并选择Additive混合模式,配合噪声纹理实现动态火焰形态。关键参数包括_Emission控制发光强度、_MainTex设置火焰贴图序列帧,同时需启用Color over Lifetime模块实现颜色渐变。具体实现步骤:

  • 创建Particle System,材质选择Universal Render Pipeline > Particles > Simple Lit
  • 在Surface Options中设置Blending Mode为Additive
  • 通过脚本控制_Emission强度模拟燃烧波动

雨雪天气效果

采用Opaque表面类型提升性能,结合GPU实例化实现大面积粒子渲染。需配置_MainTex为雨滴/雪花贴图,使用_SoftParticlesNearFade控制粒子淡入距离,并通过Rotation over Lifetime模块添加随机旋转。典型参数:

  • _MainTex: 雨滴Alpha贴图 _SoftParticlesNearFade: 0.5 _RenderFace: Both

魔法粒子特效

利用Color Mode的Overlay选项实现材质与粒子颜色混合,配合_Cutoff参数制作闪烁效果。通过脚本动态修改_HitPos和_HitSize数组可实现受击时的波纹扩散。核心代码逻辑包括:

  • 声明Shader属性:_HitPos("HitPos", Vector) = (0,0,0,0)
  • 在片段着色器中计算距离衰减:float dist = distance(i.worldPos, _HitPos)

落叶/花瓣效果

需启用Alpha Clipping并设置合适阈值(通常0.3-0.5),结合粒子系统的Shape模块设置为Box发射器覆盖树木范围。通过Size over Lifetime实现下落过程中的尺寸变化,使用Texture Sheet Animation模块添加飘动动画。

受击闪白效果

复制ParticlesSimpleLit着色器后添加受击逻辑,通过Lerp函数混合原始颜色与白色,使用_SinTime控制恢复速度。关键实现参考受击闪白动画方案:

  • 添加属性:_FlashAmount("Flash Amount", Range(0,1)) = 0
  • 颜色混合:finalColor = lerp(originalColor, white, _FlashAmount)

所有效果均需在URP设置中开启Depth Texture和Opaque Texture选项以保证深度交互正常。对于复杂效果,建议结合Shader Graph进行原型设计后再转换为代码实现.


【从UnityURP开始探索游戏渲染】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
_大学牲17 小时前
Flutter 勇闯2D像素游戏之路(一):一个 Hero 的诞生
flutter·游戏·游戏开发
小猪努力学前端17 小时前
基于PixiJS的小游戏广告开发
前端·webgl·游戏开发
SmalBox1 天前
【URP】Unity[内置Shader]粒子光照ParticlesLit
unity3d·游戏开发·图形学
SmalBox2 天前
【URP】Unity[内置Shader]地形光照TerrainLit
unity3d·游戏开发·图形学
优梦创客3 天前
3 天搞定微小游戏上架!独立开发者副业赚钱全攻略(附选题 / 技术 / 运营干货)
微信·教程·小游戏·游戏开发
UWA3 天前
如何排查优化URP内置Shader冗余
性能优化·memory·游戏开发
陈尕六3 天前
从零开始的 Godot 之旅 — EP11:初识瓦片地图
godot·游戏开发
SmalBox3 天前
【URP】Unity[内置Shader]烘焙光照BakedLit
unity3d·游戏开发·图形学
SmalBox4 天前
【URP】Unity[内置Shader]非光照Unlit
unity3d·游戏开发·图形学