【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置

这篇具有很好参考价值的文章主要介绍了【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 GPU 3D骨骼动画和 GPU 2D Spine动画插件均包含在【万人同屏整合方案】中,老板们可在某宝搜:[游戏开发资源商店] 以获取全套方案的所有源码插件。

插件功能:

1. 支持3D动画转GPU动画 

2. 支持2D Spine动画转GPU动画

3. 支持挂点、支持挂载物、动态切换挂载物、实时获取挂点Transform信息

4. 支持实时获取gpu动画信息,如动画帧数、动画时长、动画是否循环

5. 支持动画事件

GPU骨骼动画视频介绍:

GPU顶点动画和GPU骨骼动画实现原理及优缺点对比 性能优化

2d spine动画帧数提升数十倍?spine转gpu动画 2d spine动画 10w单位

【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置,Unity,Unity Shader,unity,游戏引擎

GPU动画是实现万人同屏的前置条件,在之前的文章中已介绍过GPU顶点动画的实现方法:【Unity】渲染性能开挂GPU Animation, 动画渲染合批GPU Instance_skinmeshrender合批-CSDN博客

GPU顶点动画的优缺点:

GPU顶点动画是将每一帧动画的Mesh顶点/法线存入贴图,在Shader中直接读取顶点/法线使用。

优点:由于没有过多的计算,因此性能较高;

缺点:如果一个模型有多个SkinnedMeshRenderer需要先合并Mesh; 生成的动画/法线贴图较大;不支持切换挂载武器;

GPU骨骼动画的优缺点:

GPU骨骼动画是将每一帧动画的所有骨骼的矩阵信息存入贴图,每一个顶点至多受4根骨骼影响,在Shader中用这4根骨骼的矩阵和4根骨骼对应的蒙皮权重对顶点位置和法线进行变换,得到受骨骼影响后的顶点/法线值。

优点:动画贴图很小;无需合并Mesh;支持挂载武器切换;可以实时获取到某个挂点位置

缺点:需要一定计算量,因此性能比顶点动画略低;

GPU骨骼动画实现:
一,读取骨骼数据,生成动画贴图,Mesh

 1. 获取蒙皮动画的骨骼信息:

可通过SkinnedMeshRenderer的rootBone查找到根骨骼,或者直接使用bones字段,该字段为SkinnedMeshRenderer关联的所有骨骼的Transform数组;

2. 从动画曲线获取每个动画帧记录的骨骼Transform数值:

【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置,Unity,Unity Shader,unity,游戏引擎

以获取动画每帧的骨骼位置为例:

private Vector3 GetBonePositionAtTime(string bonePath, AnimationClip clip, float animTime)
{
    var localPosXCurve = EditorCurveBinding.FloatCurve(bonePath, typeof(Transform), "m_LocalPosition.x");
    var localPosYCurve = EditorCurveBinding.FloatCurve(bonePath, typeof(Transform), "m_LocalPosition.y");
    var localPosZCurve = EditorCurveBinding.FloatCurve(bonePath, typeof(Transform), "m_LocalPosition.z");

    Vector3 pos = Vector3.zero;
    pos.x = AnimationUtility.GetEditorCurve(clip, localPosXCurve).Evaluate(animTime);
    pos.y = AnimationUtility.GetEditorCurve(clip, localPosYCurve).Evaluate(animTime);
    pos.z = AnimationUtility.GetEditorCurve(clip, localPosZCurve).Evaluate(animTime);
    return pos;
}

3. 将骨骼矩阵写入动画贴图:

把矩阵的前3行数值,以骨骼个数为偏移量分别写入动画贴图:

for (int boneIdx = 0; boneIdx < bones.Length; boneIdx++)
                {
                    var bone = bones[boneIdx];
                    bool noBone = bone.GetComponent<MeshRenderer>() != null;
                    if (!noBone && bone.TryGetComponent<SkinnedMeshRenderer>(out var sMeshRender) && sMeshRender.rootBone == null)
                    {
                        noBone = true;
                    }
                    var boneMatrix = bone.localToWorldMatrix;
                    if (!noBone)
                    {
                        boneMatrix *= bonesW2LMatrices[boneIdx];
                    }

                    animBoneTex.SetPixel(boneIdx, curFrameIndex, boneMatrix.GetRow(0));
                    animBoneTex.SetPixel(bonesCount + boneIdx, curFrameIndex, boneMatrix.GetRow(1));
                    animBoneTex.SetPixel(bonesCount * 2 + boneIdx, curFrameIndex, boneMatrix.GetRow(2));
                }

4. 将每个动画的开始帧/结束帧、动画时常、动画是否循环播放的信息写入动画贴图的最后一列像素 

【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置,Unity,Unity Shader,unity,游戏引擎
生成的骨骼动画贴图

 5. 生成Mesh网格:

