游戏引擎中的粒子和声效系统

  • 粒子基础
  • 粒子渲染
  • GPU粒子
  • 粒子应用
  • 声音基础
  • 三维音频渲染

粒子基础

粒子系统里有各种发射器(emitter),发射器发射粒子(particle)。

  • 粒子是拥有位置、速度、大小尺寸、颜色和生命周期的3D模型。
  • 粒子的生命周期中,包含产生(Spawn)、与环境交互以及死亡。设计中很重要的一点是要控制场景中粒子的数量。
  • 粒子发射器有三个作用:
    – 具体规定粒子产生的规则
    – 具体规定粒子模拟的逻辑
    – 描述如何渲染粒子
  • 粒子系统经常有不止一类发射器,比如火堆这个系统中有火焰、火星和烟雾三种发射器
  • 关于粒子的产生,位置上可以分为单点产生、在区域上产生和在mesh上产生三类;在模式上也可以分为连续产生和间歇性产生等
  • 粒子的模拟:
    1、常规的受力

    2、粒子如何变动,一般使用显式欧拉法就行。受力状态决定加速度,决定速度的更新,速度决定位置的更新
    3、模拟时,除了重力,还可以加上粒子的旋转、颜色的变化、大小的变化以及和环境的碰撞等
  • 粒子的形状一般有三类:
    1、Billboard Particle。这种粒子由一些面片构成,其形状其实只有一面,但它始终保持面向摄像头,所以看起来是一个3D的粒子。如果这个particle比较小就无所谓,但如果比较大的时候建议是其形状也会随时间而变化,不然比较假
    2、Mesh Particle。要模拟散的碎的粒子时往往直接用3D mesh当做粒子,然后给它们设置各种不同类别的随机属性,从而艺术家也更容易实现想要的效果
    3、Ribbon Particle。样条形粒子,其实粒子是样条上的控制点,然后通过连接获得完整的条状。往往使用在比如武器挥舞的残影之类的地方。在控制点连接过程中需要插值,不然每一个连接点间的形状是不连续的(看起来像一个个四边形拼在一起)。一般使用向心的catmull-rom插值(在粒子间加入额外的分割块且数量可自己选定,不过对CPU要求会变高)

粒子渲染

常见的透明融合问题在粒子渲染处也需要解决,排序一定要从远到近。
粒子排序有两种方式,一种是全局法,完全按粒子个体来排序,很精准但消耗巨大;另一种是按层级,从简单到复杂的排序是依照粒子系统排序、依照emitter排序和在emitter之内排序。
具体来说,如果依照粒子排序,则按粒子离相机的距离排序;如果按系统或发射器排序,则按Bounding box排序。

另一方面,粒子渲染会带来巨大消耗的原因是“全分辨率粒子”。当我们渲染普通场景时,由于Z-buffer的帮助,其实只需要渲染接触到的场景的第一个物体(其他被遮挡不需要渲染),但粒子效果有时候(最差情况下)会在一瞬间产生叠满整个分辨率好多层的粒子,而且它们不存在完全遮挡关系,所以相当于一下子要进行超大量的渲染。
解决方案是:
降分辨率下采样进行粒子的渲染,此时与原场景无关,获得粒子的颜色和透明度alpha。然后再上采样融合到原场景中。

GPU粒子

从上面的所述可以看到,粒子计算功耗很大,所以放到GPU中是一个解决方案,原因有三:

  • 高并行运算,适合大量粒子的模拟计算
  • 可以释放CPU功耗来进行游戏本身计算
  • 方便获得深度缓冲来做遮挡判断

但有一个难点是粒子拥有生命周期,会不断产生消失,所以如何在GPU中实现粒子是一个难点 。

