Unity中使用GPU Instancing优化SkinnedMesh渲染

本文介绍如何在Unity中使用GPU Instancing优化SkinnedMesh渲染,以解决大量静态SkinnedMesh导致的性能问题。通过转换为StaticMesh、存储蒙皮信息到顶点颜色/UV,并自定义Shader实现,最终将性能从10FPS提升到80FPS左右。

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

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

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

不过这两个实现都是考虑了Animation的, 会采样AnimationClip的Tran

### 如何在 Unity HDRP 中使用 GPU Instancing 为了实现高效的渲染,在 Unity 的高清渲染管线 (HDRP) 中启用并配置 GPU 实例化是一项重要技术。这不仅能够显著提高性能,尤其对于大量重复对象而言效果明显。 #### 启用 GPU Instancing 支持 确保项目设置支持 GPU 实例化: - 打开 `Edit` -> `Project Settings...` -> `Player` - 寻找 `Other Settings` 下的 `Rendering` 部分 - 将 `Auto Graphics API for Windows` 设置为包含 Direct3D 11 或更高版本,并确认启用了 `Use Graphic Jobs` #### 材质属性调整 针对材质文件进行如下修改以兼容实例化需求: ```csharp Shader "Custom/GPUInstancedShader" { Properties { _MainTex ("Texture", 2D) = "white" {} // 添加此行来声明该着色器可以用于GPU实例绘制调用 [PerRendererData]_Color("Color Tint", Color) = (1,1,1,1) } } ``` 注意上述代码片段中通过 `[PerRendererData]` 属性标记颜色变量[^1]。 #### 修改 C# 脚本配合结构体定义 当处理球形物体时,可以在C#脚本里创建相应的数据结构以便传递给着色器程序。例如按照下面的方式定义Sphere类: ```csharp [System.Serializable] public class Sphere { public Vector3 position; public float radius; public Color albedo; public Color specular; public Matrix4x4 modelMatrix; } // 假设有一个列表存储多个sphere实例... List<Sphere> spheres = new List<Sphere>(); ``` 这里引入了一个额外成员 `modelMatrix` ,它用来表示每个单独模型的空间变换矩阵。 #### 使用 DrawMeshInstancedIndirect 进行批量绘图 利用计算着色器或命令缓冲区动态构建间接参数数组,从而允许一次性提交大批量几何图形供GPU处理。具体做法是在合适的时机(比如 LateUpdate 方法内),向 CommandBuffer 注册一次性的DrawCall : ```csharp var argsBuffer = new ComputeBuffer(1, sizeof(int) * 5); argsBuffer.SetData(new int[] { count, instanceCount, materialIndex }); commandBuffer.DrawMeshInstancedIndicated(mesh, submeshIndex, material, bounds, argsBuffer); Graphics.ExecuteCommandBuffer(commandBuffer); ``` 以上操作会触发基于之前准备好的顶点/索引缓存以及对应的变换信息完成高效渲染过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值