有了骨骼信息的动画贴图,还需要知道每个顶点受哪些骨骼影响,才能在Shader中取到对应的骨骼信息对顶点和法线进行变换;

为了节省资源和读取方便,我们可以直接把顶点关联的4根骨骼以及每根骨骼的权重分别塞到Mesh的UV2和UV3两个通道。

 二、GPU骨骼动画Shader实现:

 1. 从动画贴图中解析当前动画的起始/结束帧,根据是否Loop来计算出当前动画帧:

【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置,Unity,Unity Shader,unity,游戏引擎

 2. 以当前帧为动画贴图采样的V坐标,采样获取所有骨骼矩阵每行数值,构建骨骼矩阵并计算顶点/法线:

【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置,Unity,Unity Shader,unity,游戏引擎

3.  通过自定义函数得到转换后的顶点坐标和法线并应用到GPU骨骼动画shader:

【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置,Unity,Unity Shader,unity,游戏引擎

 这样就完成了GPU骨骼动画功能,切换动画时传入动画Index和当前时间Time.time,动画片段将自动从起始帧开始播放,并且完美支持动画是否循环。对于在骨骼上挂载的武器,无论是MeshRenderer还是SkinnedMeshRenderer都完美支持,因为挂载武器的节点Transform本身也作为骨骼写入到了动画贴图,Shader中会自动通过骨骼的Local2WorldMatrix对顶点进行变换,自然而然武器就会跟着骨骼动。

三,获取挂点位置 

例如GPU动画人物手里拿着一把枪,发射子弹时就需要在枪口的位置创建并发射子弹,由于GPU动画已经没有了骨骼Transform,枪口的位置怎么获取呢?

GPU动画因为是纯Shader实现,所以切换动画只需要修改材质的ClipId属性即可,其中x作为动画索引,y作为动画播放的开始时间,即Time.time。

有了动画索引和播放的开始时间,我们就可以得到当前动画已经播放了多久,根据已经播放时长就可以算出动画播到了第几帧,通过第几帧就可以从动画贴图读出任意骨骼的矩阵,这样就实现了随用随取的高性能获取挂载点位置、旋转、缩放。

四,GPU动画帧事件: 

GPU动画转换工具会自动把Animation Clip中包含的事件数据保存到文件里,无需手动处理。并且支持随意增删事件。

GPU动画事件同时支持 Mesh Renderer渲染和BRG渲染。

两种渲染模式触发逻辑不同:

1. 使用MeshRenderer渲染只需挂载一个事件脚本,然后就像为Button添加/移除监听事件一样简单。

2. 使用BRG渲染, BRG提供了获取触发事件的接口,接口使用Jobs检测当前帧触发的事件,并将事件列表返回,由用户在主线程自行调用触发。大大提升了海量GPU动画单位事件触发性能。

同时GPU动画事件处理时会进行插帧计算,不会因为卡顿问题导致跳过动画事件的触发。

例如:一个弓箭手射箭动画,动画前大部分是搭箭、拉弓,动画最后一帧才松手,为了显示效果同步,就需要在最后一帧弓箭手松手时让箭发射出去,而不是在搭箭/拉弓的时候就发射箭。通过使用帧事件就能完美卡点解决这个问题。

GPU 2d Spine动画实现:

有多个网友反馈有2D GPU动画的需求,不过我们通常会认为2D很难存在渲染瓶颈,然而并非如此。经过实际测试同屏显示相同的动画人物,1W个Spine动画 vs 1W个Animator动画。测试结果令人大跌眼镜!Spine动画和Animator动画性能接近,1W单位下都只有8帧左右。要知道,我们之前测试的五百多顶点的3D人物,同数量级下能达到近9帧左右。Spine动画性能竟然如此之差!

看来对于数量级超过百、千单位的项目,非常有必要使用GPU Spine动画。

2d spine动画帧数提升30倍 spine转gpu动画 2d spine动画 10w单位

 实现原理其实就是把Spine动画转换为Animator动画,由于2D动画都是有面片Mesh组成,z轴全为0. 因此必须解决渲染层级的问题,这一转换过程需对Mesh进行修改以使得渲染层级正确。转换为Animator动画后就可以使用我们的GPU动画转换工具直接进行转换,同样支持顶点动画/骨骼动画两种模式。

同屏1W个单位测试环境下,Spine动画转换为GPU 2D动画后帧数直接提升10倍以上,使用万人同屏方案合批渲染功能后,相比Spine动画提升接近恐怖的40倍,对于2D割草游戏绝对是最佳方案。文章来源地址https://www.toymoban.com/news/detail-800910.html

