MaterialInstance 的作用 【UE4】

本文解释了游戏开发中Materials与MaterialInstance的区别及应用。MaterialInstance允许开发者独立修改单一对象的材质属性,无需实时编译,提高了效率。文章还介绍了如何通过代码获取并修改MaterialInstance参数以实现动态视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接

原文格式有些问题,遂整理如下:

我们经常会在游戏中看到 Materials,但是还有一种数据结构名字叫做 MaterialInstance 。其实不少游戏的 Mesh 指认的都是 MaterialInstance 而不是 Materials,为什么呢?

1. Materials 和 MaterialInstance 都可以指认给 Mesh 

2. Materials 是在游戏运行之前编译好了的,而想要修改 Materials 的内部参数(比如动态修改其基本色,法线贴图等等)都需要实时 Compilation(Runtime编译),非常耗时,而且对于一种 Material 的修改,会反映到场景中所有使用了它的 Mesh 身上。 

3. 但是对 MaterialInstance 修改只会影响一个对象,而且不需要实时编译,不过对 MaterialInstance 的修改仅仅限制在一些参数上,你想像 MaterialeEditor 一样大幅度修改渲染流程是不行的 

4. Material 里所有的 Node(参数节点)都能暴露在 MaterialInstance 中,比如基本色在 MaterialInstance 中就是一个 VectorParameterValue,金属参数就是一个 ScalarParameterValue 

5. 不仅如此,我们可以创建一个基础 Material,然后以他为基础创建多个 MaterialInstance 给不同对象(比如汽车的基础材质创建好,然后仅仅修改颜色,得到多个 MaterialInstance,也就是多个不同颜色的汽车),这里的 MaterialInstance 是 Constant 的,主要用于相近 Material 的性能优化 

6. 而我们在游戏的代码中可以调用函数得到 Mesh 上的 MaterialInstance,然后直接修改他的某些参数已达到视觉效果(比如树被烧黑),这里得到的 MaterialInstance 是DynamicMaterialInstance,代码如下:

// 0 代表 get 的 MaterialInstance 的 index ,
// 因为不少 Mesh 有多个 Material 在身上
 MatDynamic = MeshComp->CreateAndSetMaterialInstanceDynamic(0);
 MatDynamic->SetScalarParameterValue(ParameterFName, ParameterValue);


这样我们就 set 了一个 ScalarValue 类型的参数给了 MaterialInstance,具体是那个参数取决于 ParameterFName 中 你传入的 FName 内容,比如 MyRoughness 等等。

我们可以看一个例子,一个手电筒的 Material 内部使用了 EmissiveColor 输出,代表这个 Material 是会发光的。这个输出连接了一个简单的 float 参数,代表光强。然后他创建了这个手电筒的 MaterialInstance,其中就会有一个 ScalarParameterValue 是那个光强参数,然后我们在游戏代码里就可以 get 到这个参数,再进而对他进行修改,手电筒就会亮起来了。

( ScalarParameterValue 其实就是 float 型变量) 

( VectorParameterValue 就是四个 float 变量)

其他资料: http://blog.youkuaiyun.com/sinat_27456831/article/details/50781397

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值