当前位置:   article > 正文

BatchRendererGroup Shooter Demo 学习记录(一)_unity的batchrenderergroup

unity的batchrenderergroup

最近Unity最新版本推出了新的功能,Unity6加入了GPU Drive的东西,涉及到了BRG(BatchRendererGroup)的再封装,以前需要写好长的代码自己组织数据结构现在只需要点击一个勾选就行,也趁着这次更新与官方最近的Demo来对BRG做进一步的学习与记录

 项目整体可分为几个功能

1 - 背景板块的生成与动态移动

2 - 飞机子弹带动背景板块的上升与对敌人的碰撞

3 - 敌人生成与死亡时生成若干粒子

4 - 粒子物理效果与对背景板块的互动

其中粒子与背景板块是通过BRG来进行渲染的,该篇主要对该项目BRG部分进行整理记录

资料引用:在低端设备上实现高帧率!BatchRendererGroup示例详解 - 技术专栏 - Unity官方开发者社区 

 该项目BRG代码主要在Script目录下的BRG_Container脚本中在代码开头注释部分主要介绍背景块与粒子每个实例需要三个属性,obj2world world2obj color在BRG中矩阵部分并不是使用4个float4类型的matrix,而是使用3个float4类型的matrix

主要是为了减少传输的带宽

每个color为一个float4,也就是说一个实例总共需要(3+3+1)*16个字节的数据

对于BRG_Container这个类,背景版与粒子每个Manager都有其一个实例,也就是说他们是分开进行渲染的

先以粒子为例

每个敌人被攻击到时会生成1024个粒子

在BRG_Debris中有介绍,其中16是在游戏场景中有两个敌人生成器,一个生成4个敌人,一个生成12个敌人,这里乘以16是为了保证当所有敌人同时被攻击时能有足够的Buffer大小来进行渲染

在BRG_Container中第一个属性为一个bool类型的值,该值是为了兼顾GLES 3.0的问题,在引用文章中有对其的介绍,代码中也有对其的解释,GLES 3.0会使用UBO来作为BRG raw Buffer,需要分为几个窗口Buffer来进行多次渲染

接着则是其初始化方法,由于上述UBO的原因该方法分为两种情况执行

首先当使用CBuffer时也就是GLES 3.0时,先拿到CBuffer窗口最大的大小,接着除以每个实例所占的空间来算得每个窗口可以容纳多少个实例数据,之后计算出需要多少个窗口能渲染实例数最大时的情况以及总共GpuBuffer的大小,最后再进行实例化GraphicsBuffer,此时GraphicsBuffer每个空间间隔16字节,Target为Constant

上图中一组黄绿蓝为一个窗口,大小为16kib,由于最后一组窗口可能填不满之后会对其单独处理

当不是GLES 3.0时就使用一个足够大的raw Buffer来进行填装数据

在初始化之后则是对Matedata的处理

Matedata介绍 : DOTS Instancing shaders - Unity 手册 (unity3d.com)

在引用的文章中有更加详细的解释并且有总结图,大致用途为如何获取到raw Buffer中的属性,其中前30位为属性整体偏移值,31位为是否每个实例都不同,1位不同,0为都相同,也就是说当color的Matedata的31位为0时,所有实例的颜色都是一样的,1时则是通过偏移来获取对应的值

修改代码使颜色值的31位为0时的情况

初始化函数最后则是获取对应的Mesh与material的ID来进行注册到BRG中

第二个重要函数是数据上传的函数 

以使用UBO为例,首先将要上传多少个实例与每个窗口最大实例数进行相除得到装满的窗口的数量,将装满的窗口数量乘以每个窗口的大小再除以16得到所有装满窗口为多少个Float4(因为实例的三个属性大小都是以float4为基础),之后将其上传

接着取得最后一个窗口,由于最后一个窗口存储每个属性之间有空隙,所以要进行偏移处理,之后再将其上传

对于不是UBO的来说,直接一次性一个窗口上传完毕即可

最后一个关键函数为BRG的Culling的回调函数,由于这里没有做剔除的相关操作,该函数重点为对UBO情况的处理

在for循环里包装多个DrawCommand

以上便是个人对BRG部分的整理学习

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/86206
推荐阅读
相关标签
  

闽ICP备14008679号