原文格式有些问题,遂整理如下:
我们经常会在游戏中看到 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