专栏首页逍遥剑客的游戏开发Unity中使用GPU Instancing优化SkinnedMesh渲染

Unity中使用GPU Instancing优化SkinnedMesh渲染

有这么个需求: 一堆不会动的SkinnedMesh, 通过物理模拟出死亡姿势后, 需要优化性能, 不然才10FPS

首先想到的做法是转成StaticMesh. 试了一下直接超出了Unity的顶点Index数量限制, 所以放弃, 再说转换完后也不方便编辑. 

另一个思路就是使用Instanced Skinned Mesh Rendering, 找到两个参考:

不过这两个实现都是考虑了Animation的, 会采样AnimationClip的Transform序列帧写入纹理. 直接拿来是没法用的, 所以就参考他们的做法自己也实现了个Instancing的优化. 

大家做SkinnedMeshInstancing的思路都差不多, 所以整个优化的流程就比较容易理清了:

  • 把SkinnedMesh转换成StaticMesh, 把每个顶点的蒙皮混合权重和骨骼索引写到顶点的color/uv1/uv2, 通常情况下都是4个bone index加上4个blend weight.
  • 每个SkinnedMesh的Pose都是一系列的变换矩阵, 去掉一行后做为3个Color写入RGBAHalf纹理
  • Shader中加个INSTANCED_PROP的PoseIndex参数, 用于索引PoseMatrix的起始像素(matrix), 再根据顶点里的bone index和weight查到4个matrix乘到顶点的位置和法线上. 其实跟常见的skin shader的写法差别不大, 区域在于bone transforms不是从constant buffer里取出来
  • 为生成的Mesh再生成InstancingShader的Material, 拷贝原材质参数过来, 并写入我们计算PoseOffset需要的参数(如骨骼数), 另外需要勾选Enable Instancing

做完这些, 不出错的情况下其实就可以用MeshRenderer把模型画出来了, 但实现过程中也遇到一些问题:

  • 每个角色的SkinnedMesh是分成3个Mesh的, 每个SkinnedMesh引用的骨骼还不一样. 所以直接取SkinnedMesh的bones数据是没法跟其它Mesh共用的. 所以需要从根节点开始遍历, 生成一张共用的PoseTexture.
  • 使用MeshRenderer来绘制是有问题的, 因为顶点在shader中改变了位置, 但是Bounds没有变化, 导致Culling出问题. 所以需要使用CullingGroup自己做可见性检测, 然后通过DrawMeshInstanced去绘制. 也就是说完全不需要MeshRenderer了, 也不需要为每个Mesh创建GameObject
  • Texture的FilterMode需要改成Point采样, 不然相邻像素之间会插值, 导致读取的matrix值是错误的. 如下图, 左边是Point采样, 右边是Linear采样, 可以看到颜色都被平均掉了:
  • 写入纹理的Transform矩阵应该是root.worldToLocalMatrix * bone.localToWorldMatrix * bone.bindpose. 不然肢体Transform会计算错误
  • 之前为了省性能每个顶点只计算了两个骨骼的影响, 结果会发现部分蒙皮错误的情况, 改成4个骨骼就好了:

最终的优化效果还是挺不错的, 从10FPS提升到80FPS左右:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 汉字转成拼音首字母

    逍遥剑客
  • Nebula3的渲染流程

    每帧的渲染过程都写进了配置文件, 默认使用的是"frame/win32/dx9default.xml", 阴影还有另外一套.

    逍遥剑客
  • 引擎工具开发的一些总结

    逍遥剑客
  • BAT激辩AI:李彦宏称强人工智能不会到来;马云说so他妈what

    舒石 发自 LZYY 量子位 报道 | 公众号 QbitAI 今日BAT三巨头:李彦宏、马云、马化腾,齐聚深圳IT领袖峰会,围绕人工智能这个主题展开激辩,高潮迭...

    量子位
  • scp(安全拷贝)和rsync(增量复制)

    要求: 用户名A@主机名1 对path1有读权限 用户名B@主机名2 对path2有写权限

    爱学习的孙小白
  • 快速了解kafka的基础架构

    今天来聊下大数据场景下比较流行的消息队列组件kafka。本篇文章将主要从理论角度来介绍。

    波罗学
  • 商汤科技徐立:AI 将在10 年内创造一个印度和中国的总产值

    【新智元导读】3月22日,清华大学《人工智能前沿与产业趋势》系列课程第二讲开课,本讲聚焦当前AI领域最火、落地应用最成功的计算机视觉,由商汤科技CEO徐立主讲。...

    新智元
  • 中国抗击冠状病毒疫情战役中的人工智能应用

    在冠状病毒爆发后(coronavirus outbreak),我们看到人工智能技术在遏制(contain)疫情中发挥了重要作用,包括机器人清洁工(robotic...

    用户6026865
  • 运维同步rsync

    Rsync(remote  rynchronization)是一款开源的、快速的、多功能的、可实现全量以及增量的本地或者远程数据同步的备份的优秀工具,可使本地主...

    主机优惠
  • git报错sign_and_send_pubkey: signing failed: agent refused operation

    在服务器添加完公钥后报错 sign_and_send_pubkey: signing failed: agent refused operation

    用户7557625

扫码关注云+社区

领取腾讯云代金券