粒子系统
Particle Systems
粒子系统是一组按某种算法运动的小物体,用于火、烟、爆炸、水流、星系等,同时负责动画(生成、移动、变化、删除)和渲染。粒子通常渲染成公告板;难点在半透明排序、光照(逐顶点、逐像素低分辨率光照图块)以及接收/投射/自阴影(透射率溅射、傅里叶不透明度贴图、消光体积)(RTR4 13.8 节)。
表示与渲染
- 粒子可以是单个像素、从上一位置到当前位置的线段,但多为公告板;圆形粒子不需要上向量,只要位置。公告板可由几何着色器生成,但实践中用顶点着色器生成精灵可能更快。除颜色纹理外还可加法线贴图;轴向公告板可画更粗的线(如雨)。
- Ericson 的效率建议:
| 建议 | 原因 |
|---|---|
| 用厚实的镂空纹理做烟 | 不半透明就不需排序和混合 |
| 需要半透明时用加法或减法混合 | 不需排序 |
| 少量动画粒子代替大量静态粒子 | 质量相近、性能更好 |
| 动态限制渲染的粒子数上限 | 保持帧率 |
| 不同粒子系统共用着色器 | 避免状态切换 |
| 所有粒子图像放进纹理图集或数组 | 避免切换纹理 |
| 烟等平滑粒子画到低分辨率缓冲再合并,或在 MSAA resolve 之后画 | 省像素开销 |
Tatarchuk 等把烟画到 1/16 大小的缓冲,并用方差深度图帮助计算粒子效果的累积分布函数。
- 排序:粒子多时全排序昂贵。美术指定渲染顺序来正确分层不同效果;小或低对比度粒子可不排序;有时可大致按顺序发射;粒子较透明时可用无需排序的加权混合 OIT;Köhler 把粒子渲染到存于纹理数组的 9 层深缓冲,再用计算着色器排序。
粒子着色
- 火花等发光体不需着色,常用加性混合。Green:流体渲染成球形粒子写入深度图,模糊深度、由深度求法线,再与场景合并。
- 灰尘、烟等小粒子可逐图元或逐顶点着色,但会让表面分明的粒子显得扁平;法线贴图更准但多了纹理访问;圆粒子在四角用四个发散法线可能就够。也有用辐射度法线贴图、球谐或更复杂散射模型的;大粒子可细分并在域着色器中逐顶点累积光照。
- 逐顶点快但大粒子质量低(相距远的顶点会漏掉小光源)。低分辨率逐像素光照:每个可见粒子在光照贴图纹理中分配一个图块(按屏幕投影面积 1×1 到 32×32),先把每像素世界位置写入辅助纹理,再用计算着色器借助光源加速结构(第 20 章)采样光源,结果以颜色或球谐写入图块;最终渲染时把图块映射到粒子四边形上逐像素采样。也可每个发射器一个图块,深的光照贴图让大量粒子的效果更有体积感。
- 粒子大多面向观察者且扁平,以上所有光照模型在视点绕发射器旋转时都会出现可见的闪烁。
粒子阴影
- 接收:小粒子常只在顶点处测试阴影贴图。
- 投射到场景:粒子是散点,无法在阴影贴图中光线步进,但可以溅射:把每个粒子的透射率 乘入一张初值为 1 的纹理(单通道灰度或三通道彩色),按阴影级联组织,与不透明阴影级联的可见性相乘,即一层透明阴影。缺点:粒子会错误地把阴影投到位于粒子和太阳之间的不透明物体上,通常靠关卡设计避免。
- 自阴影:傅里叶不透明度贴图 (FOM)——从光源视角渲染粒子,把贡献累加为透射函数的傅里叶系数;渲染粒子时由系数重建透射率。适合平滑透射函数,系数有限时透射率剧变处会振铃,产生错误的亮/暗区。替代方案:自适应体积阴影贴图(类似深度阴影贴图)、GPU 优化的粒子阴影贴图(类似不透明度阴影贴图,但只适用于面向相机的粒子,不适用于条带或运动拉伸粒子)、透射函数贴图(类似 FOM)。
- 消光体积:把粒子体素化到存消光系数 的体积中(像 clipmap 一样放在相机周围),与参与介质统一;从这些体积生成存每体素 的深度阴影贴图,粒子与参与介质即可互相投影并自阴影。质量受体素尺寸限制,实时下体素较大,阴影粗糙但柔和。
模拟
GPU 可生成精灵动画路径甚至做碰撞检测。流输出可控制粒子出生和死亡(结果存入顶点缓冲每帧在 GPU 上更新);有 UAV 时粒子系统可完全基于 GPU。书中列出的实践参考:《命运 2》粒子系统、按 Bridson 流体书实现流体、虚幻 4 粒子控制、《声名狼藉:次子》的特效设计、高效生成和渲染雨、基于计算着色器含碰撞检测/透明排序/瓦片渲染的系统、《野蛮传奇》的粒子与图像效果等。
GEA 的视角:粒子效果的特征(卷 II 11.6.4–11.6.5)
- 定位:图形管线主要负责实体物体;在它之上通常叠加一批专门的渲染系统,负责粒子、贴花、毛发、雨雪、水等效果,再加暗角、运动模糊、景深等全屏后处理,最后在屏幕空间叠加菜单和 HUD(卷 II 11.6.4)。GEA 把这些归为"基于卡片的效果"等专门系统。
- 粒子渲染系统负责烟、火花、火焰等无定形物体。GEA 列出粒子效果区别于普通几何的特征(卷 II 11.6.5):
- 由大量很简单的几何组成,最常见的是两个三角形组成的四边形卡片;
- 几何通常面向相机(公告板),引擎要保证每个四边形的法线始终指向相机焦点(见 公告板);
- 材质几乎总是半透明,因此有大多数不透明物体没有的严格渲染顺序约束(见 透明渲染与 Alpha 混合);
- 动画方式丰富:位置、朝向、大小、纹理坐标和许多着色器参数逐帧变化,由手工动画曲线或程序方法驱动;
- 持续生成和销毁:发射器按指定速率生成粒子,粒子碰到预设的死亡平面、超过寿命或满足其他条件时被销毁。
- 粒子理论上可以用普通三角网格加合适的着色器渲染,但因为上述特性,正式产品引擎总是用专门的粒子动画和渲染系统实现。从点数据生成粒子四边形是几何着色器的典型用途之一(见 曲面细分与几何着色器)。
GPU Gems 的视角:离屏低分辨率粒子(GPU Gems 3 第 23 章)
来源:Iain Cantlay《High-Speed, Off-Screen Particles》;摘录 Chapter 23. High-Speed, Off-Screen Particles — Iain Cantlay。针对烟/雾/爆炸等低频特效的填充率爆炸。
粒子画到主缓冲若干分之一的离屏目标;深度先降采样再做测试。点采样深度会在前景物体周围出光晕;改取邻域最大深度人为收缩剪影,粒子侵入固体一点但观感更好(纯经验 hack)。有深度后软粒子(按相交距离淡出 α)几乎免费。Alpha:RGB 常规混合,α 通道累乘 ,合成时用 SeparateAlphaBlend。混合分辨率:Sobel 找离屏图硬边 → 模板遮罩 → 仅边缘区用全分辨率重画粒子。高频碎片(飞石)不适合。极端过度绘制下 4×4 混合分辨率可近乎翻倍帧率。
出处
- realtime_rendering_4ed.pdf 第 13 章 Beyond Polygons
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.6.4–11.6.5 节
- Chapter 23. High-Speed, Off-Screen Particles — Iain Cantlay
- developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-23-high-speed-screen-particles