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