找回密码
 立即注册
查看: 313|回复: 0

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

[复制链接]
发表于 2020-11-27 20:14 | 显示全部楼层 |阅读模式
之前的账号找不到了,这次绑定微信和手机,就不相信还会丢。
最近两年一直在做休闲手游,技术含量不高,纯粹买量和广告变现的活儿,最近想做点稍微复杂一些的东西,恰逢去年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),在推荐上会有加分,也打算一并搞一下。先挖个坑吧。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 01:32 , Processed in 0.066297 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表