基于GPU 的游戏粒子系统设计
GPU支持下基于粒子系统编辑器的特效技术研究

中图分 类号 :T 9 .1 P3 1 4 文献 标识 码 :A
A t y o e i l f c i ul to s d o S ud fSp ca e tS m a i n Ba e n Ef G PU-uppo tngPa tceS se Edior s r i ri l y t m t
a p o c sp o o e ae n p r ces se e i rs p otd b U. e c n r l bl f p r a h i r p s d b sd o at l y tm dt u p re y GP Th o t l it o i o o a i y
s t m mp o st ee c e c fs c a fe t sg o o yse i r ve f in y o h i pe i l e c i n f rc mpu e a sg e ty de t rg me r al .
Ke r s o u e p l ai n a i l y tm ;s e i le f c ;p r c e s se e i r y wo d :c mp tr a p i t ;p r c e s se c o t p ca fe t a i l y t m dt ; t o
提 高大规模 粒 子 系统渲 染 的 实时性 。 实验 证 明,G U 支持 下 的可编辑 粒 子 系统 能有 效提 升 P
计算机游戏开发 中的特效设计效率并获得理想效果 。
关 键 词 :计 算机应 用 ;粒 子 系统 ;特效 ;粒 子 系统 编辑 器;XB X3 0 O 6
文 章 编 号 :1 0 —1 82 1)60 7 —5 0 30 5 (0 10 —0 70
Abs r t t ac :W i t e is e t a r diina pe i le f c i l to i a tce s se i t h s u h tta to ls ca fe tsmu a i n usng p ril y t m n h
XNA环境下粒子系统特效集成程序的实现

XNA环境下粒子系统特效集成程序的实现摘要:本文介绍了粒子系统的基本原理,针对视景特效进行分析建模,而后利用面向对象技术与广告板技术使视景特效模块化,形成了一个简单易用、容易扩展的粒子系统视景特效模块,可方便地与游戏引擎模块整合。
文中给出了粒子系统视景特效层次结构关系的建模实现,通过面向对象技术,对粒子系统视景特效进行集成与封装,最后使用XNA Game Studio对一些具体视景特效(如,雨水、雪花、喷洒等)进行生成并组件化。
关键词:XNA 粒子系统游戏引擎视景特效近年来,随着计算机硬件性能的不断提高,人们已经不再满足于简单的二维视景,三维视景因其逼真的显示效果、虚幻的立体场景画面,已逐步取代了二维视景的地位,成为市场上的主流。
目前,已有许多基于不同平台且利用粒子系统模拟自然现象的研究工作。
例如,OSG的粒子特效仿真[1]、基于OGRE粒子系统及供用户选择虚拟特效的实现[2]、基于OpenGL的3D粒子特效系统设计与实现[3],也有XNA中基于GPU的太阳风粒子系统的模拟[4]、XNA中基于素材管道的粒子系统设计与实现[5]和XNA环境下粒子系统的飘雪仿真[6]。
OSG和OGRE均是使用OpenGL技术开发的应用程序接口(API),OpenGL技术是基于C++平台的。
相对于.net平台下XNA技术来说,其开发周期比较长,程序比较复杂,难于掌握。
在XNA环境下也曾有利用粒子系统来模拟自然现象,但其大多数都是针对某一种自然现象进行仿真模拟,本文在XNA环境下利用C#语言面向对象的继承和多态特性,实现了雨、雪和喷射等多种自然现象综合模拟仿真的实现。
粒子系统是目前游戏引擎研究领域的热点之一,也在军事模拟仿真视景系统得到了重要应用。
粒子特效系统是游戏引擎的重要组成部分,而创建特定的粒子系统是一个比较复杂的过程,不仅要考虑如何让粒子更真实地反映现实,而且需要对大量的粒子属性进行管理。
本文基于粒子系统的基本原理,使用面向对象的方法与XNA Game Studio 开发工具,利用XNA框架设计了一套基本的粒子系统引擎,其中定义了基本的数据结构、用于高级着色语言(High Level Shader Language,HLSL)的顶点格式等,并将其封装成一个动态链接库(Dynamic Link Library,DLL),从而达到简单易用、管理简便和快速生成粒子特效的目的。
游戏特效设计师招聘面试题及回答建议(某大型集团公司)

招聘游戏特效设计师面试题及回答建议(某大型集团公司)面试问答题(总共10个问题)第一题题目:请描述一下在游戏开发过程中,特效设计的主要作用是什么?此外,请举一个具体的例子说明特效如何增强玩家的游戏体验,并解释在这个例子中特效的具体实现方式。
答案示例:特效设计在游戏开发中的主要作用是提升视觉效果,增强游戏的真实感与沉浸感。
良好的特效不仅能够美化游戏界面,还能帮助玩家更好地理解游戏内的事件,如攻击效果、技能释放、环境变化等。
此外,特效还能强化游戏的情感表达,让玩家更加投入到游戏中,从而提高游戏的吸引力和可玩性。
例如,在一款动作角色扮演游戏中,当玩家使用特定技能对敌人造成伤害时,可以通过粒子系统实现火焰、闪电或者冰霜的效果。
这些特效不仅仅是为了美观,更重要的是它们能够直观地告诉玩家技能是否命中目标以及造成的伤害类型。
此外,通过调整粒子的颜色、大小、速度和生命周期等属性,可以创造出不同的视觉风格,进一步加强游戏世界的独特氛围。
比如,为了表现一个寒冷区域的BOSS战,可以加入飘落的雪花、冰晶碎裂的动画以及寒气凝结的效果,这不仅丰富了战斗场景,也使得玩家能够更加身临其境地感受到战斗的紧张刺激。
解析:这个问题旨在考察应聘者对于特效设计在游戏开发中重要性的理解,以及他们能否将理论知识应用于实践的能力。
一个好的回答应该包括特效设计的基本功能及其对玩家体验的影响,并且能够提供一个具体而生动的例子来证明这一点。
此外,通过解释特效是如何实现的,还可以展示应聘者对于技术细节的掌握程度以及创造力。
第二题题目:请描述一次您在游戏特效设计过程中遇到的一个挑战,以及您是如何克服这个挑战的。
答案:在我之前参与的一款动作冒险游戏中,设计一个关键剧情节点中的爆炸特效是我面临的最大挑战。
这个特效需要表现出巨大的破坏力,并且要与游戏的整体氛围和剧情相契合。
以下是我在这个挑战中的应对策略:1.研究参考:首先,我查阅了大量的电影和游戏中类似爆炸特效的案例,分析了它们在视觉和听觉上的处理方式,以及如何与场景和剧情结合。
基于GPU的并行程序设计幻灯片

-9-
1.1 GPU体系构造的演变
顶点 生成 VG
顶点 处理 VP
shader函数
图元 生成 PG
图元 处理 PP
片元 生成 FG
片元 处理 FP
像素 操作 PO
顶顶
全纹
顶
全纹
全纹
输
点点
局理
点
局理
局理
出
描数
缓
拓
缓
缓
图
述据
存
扑
存
存
像
缓
存
Memory Buffer
〔2〕可编程的GPU构造及图形绘制流水线
:// nvidia /object/cuda_develop.html 2.M. Pharr (ed.), GPU Gems 2 〔Programming
Techniques for High Performance Graphics and General-Purpose Computation〕, Addison Wesley, 2005. :// .developer.nvidia /GPUGems2/gpugems2_part01.html〔英文电 子在线阅读〕
-4-
引言
参考资料
3. GPU高性能运算之 CUDA
张舒,褚艳利 中国水利水电出版社 2021年10月
-5-
内容
1.引言 1.1 GPU体系构造的演变 1.2 GPU编程模型的演变 2.CUDA编程模型 3.CUDA并行编程例如
-6-
1.1 GPU体系构造的演变
顶点处理 (VP)
光栅化 (Rasterization)
片元 处理 FP
像素 操作 PO
〔1〕传统的GPU构造及图形绘制流水线 fixed-functionMGePmUo〔ry功Bu能ff固er定的GPU〕
gpu粒子群算法 matlab

gpu粒子群算法 matlabGPU(图形处理器单元)粒子群算法在MATLAB中的应用是一个相对复杂的问题,需要从多个角度来进行讨论。
首先,让我们来谈谈GPU加速。
在MATLAB中,可以使用Parallel Computing Toolbox来利用GPU加速算法。
粒子群算法作为一种基于迭代的优化算法,可以通过并行化加速来提高计算性能。
在MATLAB中,可以使用GPUArray来将数据传输到GPU上进行并行计算,从而加速粒子群算法的执行。
这种方法可以显著提高算法的运行速度,特别是在处理大规模数据时。
其次,需要考虑粒子群算法在GPU上的实现。
在MATLAB中,可以使用内置的粒子群优化函数(如particleswarm)来实现粒子群算法。
通过将数据和计算迁移到GPU上,可以利用并行计算的优势来加速粒子群算法的执行。
需要注意的是,对于一些特定的问题,需要对粒子群算法进行适当的调整和优化,以便在GPU上获得更好的性能表现。
此外,还需要考虑到GPU编程的复杂性。
虽然使用GPU加速可以提高算法的性能,但是GPU编程相对复杂,需要考虑到数据传输、内存管理以及并行计算等方面的问题。
在使用GPU加速粒子群算法时,需要仔细考虑算法的并行化实现,以及如何最大限度地利用GPU资源来提高算法的性能。
总的来说,GPU粒子群算法在MATLAB中的应用涉及到GPU加速、算法实现以及并行计算等多个方面。
通过合理地利用GPU资源,可以显著提高粒子群算法的执行效率,特别是在处理大规模数据和复杂优化问题时。
然而,需要注意到GPU编程的复杂性,以及对算法进行适当的调整和优化,才能充分发挥GPU加速的优势。
基于GPU的游戏粒子系统设计

M MO
—
P ril 示 使 用 MMO一 算 的 最 终 生 成 面 a t e表 c 计
炸 、 、 流 、 花 、 叶 、 、 、 、 、 星 尾 迹 或 者 象 发 烟 水 火 落 云 雾 雪 尘 流 光 轨 迹 这 样 的抽 象 视 觉 效 果 等 。 粒 子 系 统 的 实 现 : 每 个 粒 子 是 一 个 带 纹 理 的 三 角 ① 形 / 边 形 , 子 系 统 由 多 个 粒 子 组 成 ; 粒 子 按 一 定 规 多 粒 ② 则 运动 ; 每个粒 子有 自己的属 性 , 位置 、 度 、 量 、 ③ 如 速 质
肯 定 许 多人 会 问 , G U 不 是 比 C U 更 复 杂 吗 ? 其 用 P P 实 恰 恰 相 反 , P 的粒 子 比 C U 简 单 得 多 。引 擎 中 的 粒 G U P 子 必 须 要 有 模 拟 器 、 射 器 、 、 制 器 还 需 要 多线 程 调 度 发 力 控 任 务 , 谓 庞 大 复 杂 。 而 G U 粒 子 只 需 要 一 个 MM0 可 P 一
摘 要 : MMOR G游戏 中经常 出现 同屏显示成 千上 万的粒子 特效 , 统引擎 虽然使 用多线程 来计 算粒子的运动 , 在 P 传
但 是 也 很 难 应 付 大规 模 的 计 算 量 ( 虑 到 一 般 配 置 ) 更 何 况 MMOR G 中还 空 出许 多 C U 去 处 理 逻 辑 。提 出基 于 考 , P P
多 的 粒 子 控 制 器 , 时 提 供 与 外 部 交 互 的 接 口以 用 于 实 现 同
尺寸、 年龄 、 运动轨迹斜率 、 色等 ; 颜 ④粒 子系统更新循环
划 分 为 两 个 不 同的 阶段 : 数 更 新 / 拟 阶 段 以及 渲 染 阶 参 模
particle effect for ugui原理-概述说明以及解释

particle effect for ugui原理-概述说明以及解释1.引言1.1 概述粒子特效在游戏开发中起着重要的作用,能够为游戏场景增添丰富多彩的视觉效果。
在Unity引擎中,通过使用Particle System组件,开发者可以轻松实现各种炫酷的粒子特效,包括火焰、爆炸、烟雾等。
而UGUI (Unity GUI)作为Unity中的UI系统,常用于开发游戏中的界面和交互元素。
本文将重点探讨粒子特效在UGUI中的应用,介绍如何利用Particle System组件结合UGUI实现各种炫酷的效果。
通过深入了解粒子特效在UGUI中的原理和实现方式,能够帮助开发者更好地运用这一技术,为游戏的视觉效果增添亮点。
1.2 文章结构文章结构部分的内容如下:文章结构部分将会介绍本文的具体内容安排,主要包括三个部分:引言、正文和结论。
引言部分将从概述、文章结构和目的三个方面介绍本文的主题和研究意义。
正文部分将详细介绍粒子特效的概念及其在UGUI中的应用,以及Particle System组件与UGUI的结合方法。
结论部分将对本文的主要内容进行总结,并分析粒子特效在UGUI中的优势与不足,同时展望未来该领域的发展方向。
1.3 目的粒子特效在游戏和交互界面设计中起着非常重要的作用,能够为用户提供更加生动和视觉上吸引人的体验。
而在UGUI中,如何有效地应用粒子特效也成为了许多开发者关注的焦点之一。
本文旨在探讨在UGUI中实现粒子特效的原理和方法,帮助读者了解如何将粒子特效无缝地应用到UGUI界面中,提升用户体验和界面效果。
通过本文的学习,读者将能够掌握使用Particle System组件结合UGUI的技巧,灵活地运用粒子特效来丰富界面的设计和交互效果。
2.正文2.1 粒子特效简介:粒子特效是一种通过模拟粒子系统的运动和交互来达到一定视觉效果的技术。
在游戏开发和电影制作中,粒子特效常常被用来模拟火焰、爆炸、烟雾等自然物理现象,以及表现各种特殊效果和动画效果。
游戏特效设计师招聘笔试题及解答(某大型集团公司)

招聘游戏特效设计师笔试题及解答(某大型集团公司)(答案在后面)一、单项选择题(本大题有10小题,每小题2分,共20分)1、以下哪个软件不是目前主流的游戏特效设计工具?A、Adobe After EffectsB、Unreal EngineC、MayaD、Photoshop2、在游戏特效设计中,以下哪个概念与“粒子系统”最相似?A、骨骼动画B、光照效果C、材质纹理D、粒子动画3、在Unity中,如果你想创建一个基于物理的特效,比如火焰或者烟雾,你可能会使用以下哪种组件?A. Particle SystemB. AnimatorC. RigidbodyD. Collider4、当设计游戏中的魔法特效时,为了使特效看起来更加生动和真实,通常会结合使用哪两种技术?A. 顶点动画与纹理贴图B. 粒子系统与着色器C. 骨骼动画与刚体动力学D. 光照探针与环境遮挡5、某游戏特效设计师在制作火焰特效时,需要使火焰呈现出自然、流畅的动态效果。
以下哪种技术或工具最适用于实现这一效果?A. 3D建模软件B. 纹理编辑器C. 动画软件D. 游戏引擎6、在游戏特效设计中,以下哪项不是影响特效表现力的关键因素?A. 动态范围B. 精细程度C. 时间感D. 色彩搭配7、下列哪一项不是粒子系统的主要用途?A. 创建火焰效果B. 创建水流效果C. 创建地形D. 创建烟雾效果8、在Unity引擎中,为了实现更真实的雨滴效果,以下哪个组件最有可能被使用?A. RigidbodyB. ColliderC. Particle SystemD. Animator9、在游戏特效设计中,以下哪项不是常用的三维特效类型?()A、粒子特效B、光线追踪特效C、2D动画特效D、流体动力学特效 10、以下关于游戏特效设计师的技能要求,哪项不属于基本技能?()A、熟悉3D建模软件B、了解游戏引擎原理C、具备良好的审美能力D、精通编程语言二、多项选择题(本大题有10小题,每小题4分,共40分)1、在游戏开发中,使用粒子系统来实现特效时,可以调整哪些参数来优化粒子的表现效果?A. 粒子的数量B. 粒子的形状与纹理C. 粒子的发射速度与方向D. 粒子的生命周期E. 粒子的颜色变化F. 粒子的重力加速度G. 粒子之间的相互作用H. 粒子的碰撞检测2、为了实现高质量的游戏特效,除了粒子系统外,还可以运用哪些技术手段?A. 模型动画B. 纹理贴图C. 光照计算D. 声音效果E. 深度缓冲F. 后处理效果G. 硬件加速H. 动态模糊3、以下哪些技术是游戏特效设计师在创作游戏特效时常用的?()A. 3D建模B. 2D动画C. Unity Shader编程D. Python脚本E. Maya动画4、在游戏特效设计中,以下哪些原则是确保效果流畅性和真实性的关键?()A. 时间控制B. 动力学模拟C. 材质和纹理的优化D. 负载平衡E. 用户交互设计5、在使用Unity进行游戏特效设计时,以下哪些方法可以用来优化粒子系统的性能?(多选)A. 减少同时活跃的粒子数量B. 降低粒子的生命周期C. 使用GPU粒子系统代替CPU粒子系统D. 增加粒子系统的发射速率6、关于游戏特效中的色彩理论应用,下列说法正确的是?(多选)A. 冷色调往往给人以平静、远离的感觉。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于GPU 的游戏粒子系统设计摘要:在MMORPG游戏中经常出现同屏显示成千上万的粒子特效,传统引擎虽然使用多线程来计算粒子的运动,但是也很难应付大规模的计算量(考虑到一般配置),更何况MMORPG中还空出许多CPU去处理逻辑。
提出基于GPU进行粒子计算的粒子系统,利用GPU的并行计算多个对象,实现并行化高效的粒子系统。
关键词:粒子系统;GPU;并行计算1 系统原理在游戏设计中,基于粒子系统可以实现火、爆炸、烟、云、雾等效果。
粒子系统主要用来解决由大量按一定规则运动(变化)的微小物质组成的大物质在计算机上的生成与显示的问题。
经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等。
粒子系统的实现:①每个粒子是一个带纹理的三角形/多边形,粒子系统由多个粒子组成;②粒子按一定规则运动;③每个粒子有自己的属性,如位置、速度、质量、尺寸、年龄、运动轨迹斜率、颜色等;④粒子系统更新循环划分为两个不同的阶段:参数更新/模拟阶段以及渲染阶段;⑤参数更新/模拟阶段根据粒子系统信息更新每个粒子的速度、位置、尺寸、颜色等信息;⑥渲染阶段根据粒子属性重新绘制粒子;⑦每个粒子都有自己的生命,年龄超过最大年龄的粒子会被销毁,系统会生成新的粒子。
2 系统设计2.1 框架分析ParticleFactory是粒子工厂类,负责创建和销毁粒子,同时管理了当前创建的粒子。
Iparticle为粒子的接口类,所有粒子都从它派生出来,它定义了粒子的基本接口:Play、Stop、GetProperty和SetProperty。
MMO_Particle表示使用MMO_计算的最终生成面片的粒子,MMO_MeshParticle表示使用MMO_计算的基于网格的粒子。
BaseGpuParticle表示使用GPU计算和更新粒子。
每一个粒子对象都有一个指向ParticleProperty类的指针。
ParticleProperty保存了粒子的属性参数,包括基本的颜色、大小、旋转角度等,还有受力、发射器。
多个粒子对象可以指向同一个ParticleProperty对象。
ParticleController是粒子控制器,它管理了引擎中众多的粒子控制器,同时提供与外部交互的接口以用于实现某些特殊的效果,比如武器划动的轨迹效果等。
2.2 CPU vs GPU传统游戏引擎提供的是基于CPU的粒子系统,但是考虑到MMORPG中有可能同屏显示成千上万的粒子特效,效率问题不能不考虑。
引擎中虽然使用多线程来计算粒子的运动,但是也很难应付大规模的计算量(考虑到一般配置)。
更何况MMORPG 中还有空出许多CPU去处理逻辑。
于是笔者想到了用GPU进行粒子计算。
肯定许多人会问,用GPU不是比CPU更复杂吗?其实恰恰相反,GPU的粒子比CPU简单得多。
引擎中的粒子必须要有模拟器、发射器、力、控制器还需要多线程调度任务,可谓庞大复杂。
而GPU粒子只需要一个MMO_SingleShaderMaterial和一个MMO_Mesh,不必担心GPU粒子的灵活性,笔者实现了3种GPU粒子效果:烟雾、火焰和龙卷风。
每一种都开放了大量可控参数,比如烟雾就有浮力、重力、风力、速度、扩散值、原始大小、目标大小、原始颜色、目标颜色还有纹理,其中纹理可包含多帧。
如此多的参数,是否需要很复杂的GPU程序呢?其实不然,在笔者的实现中,vertex shader的HLSL代码只有20行,pixel shader代码有4行。
Vertex shader使用vs1.1版本即可。
为什么代码会这么少?这是因为GPU编程与CPU编程是不同的,CPU 通常逐个计算单一对象,而GPU则是并行的流式计算多个对象。
当使用CPU编程时,总是想到建立一个缓冲然后创建粒子,保存属性,每帧更新,删除粒子等。
而GPU编程完全不同,它没有创建删除粒子,保存其状态的概念,也不能够创建缓冲来保存粒子的属性等。
在GPU编程中,处理好一个粒子就等于处理好多个粒子了。
但是GPU也并非没有缺点,比如GPU实现的粒子是很难互相访问数据的。
在游戏开发中,我们常常要在性能与效果上做出取舍。
笔者认为对于大部分常见的效果用GPU粒子就能做到简单高效,对于少部分特殊效果可以用的CPU模拟计算的粒子实现。
因此在粒子系统中,提供了BaseGpuParticle类,用于实现GPU模拟计算的粒子。
2.3 粒子的属性无论是CPU粒子还是GPU粒子,都可以有大量的属性参数,这些属性参数实际上不需要每个实例都保存一份,比如场景中许多相同的火焰,它们只是位置、转向、缩放值不同而已。
这一概念很类似场景的物体与物体的材质的关系。
因此粒子系统中统一把材质的属性做为ParticleProperty类管理。
许多参数不是固定的,也就是说可以加上或减去某项属性,比如某个力,可以加上也可以减去。
为了方便设置,ParticleProperty类并不需要手动的加入或删除某个力或发射器,而是直接设置力的大小,当力作用为0时自动把力删除,发现没有这个力时自动加上。
引擎中每一个粒子的属性可以有位置、颜色、线速度、角速度、大小、旋转角度、生命值、纹理坐标等。
这些数据存放在MMO_PSParticleSystem对象中,每一个MMO_PSParticleSystem 代表了一组一定数量的粒子,这个粒子的数据在MMO_PSParticleSystem对象创建时即被指定,并且创建后不能更改,同时MMO_PSParticleSystem对象中所保存粒子数据的缓冲在创建后也不会重新分配。
MMO_PSParticleSystem中提供了获取当前粒子数据缓冲的接口,但是并不提供线程安全的方法,如Lock、Unlock。
这是因为MMO_系统的运行机制是保证线程安全的。
但是当程序需要获取MMO_PSParticleSystem的数据时,要注意先调用ForceSimulationToComplete方法以保证所有粒子更新的线程任务已经完成了。
值得注意的是,粒子的位置属性可以分为世界坐标系或模型坐标系。
当指定为世界坐标系时,MMO_PSParticleSystem的位移(translation)与旋转(rotation)属性将不起作用,但是缩放(scale)值除外。
注意这并不意味着粒子不用乘以世界矩阵,只是世界矩阵为单位矩阵而已,原来的世界矩阵被存放在MMO_PSParticleSystem::m_kUnmodifiedWorld成员中。
缩放值的作用通过粒子生成器(MMO_PSAlignedQuadGenerator)实现而不是世界矩阵。
当使用模型坐标系时,粒子的位置属性与普通的网格一样。
注意这一点十分有用,比如场景中有相同十个火把,它们的更新过程是相同的,使用模型坐标系时需要一个MMO_PSParticleSystem对象就够了,可以通过改变位移、旋转和缩放值使火把看起来有些区别。
3 系统的实现3.1 网格类网格类(MMO_Mesh)表示引擎中一切由顶点和图元组成的网格,而粒子也不例外。
MMO_Mesh中管理了多个MMO_DataStreamRef对象;而MMO_DataStreamRef其实就是指向MMO_DataStream对象的智能指针;网格类的MMO_DataStream默认都为MMO_DX9DataStream,即每个DataStream绑定了一个D3D的Buffer,可以是顶点缓冲或索引缓冲,非D3D托管的Buffer会有一份在内存中的数据。
MMO_DX9DataStream::UpdateD3Dbuffers方法负责把内存中的数据更新到D3D的Buffer中,那么粒子系统只需更新内存中的数据,然后调用UpdateD3Dbuffer方法即可。
事实上引擎正是这样实现的,MMO_PSParticleSystem继承至MMO_Mesh,它把粒子的各种属性保存为独立的缓冲里,交给粒子模拟器去更新这些数据,更新结束后使用MMO_PSFacingQuadGenerator生成粒子的顶点与三角形,并将这些几何数据存入MMO_DX9DataStream中。
每次渲染时,MMO_Mesh一旦检测到MMO_DX9DataStream 的数据改动了(标志为Dirty),就调用UpdateD3Dbuffer更新D3D 的对应缓冲。
3.2 网格修改器面向对象的游戏自然不允许外部随意的更改MMO_Mesh 的数据。
实际设计中通过一个特殊的网格修改器类(MMO_MeshModifier)。
一个MMO_Mesh中可含有多个MMO_MeshModifier(最多7个),每一个MMO_MeshModifier 绑定到MMO_Mesh之后,就会将相应的MMO_SPTask的输入输出流绑定到MMO_Mesh的DataStream上。
实际上MMO_MeshModifier是一个虚基类,里面有几个重要的方法:MMO_MeshModifier::Attach:将自己绑定到MMO_Mesh上,同时初始化相应的MMO_SPTask,把相应的输入输出流也绑定到MMO_Mesh上。
MMO_MeshModifier::Detach:解除对MMO_Mesh绑定,同时也解除输入输出流的绑定。
MMO_MeshModifier:: SubmitTasks:将相应的MMO_SPTask 提交给MMO_,注意这里只是提交一些轻量级、可同步的单独任务。
如果需按顺序实现的任务,还得自己维护一个MMO_SPWorkflow。
MMO_MeshModifier:: CompleteTasks:强制完成任务。
这里会等待MMO_完成指定的任务。
需注意的是此函数在任务完成后并不更新D3D Buffer。
网格修改器为处理网格内部数据提供了便利,粒子系统中的粒子模拟器(MMO_PSSimulator)继承至网格修改器。
与一般网格修改器不同,模拟粒子的计算量大,因此粒子模拟器中由多个MMO_SPTask来完成计算任务,通过维护了一个或多个MMO_SPWorkflow来管理这些Task。
参考文献:\[1\] 张芹,吴慧中,张健.基于粒子系统的建模方法研究\[J\].计算机科学,2003(8).\[2\] 马骏,朱衡君.基于动态纹理和粒子系统的喷泉模拟[J].北京交通大学学报,2005(1).\[3\] MACEDONIA M.The GPU enters computing’s mainstream\[J\]. IEEEComputer,2003(10).。