到了这里,关于【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity学习笔记(7) Unity2D骨骼动画制作流程

    用骨骼动画最大的好处就是方便之后做换装系统。 无论对3Dor2D游戏都是这样的。 这篇博文记录一下2D骨骼动画的制作流程,参考b站麦扣的系列教程: https://space.bilibili.com/370283072/channel/seriesdetail?sid=211996 用PS做一个将人物各个部件(骨骼)都分解开来的人物模型。 导出时注意

    2023年04月09日
    浏览(58)
  • Unity GPU Skinning Tool: 提升3D游戏动画性能的新利器

    项目地址:https://gitcode.com/ForeverZack/Unity-Gpu-Skinning-Tool 在Unity引擎的世界里,Unity GPU Skinning Tool是一个强大的工具,它将骨骼动画计算从CPU转移到GPU,显著提高了游戏中的角色动画性能。对于那些需要大量3D角色与复杂动画的游戏开发者而言,这是一个非常值得尝试的技术。 Un

    2024年04月25日
    浏览(51)
  • 【CocosCreator入门】CocosCreator组件 | Spine(骨骼动画)组件

             Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中Spine 是一个基于骨骼系统的 2D 动画工具,它可以让开发者通过对骨架和关键帧的调整来制作出更加自然、流畅的动画效果。Cocos Creator 支持使用 Spine 的 JSON 格式文件导入到项目中,并且提供了

    2023年04月15日
    浏览(46)
  • python+unity 做3d动画人物 python做骨骼识别 (一)

    1. 环境准备:pycharm 2017.2.2 python 3.8.6 2. unity 2018.        曾经上学时学过unity开发,但后来工作后,一直没有从事过,此方面的技术研究了,一直想着做个东西捡起来,以前忘却的知识。。。想着想着很多年过去了。。。直到最近不知道。。咋的了突然想搞点东西玩玩,捡起来

    2024年02月11日
    浏览(42)
  • Unity学习笔记---2D光照渲染、美术、动画

    Unity 提供三个渲染管线 :一个内置渲染管线和两个可编程渲染管线 (SRP)。两个 SRP 为通用渲染管线 (URP) 和高清渲染管线 (HDRP)。URP 适用于所有平台,而 HDRP 则 旨在用于针对高端 PC 和主机的游戏。 注意 :如果在 Unity 2021 或更高版本中启动一个新项目,则称为 2D (U

    2024年02月09日
    浏览(43)
  • 【小沐学Unity3d】3ds Max 骨骼动画制作(CAT、Character Studio、Biped、骨骼对象)

    官网地址: https://help.autodesk.com/view/3DSMAX/2018/CHS https://help.autodesk.com/view/3DSMAX/2019/CHS https://help.autodesk.com/view/3DSMAX/2020/CHS https://help.autodesk.com/view/3DSMAX/2021/CHS https://help.autodesk.com/view/3DSMAX/2022/CHS 3ds Max 包含两套完整的对各个角色设置动画的独立子系统(即 CAT 和 character studio),

    2024年02月08日
    浏览(49)
  • 【小沐学Unity3d】3ds Max 骨骼动画制作(Mixamo )

    官网地址: https://www.mixamo.com/#/ 使用 Mixamo 上传和装配 Adobe Fuse CC 3D 人物、自定义 3D 人物,或者利用 Mixamo 库中的人物开始操作。 Mixamo支持3种文件格式上载:FBX,OBJ,ZIP。 确保FBX文件的“嵌入媒体”已打开,以上传纹理。OBJ文件不包含纹理,使字符显示为灰色。要显示.obj文

    2024年02月04日
    浏览(71)
  • 骨骼动画——2D Animation

    传统的序列帧动画为了达到好的动画效果,理论上来说,图片越多,动作越流畅,往往需要较多的美术资源,虽然效果好但是资源占用较多 而2D骨骼动画是利用3D骨骼动画的制作原理进行制作的,将一张2D图片分割成n个部位,为每个部位绑上骨骼,控制骨骼旋转移动,达到用

    2024年02月01日
    浏览(43)
  • 【小沐学Unity3d】3ds Max 骨骼动画制作(蒙皮修改器skin)

    “蒙皮”修改器是一种骨骼变形工具,主要设计用于通过另一个对象对一个对象进行变形来创建角色动画。可使用骨骼、样条线和其他对象变形网格、面片和 NURBS 对象。 如果将“蒙皮”修改器应用到网格,然后使用修改器指定骨骼,则每个骨骼都将收到一个胶囊形状的“封

    2024年02月10日
    浏览(49)
  • 【Unity3D】2D动画

    1 图片处理         本文完整资源见→Unity3D 人物行走 2D 动画。         通过 PS 软件将以下 gif 文件中的黑色背景删除,并将其中的 18 个图层分别保存为 png 格式图片。 2 游戏对象         1)游戏对象层级结构          2)Transform组件参数 Name Type Position Rotation S

    2023年04月13日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包