解决方案:

  • Intial State
    先建立一个粒子池,设计一个数据结构,设定系统包含的粒子总数量,每个粒子的位置、速度等。再有两个list,一个是Dead List,记录当前死亡的粒子,初始时包含所有粒子序号,还有一个是alive list,记录当前活着的粒子,初始时为空。
    比如emitter发射了5个粒子,则从池子结尾取5个粒子(序号)放入alive list,同时把dead list的后5个序号清空。

  • Simulate:
    当时间跳转到下一次tick时,会新建一个alive list1,并依序检索alive list中的粒子,如果发现某个粒子死亡了,就会把这个粒子序号移到死亡列表中,并且在渲染时也跳过这个粒子,如果仍存活就照抄到alive list1中。
    这个操作因为compute shader的发明变得容易,因为compute shader可以进行原子级操作。
    同时,在更新完活着的粒子之后,还可以利用GPU进行frustum culling视角剔除(针对活着的粒子),并且计算它们的距离,写入距离buffer。

  • Sort, Render and Swap Alive Lists
    接着,还需要进行排序、渲染和交换alive list:
    1、排序。根据距离buffer对活着的剔除后的粒子排序
    2、渲染。对排序后的粒子渲染
    3、交换。交换alive list1和alive list,更新存活列表。

  • 具体来说排序。GPU的排序类似归并算法,复杂度为nlogn。采取的方式是针对目标序列(排序后)的每一个位置设置一个线程,考虑它应该从两个列表中哪个取得。这样做会比每个源列表位置一个线程去考虑插入到哪里更简单,因为后者会让“写过程”跳来跳去不连续 。

  • 同时利用深度缓冲还可以进行碰撞的检测,具体:
    1、把粒子的当前位置投影到上一帧的屏幕空间纹理坐标(相当于投影到上一帧相机坐标系?)
    2、读取上一帧的深度纹理图中的深度值
    3、检查1和2中的深度值,判断是否碰撞了但又没完全穿过去(厚度值会被用到)
    4、如果碰撞发生了,就计算碰撞表面法向和粒子反弹的方向

粒子应用

  • 直接利用粒子来模拟物体,比如鸟群、大地图下行走的路人(因为很小),此时同样也有骨骼,但基本上每个顶点只受一个节点限制(简化版人体)。
    在这种情况下,我们可以把原本一个例子的加速等行为换成更复杂的人体姿态动作,相当于每个particle设置了一个状态机。我们把这个particle的各种状态和对应的速度等属性的情况设置成一张纹理图。当particle的属性变化时就从纹理图中找到对应的状态不断切换。
  • Navigation Texture。在上述基础上,可以利用一个粒子一个人来模拟一个导航纹理图。具体来说,利用SDF来避免人走入建筑物内,然后依次也可以设定一个方向纹理图,当我们给一个粒子设定目的地和初始速度后,它会根据DT的场驱动着往目的地走。当然,过程中可以加一些随机性。

    粒子系统在游戏中的应用早起是“预设型”,即在最初就设定好particle可能的行为,并用stack来表示和存储;后来又有“基于图“的设计,减少代码量增加灵活性;最好的是两者混合型,如下图:

声音基础

懒得写了…感觉不如看视频,很碎

三维音频渲染

懒得写了…感觉不如看视频,很碎

