Unity性能-GPU Instancing、GPUSkinning

动态合批

Dynamic batching的原理也很简单,在进行场景绘制之前将所有的共享同一材质的模型的顶点信息变换到世界空间中,然后通过一次Draw call绘制多个模型,达到合批的目的。模型顶点变换的操作是由CPU完成的,所以这会带来一些CPU的性能消耗

GPU Instancing

  • 优先级
    静态合批>Instancing>动态合批

  • 特征
    只能渲染相同的meshes,但是允许每个实例有不同的参数(颜色,scale..)

  • 与动态和静态合批的区别
    1,GPU Instancing 没有动态合批那样对网格数量的限制,也没有静态网格那样需要这么大的内存,它很好的弥补了这两者的缺陷
    2,与动态和静态合批不同的是,GPU Instancing 并不通过对网格的合并操作来减少Drawcall,GPU Instancing 的处理过程是只提交一个模型网格让GPU绘制很多个地方,这些不同地方绘制的网格可以对缩放大小,旋转角度和坐标有不一样的操作,材质球虽然相同但材质球属性可以各自有各自的区别。

使用

  • 材质球shader支持GPU Instancing
  • shader需要添加对应的定义和操作
  • 实例的data存在矩阵数组,使用对应的Graphics.DrawMeshInstanced绘制。(CommandBuff再进一步优化,省位置不变时的绘制)

SRP Bathch

SRP Batcher兼容性

1 为了使对象通过SRP Batcher代码路径渲染,要注意二个要求:
对象必须处于网格中。对象不可以是粒子或蒙皮网格。
必须使用兼容SRP Batcher的着色器。HDRP和LWRP中的所有Lit Shader受光着色器和Unlit Shader无光照着色器都符合此要求

2 为了让着色器兼容SRP,需要进行以下处理:
所有内置引擎属性必须在名为“UnityPerDraw”的CBUFFER中声明。例如:unity_ObjectToWorld或unity_SHAr。
所有材质属性必须在名为“UnityPerMaterial”的单个CBUFFER中声明。

提速效果源于二个方面:

每个材质内容现在都会一直保留在GPU内存中
专用代码会管理大型“per object” GPU CBUFFER

官方微信文章

其他-------

GPUSkinning

思路

迭代

  • 动作烘焙到Texture中。

Animation Instancing – Blog
Unity大规模角色的GPU蒙皮动画表达方式
UWA - GPU Skinning 加速骨骼动画
《Unity3D高级编程之进阶主程》第七章,渲染管线与图形学(三) - 渲染原理与知识3

原文地址:https://www.cnblogs.com/Jaysonhome/p/13582628.html