opengl 粒子系统设计?

更新时间:2024-05-09 下载TXT文档 下载Word文档

我正在设计自己的粒子系统引擎,这是出于学习目的,我真的不想使用现有的引擎。

现在,我生成了漂亮的粒子,但我想对引擎进行布局以使其更易于使用。

我一直在考虑一个类"粒子系统",

该类将包含以下引用:

particleList:组成系统的粒子列表。

systemEmitter:粒子的系统发射器,Emitter类应该能够执行多种粒子发射技术,例如从线,点发射,从多边形随机发射。另外,此类还应进行发射控制,例如在要发射的方向和时间上朝着点发射,远离点发射。

粒子控制器:管理例如围绕一个点的旋转,可变的粒子大小,可变的粒子颜色,粒子在系统周围以不同方式反应的区域,碰撞检测(必要时与其他对象或粒子内部)。

粒子渲染器:负责绘制此系统,可变混合类型,粒子纹理,粒子类型(例如三角形,圆形,自定义...)

这四个项目,将组成粒子系统类。某些FX可能需要一个以上的粒子系统,例如Fire FX,可能使用一种系统来灭火,使用一种系统来烟和使用一种系统来火花。

这就是我的想法,但我真的很想知道这种设计方法是否不错,或者您是否发现我遗漏了某些东西或者可以/应该做一些不同的事情。我还没有考虑过"保存" FX的简便方法,例如,告诉引擎的最佳方法是"引火","爆炸","喷泉"等等,也许可以存储FX信息。在xml文件中将是一个好主意,等等。

意见真的很受欢迎,正如我之前所说,出于学习原因,我真的想构建它,而不是使用另一个引擎。

这种设置应该很好。我希望您正在考虑的是什么数据将构成粒子类中的粒子。您只需要基本的知识,因此在运行系统时只需要读取/写入尽可能少的内存。

就使它成为数据驱动的而言,应该很简单。我建议使用xml和二进制格式的选项进行加载。因此您可以在开发时轻松调整内容(无需工具)。一旦有了工具或进行了调整,我将xml转换为二进制文件以便快速加载。

您可能还需要管理器类来处理这些粒子系统的创建和更新。这也将使您能够处理与所有系统有关的其他功能。这样的一些示例限制了出于性能原因或具有所有系统都应考虑的碰撞平面而可以管理的粒子系统或粒子的数量。

您提到这是出于教育目的,在这方面,这些内容非常挑剔(但如果您要在颗粒重的游戏中使用它,则很重要)。

我假设这使用的是DirectX或OpenGL之类的API进行渲染。在这方面,我希望所有粒子效果共享相同的内存池以存储您的顶点信息。这对渲染速度有很大帮助。我还将跟踪受视锥系统(AABB或Circle)使用的粒子系统影响的区域的边界。

更新粒子系统的很大一部分是属性如何从一个值变为另一个值。您可以使值插值越动态,效果就越好。简单地线性插值可能就足够了,但是最好使用一个动态图来插值。例如,与其在一秒钟内从0变为255蓝色,不如在0.2秒内从0变为128,然后在0.8秒内从128至255变凉。添加这些将大大增加效果效果的选项。 {短码网-DuanMa.NET}

除此之外,我认为您对自己想做的事情有一个很好的主意。您提到的渲染不同类型的粒子告诉我您正在以正确的方式考虑这一点。我见过人们制作粒子引擎只是专注于渲染广告牌四边形。可以发出3d几何图形的选项确实使事情看起来很棒。您可能还想考虑(如果尚未使用)系统具有获取模型信息并将其动态拆分为要发射的单独粒子的能力。实际上,爆炸模型看起来比显示一些爆炸粒子并使物体褪色或将其切换到损坏状态要好得多。

  • 感谢您的回应!是的,我正在考虑使用OpenGL渲染此内容。 非线性插值的想法也非常好,并且应该能够用它创造出一些不错的视觉效果。

我已经为自己的C ++引擎实现了相同的良好设计。我没有使用引用和模板策略(策略-请阅读Alexandresku的"现代C ++设计")。静态多态性可提供更好的性能。

只是一些简单2D精灵粒子优化的想法。

