【UE5】使用基元数据对材质传参,从而避免新建材质实例

在项目中,经常会遇到这样的需求:多个模型(例如 100 个)使用相同的材质,但每个模型需要不同的参数设置,比如不同的颜色或随机种子等。

在这种情况下,创建 100 个实例材质不是最佳选择。正确的做法是通过模型的基元数据向材质传递参数。

这种方法不会因为新建实例材质而产生成本。

最重要的是,相同的模型,相同的材质,不会因为基元数据不同而影响合批。

在操作上StaticMeshInstancedStaticMesh是有少许区别的。

StaticMesh

先以StaticMesh为例。

创建材质

在流程上,虽然不是必须的,但通常需要先创建材质:

设置变量为基元数据

为材质勾选使用基元数据:

基元数据是一个浮点数组,一个4通道变量,占用了0123四个索引位置

所以第二个变量在勾选基元数据后,需要按顺序填4

自定义基元数据面板可以助你参考index设置

模型设置

将材质赋予模型,在细节面板,就可以看到材质中可以使用的基元数据。

关键一步

可以看到数据后面是+ 号,也就是并未启用。

点击+号,需要将其全部启用,变成有默认值的状态:

这样,你就可以手动为每个模型创建不同材质参数,而并不需要为其新建实例材质了。

在蓝图中设置

搜索基元,就可以看到可以使用的函数

基本上分为两种,一种是使用名字设置,一种是使用index设置

如果是构建函数

要特别强调的是,在构建函数中,要使用可以被序列化的"默认基元数据",这样你的设置才能保存到下次启动项目:


InstancedStaticMesh

在ISM中使用基元数据,要注意的是,ISM组件的基元数据,和ISM组件中实例的基元数据是并存的。

这是组件:

这是实例:

他们是并存的
看实例的基元数据如何实现的,假如ISM有2个实例,每个实例2个参数,那么一共记录为4个,所以实例并不是独立储存了参数

左侧是组件基元数据和之前一样。新增的是右侧的实例基元数据变量节点,除了不能"起名"用法和之前一样:

在蓝图中设置

关键一步

如果你的ISM组件也需要使用基元数据,千万要记得启用index!

实例的基元数据,你可以预设和动态修改:

设置数据相比静态网格体ISM多了一个InstanceIndex ,为设置基元数据的目标实例。

左侧为组件基元数据,右侧为实例基元数据。

演示

为了展现基元数据不同不影响合批的特性,这里用ISM作为示例。

基元设置

  1. 制作材质,注意组件和实例的基元index是单独计算的:

  2. 选择组件,设置模型和材质,并设置基元数据数组长度1:

  3. 设置实例的基元数据长度3

    等效:

蓝图

红色为设置组件基元数据,给整体随机一个亮度

绿色为实例的基元数据,为每个基元随机一个颜色

效果

技巧

材质

在使用时,组件可以不预先设置材质,甚至模型。此时基元数据是这样的:

显示未声明是不影响实际使用的,但切记需要把可能使用的通道的最大数量的提前开启。

例如所切换的材质中,最复杂的材质需要使用10个基元数据,那么在一开始你就需要开启同样数量的基元数组。

通道使用

通过前面的例子可以看到,基元数据应尽可能压缩索引占用,例如ColorA通道并未使用,却占用了一个位置。

在实际使用中,你可以完全使用浮点类型变量,通过在材质中拆组通道来避免浪费(其实对性能影响微小)

也可以尽可能的打包参数

取决于你的风格

常见用法

提供一些举一反三的思路

  1. 为材质设置随机值
  2. 为每个ISM实例指定不同贴图
相关推荐
UTwelve3 小时前
【UE5】在材质中计算模型在屏幕上的比例
ue5·材质
心怀梦想的咸鱼1 天前
UE5 第一人称射击项目学习(二)
学习·ue5
暮志未晚Webgl1 天前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
心怀梦想的咸鱼1 天前
UE5 第一人称射击项目学习(完结)
学习·ue5
暮志未晚Webgl2 天前
110. UE5 GAS RPG 实现玩家角色数据存档
java·前端·ue5
Zhichao_973 天前
【UE5】Slider控件样式
ue5
流行易逝3 天前
23.UE5删除存档
ue5
心怀梦想的咸鱼3 天前
UE5 第一人称射击项目学习(三)
学习·ue5
流行易逝3 天前
22.UE5控件切换器,存档列表,
ue5