Unreal 5 实现使用GPU Instancing批量渲染相同的物体

之前做unity的时候,专门研究了使用GPU进行批量相同的物体渲染,现在转ue以后,发现UE也有相同的功能。接下来讲解一下,在ue里面如何实现通过GPU进行实例化渲染。

创建组件

能够实现GPU实例化渲染,ue提供了两个组件,InstancedStaticMesh(实例化静态网格体组件)和HierarchicalInstancedStaticMesh (层级实例化静态网格体组件),这两种的区别是,实例化静态网格体组件,只能渲染一种,层级实例化的意思可以实现lod分级渲染。
在这里插入图片描述
实例化组件只能使用静态网格体,不能够使用骨骼网格体,我这里使用的是之前买的工具将骨骼网格体转换成的静态网格体,我使用它的愿望也是能够大批量的渲染带有动作的模型,虽然效果会比骨骼网格体差一些,但是它是真的省。
在这里插入图片描述
当然,虽然实例化网格体使用的相同的网格体,相同的材质,但是实例化网格体也有一些个性化的信息,比如位置变换,或者自定义颜色等,位置变换已经内置实现,如果别的个性化的数值,需要在实例列表下设置自定义数据浮点数字。这个是长度,如果添加到场景,添加了数据,数组中就会有相关的设置数据。
在这里插入图片描述

实现实例化组件的材质

如果材质在实例化网格体中使用自定义数据,需要使用节点 PerInstanceCustomData,这是一个标量,代表一个浮点数值,中括号内代表自定义数据数组值的下标
在这里插入图片描述

在这里插入图片描述
还有一种代表三个标量值的三维向量
在这里插入图片描述
正常这种自定义数据是在顶点着色器使用的,如果需要在片元着色器使用,需要使用一个节点转换到可以在片元着色器使用
在这里插入图片描述
我这里使用了自定义数据传入一个数值,用作当前顶点播放到的动画的帧数的设置,保证每个模型播放的自己需要播放的动画
在这里插入图片描述

相关节点

现在有了实例化模型,也有了材质相关的设置。接下来介绍一下在蓝图中给实例化模型添加实例,以及更新数据和位置变换。
添加实例我们需要使用实例化模型的添加实例节点,可以传入一个变换设置位置,并且World Space的设置了以后,直接设置模型在场景中的位置,而不是基于实例化模型的位置的变换。
添加实例节点将返回实例在数组中的索引。我们设置自定义数据以及后续的自定义数据都需要索引去设置。
在这里插入图片描述
设置实例的自定义数据值,就是可以材质的之前设置的自定义的数据,用于实现模型的个性需求。
目标是实例化静态网格体组件
Instance Index 是添加实例返回的索引
Custom Data Index 是自定义数据的索引,自定义数据需要一个一个值单独设置
Custom Data Value 是自定义数据的值
Mark render state Dirty 将在帧结束时发送值到渲染线程
在这里插入图片描述
修改实例的位置变换
目标是实例化静态网格体组件
Instance Index 是实例的索引
New Instance Transform 是新的位置变换
World Space 设置的是否是场景坐标
Mark Render State Dirty 是否在帧结束时发送值到渲染线程
Teleport 是否产生冲量去影响其它模拟物理的模型,产生模拟物理的效果(如果为true,物体将不是设置位置,而是一个很大的速度移动到目标位置,并对途中的物体产生物理冲量)
在这里插入图片描述
有添加就有清除,清除实例有两个,一个是全清
在这里插入图片描述
一个是通过实例索引清除,只清除目标实例
在这里插入图片描述
还有一个可以传入一个数组,清除多个实例
在这里插入图片描述

注意事项

如果你使用顶点动画去播放模型效果,会发现动画播放时,会产生残影,这个效果出现的原因是默认的抗锯齿后处理出现的。
解决这个问题最简单的方式就是换一个抗锯齿效果
延迟渲染管线默认的抗锯齿是临时超分辨率TSR抗锯齿,就是这个造成的,MSAA在延迟渲染管线比较耗,不推荐,我使用的第一个,比较省,直接在后处理里面性能比较稳定。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_30100043/article/details/131477211
今日推荐