Unity的skinning为何用CPU来计算。?
Unity的skinning为何用CPU来计算。? 1.GPU skinning 要配合transform feedback,不然多pass的时候要重复做,移动设备上这个问题很常见。2.有答主说是挂点的问题,这是错的。unity里面骨骼都是gameobject,transform变换本来就是在CPU上算好的,GPU skinning只要传matrix palette。
3.骨骼数受限是对的,万一超了,只能切模型或者用texture传matrix palette,这两种方法都会有问题,前者会加draw call,后者需要支持vertextexture扩展,如果texture不支持float格式还要encode到int上。
unity的哲学是兼容性高于一切,所以cpu是最好的选择。 我想好处是统一了shader的编写,不需要为每一个shader再编写一份蒙皮版本。同时也简化了shader编译工具的复杂度。其次,对于多Pass的shader,也省去了每一个pass都要做一次蒙皮的冗余操作。比如,做ShadowMap的时候,渲染深度时,算好的蒙皮结果可以直接用于后续的着色处理,而不需要再蒙皮一次。
Unity可以开启GPU蒙皮。开启之后,顶点位置放在顶点着色器计算,计算完后被传回到一个顶点缓存,然后引擎可以把它当做普通网格一样提交渲染了。然而这个特性需要DX11(Stream Out),或OpenGL ES 3.0(Transform Feedback)的支持。 原因没那么复杂。2005年unity就已经出现了,而gpu skinning要在DirectX 11或opengl es 3.0才能使用。所以使用cpu也就不奇怪了吧。
至于为何gpu 蒙皮需要DirectX 11或opengl es3.0的原因也很简单,因为蒙皮结果要缓存起来,DirectX 11使用StreamOut而es 3.0使用transform feedback。
另,早在2013年,unity就已经有gpu skinning了。只不过需要pro罢了。
Unity 4.2 has arrived – Unity Blog
GPU Skinning (requires Unity Pro)
Completely automatic, no custom shaders needed.Works on DirectX 11 (via stream-out), OpenGL ES 3.0 (via transform feedback) and Xbox 360 (via memexport). Other platforms will continue to use CPU skinning.
Unity现在的GPU Skinning其实性能也很低,因为要显存回读。感觉之所以一直没大有现成方案,主要是需求问题,因为有大规模骨骼蒙皮需求的基本可以自己写了,现在有了IJobTransform和SRP,基本API套上,公式套上,这么个功能让一个程序员捣鼓几天就出来了。Unity的哲学一向如此,好用的API给你奉上,而不是现成的轮子给你安装好,会做的套API能做的更轻松,不会做的只能怪自己太乐色了。
为了证明我不是在吹NB,文章地址给上:
MaxwellGeng:GPGPU Computing Animation & SkinningP.S. 我这已经不是GPU skinning了,而是整个Animation都在GPU进行了,实际项目中没必要这么激进,完全可以让骨骼正常运算,这种GPU Animation的方法很难做状态机,IK之类的,但是性能确实奇高,更适合游戏过场动画时使用的那种超高精度的模型,比如几千几万根骨骼的高精度动画。 有些场合不适合GPU Skinning,比如需要精确判断鼠标是否选中角色、或者子弹是否精确命中角色的时候。一些GPU的常量寄存器数量也不足(如都D3D9设备和GLES 2.0设备),实现GPU Skinning的时候需要额外的处理。
CPU Skinning也有一些优点,比如广泛的设备兼容性,比如上面说的精确逻辑处理,比如可以根据距离对Skinning进行LOD(如近距离角色每秒30帧Skinning,远距离角色每秒15帧Skinning),比如多Pass渲染时只需要一次Skinning(还要考虑阴影渲染的pass),等等。
总得来说,CPU Skinning的效率在大多数时候是可以接受的(尤其是在多线程环境下,可以使用多线程Skinning),所以使用CPU Skinning作为默认Skinning方式是一种稳妥的选择。 如果
没有一个带骨骼的物体画多次,
没有一个带骨骼的物体需要精确判断
没有一个带骨骼的物体有特殊物理需求
需要个蛋的CPU蒙皮
然而实际上,Unity的skining只是默认用CPU计算而已,你完全可以勾选用GPU计算。提供的shader信息里面也有相关的蒙皮计算相关的函数和数据
(我们的项目问题在于CPU瓶颈而不是GPU,所以就勾这个了)
页:
[1]