【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2475|回复: 0

粒子系统教程(1)

[复制链接]
发表于 2008-12-4 15:32:31 | 显示全部楼层 |阅读模式
目的
    本教程的目的是:
      1,从游戏开发的角度阐述粒子系统的基本概念和实现方法。
      2,使用C++和Direct3D实现一套较完整的粒子系统框架,并结合一些流行游戏和我参与过开发的游戏进行讲解。力求做到简单、易懂。
      3,总结自己对粒子系统的认识和经验,抛砖引玉。
      4,因为目前改行在游戏学院当老师,多写一些资料讲课用。

简介
      早在1960年,就已经有游戏使用2D粒子系统来模拟烟雾。现在,粒子系统已经成为游戏不可或缺的一部分,用粒子模拟的自然现象、魔法效果无处不在。玩家在游戏过程中也容易被随机运动的细小事物吸引,带来更真实的体验。同时游戏引擎的粒子系统代码越来越复杂,需要良好的架构才能应对复杂性和可扩展性。
      在早期开发过程中,有些游戏的粒子效果不是由美术完全控制的。而是由美术提出需求,程序员根据自己的理解硬编码实现。这种做法的缺点显而易见:一是程序员经常理解不透美术的需求(我见过的程序员大部分都欠缺美感),做出的效果不尽人意。二是每种效果都硬编码,不易重用,工作量大。
      为解决上述问题,程序员可以提供粒子编辑器,由美术控制粒子效果。编辑器的灵活度越、高易用性越好,则美术实现的效果越好。同理,游戏的其它模块也需要提供编辑器,由美术来控制整个游戏的风格感觉。图1是我参与开发《乱武天下》时编写的粒子编辑器。




图1 Victory引擎的粒子编辑器,图中所示是一个粒子拖尾
效果,美术可以通过编辑右边的属性来控制粒子外观和行为。

      随后的章节将一步步设计实现一个简单完整的粒子系统。讲解会涉及到对性能和易用性的考虑。另外,教程最后将列出粒子系统对编辑器的需求和今后的扩展思路。完整的源代码将在每章结束处提供下载,代码使用Visual Studio2003进行编译,需要安装DirectX 9.0C。

需求和性能
      在设计粒子系统前,首先要明确它对性能的影响:
      第一,粒子系统会大量增加每帧渲染的三角形数目。假设每个粒子需要4个顶点和2个三角形来表示(公告板),那么场景中飘动的2000个雪花将对系统带来多渲染4000个三角形的负担。如果用模型来表示粒子,带来的开销会更大。
      解决此类问题,要求美术、程序员、策划相互协调,在设计游戏时尽量不要让同时渲染的粒子数目过高。程序员也可以做一些处理,比如说根据当前机器的硬件能力,动态调整粒子数目等等。
      第二,粒子的属性在不断变化,要求每帧更新Vertex Buffer(Lock,Unlock),这引起的CPU-GPU数据传输会影响系统性能。一般来说,在游戏程序里同时被其它渲染任务使用的图形总线(Graphics bus)仅允许基于CPU的粒子系统每帧处理10,000个粒子。为了最小化粒子数据传输,可以在GPU上将模拟和渲染集成在一起处理。
      第三,填充率(fillrate)。填充率即GPU每帧可以渲染的象素数,当粒子很大并且出现好多粒子重叠在一起的情况时会严重影响性能。如图2所示,用差一些的机器玩CS时,经常会因为距离烟雾弹过近而降低FPS。
      由于现在的游戏倾向于使用大量微小粒子模拟更逼真的效果,所以填充率通常不会成为瓶颈。


    图2 CS的烟雾弹造成填充率瞬间升高

      第三,大量粒子的动态分配与释放可能会造成内存碎片和内存错误,影响系统性能。为减少内存操作,可以预先分配好足够多的内存(内存池),当粒子消失后并不真正释放内存,而是把这块内存标识为可用。同样,创建粒子时不需要分配内存,只需使用标识为可用的内存块,并将其标识为正在使用。
      游戏对粒子系统的功能需求越来越复杂,下面列出几种游戏中常见的效果:
      第一,碰撞交互。少量粒子和简单物体的碰撞能够实现即时渲染(例如粒子和平面碰撞,如图3所示),【Kolb04】提出了使用GPU即时模拟大量粒子与复杂模型间碰撞的解决方案(如图4所示),相信随着硬件发展,在游戏里将会大量使这种碰撞。粒子与粒子间的碰撞在游戏中所见不多,通常都是在物理模拟中应用。


      图3 溅出的鲜血粒子与场景、摄像机间做简单碰撞

      图4 GPU处理大规模粒子系统与复杂物体的碰撞

      第二,多种渲染形式。以前通常所说的粒子系统都是由公告板(billboard)来实现,公告板由4个顶点2个三角形构成。随着游戏对画面精细度的要求不断提高,出现了多种渲染方式。粒子可以是模型(如图5)、可以是面向摄像机的拖尾(如图6)、甚至可以是另外一个粒子系统(如图7)。





图5 战地2142不同武器射击地表的粒子效果,
可以看出每个粒子是由石块模型表示的




图6 《战神2》中的红魂和《新鬼武者》里的吸魂特效,
每个粒子都有一条拖尾效果


图7 烟花模拟,每个粒子由另外一个粒子系统表现

第三,粒子的关键帧动画。每个粒子属性都可以使用动画来控制,这样能控制更多的细节,表现更丰富的粒子特效(如图8所示)。同时也能更好的和周围环境做交互,比如在冰天雪地里,角色待机和跑步时的哈气应该是不同的,可以针对不同动作实现不同的粒子动画。《魔兽世界》里可以找到很多粒子动画的例子。


图8《魔兽世界》角色在雪地奔跑时溅起的雪花特效,
此特效的发射率(每秒发射的粒子数目)是一个动画,
关键帧可能是0-某个数值-0。这样就能实现行走时间隔地溅起雪花。




索引
      【Kolb04】Kolb, Andreas; Latta, Lutz; Rezk-Salama, Christof, “Hardware-based Simulation and Collision Detection for Large Particle Systems,” Graphics Hardware Proceednigs 2004.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 08:52

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表