一个好主意是将所有粒子发送到顶点数组/ VBO中,并使用顶点着色器随时间更新其位置。如果您有一个简单的动作,可以轻松地使用数学公式(其中x(t)y(t)(即它们仅取决于时间))来描述,那就太好了。

另一个好主意是使用点精灵而不是三角形和四边形。这会将管道所需的带宽减少到四分之一。

在我的太空模拟中,我实现了最简单的方法:使用glBegin() / glEnd()将粒子作为纹理四边形发送。它们作为单个对象被丢弃到当前的"扇区"中,并且与以后的转储时间完全独立。这是最原始,最愚蠢和最愚蠢的事情,并且会导致性能大大降低,尤其是因为我所做的事情是通过STL向量的迭代器遍历对象并依次发送每个对象。

您需要考虑要多少个粒子,以及它们要做什么。
*您是否希望他们对周围环境做出反应并发生碰撞?然后,您需要在CPU上处理更新并一遍又一遍地发送数据。
*他们是否以最愚蠢的方式飞来飞去?这样一来,您便可以将所有粒子作为VBO和TBO发送,并在着色器中对其进行更新。

玩得开心!

更新为与来自asker的评论#1有关:-)

我要做的就是使用KISS原则。这意味着:一个名为ParticleEmitter的类,其中包含一个顶点数组,一个速度数组以及一个STL vector,其中包含简单碰撞器(例如平面,球体,三角形)的实例。此外,还有一个具有对撞机的"全局" * STL vector。然后根据对撞机更新速度。

可以使用效应器(重力,风等)执行类似操作:ParticleEmitter中的另一个STL矢量(具有效应器)和另一个"全局" STL vector(具有效应器)。

事务和对撞机将是实现affectParticle(particle_t*)的类。其中struct particle_t { float x,y,z; float vx,vy,vz; }。我将其保留为POD结构,并在ParticleEmitter::update()中运行更新。

但是,如果您在iPhone上运行此程序,可能会过于复杂吗?也许您可以摆脱已经实施的东西?我不知道我的设计会如何影响基准测试结果,但是如果您将粒子,对撞机和效应器的计数降低,听起来对我来说就足够合理了,因为听起来它可能会缩放大约n*c+n*a

这些只是我的临时想法,以及我个人如何实现的想法。您的设计或其他人的设计可能会更好:-)

*用引号引起来的" Global",因为利用您正在使用的任何空间分区可能很有意义。

  • 您好Ivan,感谢您的回答,现在我正在iPhone上开发此系统,自从达到使用VBO渲染3.000 16x16像素GL_POINT_SPRITES并达到45-55 fps的里程碑以来,我取得了不错的进步。 我认为那还不错。 但是,现在我想开始研究粒子如何与其他对象相互作用和碰撞,并在某些方面进行了思考,但是我真的很想听听有关它的一些想法。 再次感谢。

我想根据我的经验发表一些意见。

  • 传统上,大多数粒子使用AOS(结构数组)存储粒子属性。但这可能不是最好的决定。使用SOA(数组结构)表示形式将为您添加每个粒子系统的属性提供很大的灵活性。而且,使用带有SOA的SIMD可以更轻松地提高性能。例如,使用SSE指令一起处理4个粒子。
  • 粒子发射的位置仅是一个粒子属性的初始化。发射粒子时,可能需要初始化其他属性,例如寿命,速度等。您可以将所有这些特征抽象为初始化器。对于位置,您可能具有磁盘初始化程序,盒初始化程序等。
  • 一些现代粒子系统采用事件的概念。粒子系统可能会产生事件(例如,雨水与地形相撞),而其他粒子系统可以侦听并执行某些操作(例如,发出飞溅声)。
  • 顺便说一句,我认为最好的方法是研究现有应用程序/中间件的设计,并进行试验。

    以上就是短码网小编为大家整理的《opengl 粒子系统设计?》相关内容,希望大家喜欢。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

    如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

    opengl 粒子系统设计?》文档下载仅供参考学习,下载后请在24小时内删除。

    转载注明出处:https://www.duanma.net/article/35727611642.html

    回到顶部