MaterialInstance 的作用 【UE4】
发布日期:2021-07-01 05:53:46 浏览次数:3 分类:技术文章

本文共 1552 字,大约阅读时间需要 5 分钟。

转载自:http://blog.csdn.net/pizi0475/article/details/50948904

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

我们经常会在游戏中看到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.csdn.net/sinat_27456831/article/details/50781397

转载地址:https://panda1234lee.blog.csdn.net/article/details/60963323 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:分层材质(Layered Materials)的应用【UE4】
下一篇:材质 “Glow 效果” 的实现【UE4】

发表评论

最新留言

很好
[***.229.124.182]2024年05月07日 17时27分46秒