Games104 Lecture 12 游戏引擎中的粒子和声效系统相关推荐

  1. Games104 Lecture 4 游戏引擎中的渲染实践

    游戏引擎中的渲染实践 概览 渲染系统的对象 GPU 架构 数据流 Cache GPU Bound 渲染 Renderable Resource Pool 可见性裁剪 纹理压缩 建模工具 新的渲染管线 ...

  2. Games104现代游戏引擎入门-lecture12游戏引擎的粒子和声效系统

    Games104现代游戏引擎入门-lecture12游戏引擎的粒子和声效系统 1 粒子系统 1 粒子系统的历史 2 粒子系统的概念 1 位置,速度,大小,颜色,生命周期. 2 粒子系统的生命周期: 3 ...

  3. Games104 Lecture 8 游戏引擎的动画技术基础

    游戏引擎的动画技术基础 动画技术的基础 2D游戏动画技术 3D游戏动画技术 Rigid Hierarchical Animation Per-vertex Animation 顶点动画 Morph T ...

  4. Games104 Lecture 2 游戏引擎的层级架构

    目录 游戏引擎层级介绍 1 Resource Layer 资源层 1.1 资源的获取和寻找 How to Access My Data 1.2 实时资产管理 Runtime Asset Manager ...

  5. 上个时代的3A游戏,使用的是什么光照技术?| GAMES104实录 - 现代游戏引擎:从入门到实践

    本期为GAMES104<现代游戏引擎:从入门到实践>视频公开课文字实录第16期.本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发. 课程 ...

  6. 设计渲染系统,为什么要特别关注“显卡”? | GAMES104实录 - 现代游戏引擎:从入门到实践

    本期为GAMES104<现代游戏引擎:从入门到实践>视频公开课文字实录第11期.本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发. 课程 ...

  7. 理解绘制系统,记住四点就够了 | GAMES104实录 - 现代游戏引擎:从入门到实践

    本期为GAMES104<现代游戏引擎:从入门到实践>视频公开课文字实录第13期.本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发. 课程 ...

  8. 3D游戏的照明设计理论,第4部分:如何在游戏引擎中照亮游戏世界

    从更一般和更概念的角度来看,这是有关我如何处理游戏照明的系列文章的一部分.我在Unity中构建了大部分示例,但这通常适用于任何3D游戏引擎,其中大多数具有类似的照明工具. 我们开始思考了有关光照的文化 ...

  9. 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别

    游戏引擎中的实时渲染和在V-Ray中渲染有什么区别,下面我们一起来分析一下,从2个方面来具体分析实时渲染和在V-Ray中渲染种的不一样的区别. 原理区别 VRay等渲染器原理上叫做离线渲染(Offli ...

最新文章

  1. centos下为firefox安装flash插件的几种方法
  2. 这家中国芯片公司年利润追上英伟达了?假的
  3. 测试的目的_为什么需要测试?(软件测试的目的)
  4. python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例
  5. Java基于FTPClient上传文件到FTP服务器
  6. H. Fight Against Monsters
  7. aspnet是前端还是后端_项目开发中无法回避的问题:前端和后端如何合作和并行工作?...
  8. python中时间处理_Python中处理时间的几种方法小结
  9. 《Java编程思想》第四版读书笔记 第四章
  10. vmware server激活码
  11. 光谱共焦测量原理是什么
  12. java线程池正确使用姿势
  13. ckplayer.js插件基于网页flash播放rtmp、hls
  14. 时间复杂度和空间复杂度
  15. ie地址栏不能识别中文参数(google浏览器是正常的)
  16. 自动白平衡也即:color constancy (色彩恒常)研究总结
  17. 10.Report\1.SinglePinNetReport
  18. Echarts图表数据变动后重新渲染
  19. 网易数帆基于 Kubernetes 的 Redis 云原生实践综述
  20. liunx学习笔记之--磁盘与文件系统管理

热门文章

  1. 百度站长工具 加广告 代码分析
  2. 数据分析两场NBA比赛结果!大数据+NBA=?
  3. vs2019 fatal error C1090: PDB API “3“
  4. No provider available from registry localhost:9090 for service
  5. 深入解读逻辑回归LogisticRegression:适用于初学者
  6. onlyoffice转换html,CentOS7安装onlyoffice实现word的在线预览和编辑
  7. 三国志战略版:Daniel_S6新武锋_司马魏枪
  8. fixture 'xxx' not found
  9. 美国全国就业普遍低迷“技术”就业却加速增长;爱立信发布2030年10大消费者趋势 | 美通社头条...
  10. java用代码实现星期菜谱,基于jsp的家庭食谱管理-JavaEE实现家庭食谱管理 - java项目源码...