yjfzbfrz 发表于 2020-11-27 20:14

Unity中实现高性能渲染遇到的问题

之前的账号找不到了,这次绑定微信和手机,就不相信还会丢。
最近两年一直在做休闲手游,技术含量不高,纯粹买量和广告变现的活儿,最近想做点稍微复杂一些的东西,恰逢去年Unity推出了一堆新技术,正好想试试,结果遇到了一堆坑。
不能自定义Culling过程的SRP
首先想做的是GPU Driven Pipeline,整个Culling过程用CS去实现,然后用Multi Draw Indirect / Draw Elements Instance Indirect去渲染,在Vulkan和Metal,DX12上岂不美滋滋?结果翻开文档,仔细研读,发现跟culling有关的只有脚本测的CullingGroup,还有SRP的ScriptableRenderContext.Cull()。前者需要自己传包围球,后者全黑盒,呵呵。
然后想着曲线救国,先获取整个场景中所有render的bounds,然后在传给CS,组织好结构Culling完了放到Compute Buffer里,结果…… 发现除了Object.FindTypeof()以外完全无法获取,这个函数又是上古时期就已经明确的,属于慢的要死系列。实测了下载I5 PC上获取一遍10000个包围盒就要6ms,这还玩个钉钉啊……
没有MultiDraw的支持
第一条如果放到DOTS里其实是可以解决的,自己定义一个mesh render system,然后把自己的bounds放到一个公共的NativeArray里,然后在SRP里把这个NativeArray传给CS去做Culling,然后就发现了一个悲剧的事实:Unity目前不支持MultiDraw/MultiDrawIndirect,然后上网查了一圈,一个Unity的大哥说:因为不是每个平台都支持MultiDraw,所以目前没添加对此功能的支持。现在DX12,Vulkan,Metal,GLES3.1都支持了,估计很快就会加入吧
在Native代码中无法使用Unity的Shader Program
我想着试着扩展一下,实现个Graphics.DrawMultiMesh之类的函数,Mesh的Layout文档里有,Texture ID也能获取,结果,卡在了Shader上。在Native Plugin里面完全无法使用Unity中写的Shader Program,难道要维护两套Shader?整个下来这工作量基本上是感动中国了
现在想的是另一套曲线救国方案,从工作流入手,区分Instance和非Instance。Instance 用GPU Culling+ DrawMeshInstanceIndirect去画,非Instance走传统Culling,还是一个一个来。Asset Store里有一套叫GPU Instancer的插件,实现的就是这块,效果不错。

另外一个就是CS的GPU Skinning,每帧同步骨骼的旋转位置和缩放,Skinning部分用VS去做,也可以用一些trick实现IK和Mecanim动画,不过渲染的时候要定制Shader,这个倒不是特别困难事情,开销由于都在VS里,也不会十分大,不过因为需要structure buffer,还是需要支持Compute Shader
另外就是苹果有新政策,如果能使用metal实现多光源渲染(Forward + / Deferred),在推荐上会有加分,也打算一并搞一下。先挖个坑吧。
页: [1]
查看完整版本: Unity中实现高性能渲染遇到的问题