UE4:获取材质表达式的信息和值

前言

本文基于4.27

本文记录最近工作中遇到的与材质系统相关的内容

UMaterial

1
class UMaterial : public UMaterialInterface

图上这些是材质的输入节点,类型有FScalarMaterialInput、FColorMaterialInput、FVectorMaterialInput等,都继承自FMaterialInput。

20221127224030

这些是材质表达式。

获取输入到材质的某一个MaterialProperty的表达式

方法:

1
FExpressionInput* GetExpressionInputForProperty(EMaterialProperty InProperty);

参数:
枚举类型,表示材质的某一个属性,比如BaseColor、Metallic、Roughness等,定义在SceneTypes.h中

1
enum EMaterialProperty

返回值:
返回一个ExpressionInput的指针,表示的是输入到这个材质属性的一个表达式。如果没有的话会返回一个空指针。
比如前面的图里的Engine自带的材质M_Basic_Floor来讲,其中BaseColor的输入是Color,那么通过如下调用:

1
FExpressionInput* BaseColorInput = Material->GetExpressionInputForProperty(EMaterialProperty::MP_BaseColor);

就可以得到BaseColor的ExpressionInput,在通过类型转换可以确认具体的表达式类型并进行进一步的操作。

获取材质实例的某种类型的参数

方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
	void GetAllParametersOfType(EMaterialParameterType Type, TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const;

ENGINE_API virtual void GetAllScalarParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;
ENGINE_API virtual void GetAllVectorParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;
ENGINE_API virtual void GetAllTextureParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;
ENGINE_API virtual void GetAllRuntimeVirtualTextureParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;
ENGINE_API virtual void GetAllFontParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;

#if WITH_EDITORONLY_DATA
ENGINE_API virtual void GetAllMaterialLayersParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;
ENGINE_API virtual void GetAllStaticSwitchParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;
ENGINE_API virtual void GetAllStaticComponentMaskParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const override;
#endif // WITH_EDITORONLY_DATA

使用方式,用GetAllScalarParameterInfo举例

1
2
3
4
5
6
7
8
9
10
11
12
// 获取ScalarParameterInfos
TArray<FMaterialParameterInfo> ScalarParameterInfos;
TArray<FGuid> ScalarParameterIds;
MaterialInstance->GetAllScalarParameterInfo(ScalarParameterInfos, ScalarParameterIds);
// 遍历ScalarParameterInfos获取每一个参数的值
for (FMaterialParameterInfo ParameterInfo : ScalarParameterInfos)
{
FString ParameterName = ParameterInfo.Name.ToString();
float ParameterValue;
MaterialInstance->GetScalarParameterValue(ParameterInfo, ParameterValue);

}

实际上GetAllScalarParameterInfo内部调用的是GetAllParametersOfType,然后第一个参数传了EMaterialParameterType::Scalar

1
2
3
4
void UMaterialInstance::GetAllScalarParameterInfo(TArray<FMaterialParameterInfo>& OutParameterInfo, TArray<FGuid>& OutParameterIds) const
{
GetAllParametersOfType(EMaterialParameterType::Scalar, OutParameterInfo, OutParameterIds);
}

获取StaticSwitchParameter节点的输入

20221130131029

1
2
3
4
5
6
7
TArray<UMaterialExpressionStaticSwitchParameter*> MaterialExpressionStaticSwitchParameters;
Material->GetAllExpressionsInMaterialAndFunctionsOfType(MaterialExpressionStaticSwitchParameters);
for (auto& ExpressionStaticSwitchParameter : MaterialExpressionStaticSwitchParameters)
{
FExpressionInput* SwitchTrueInput = ExpressionStaticSwitchParameter->GetInput(0);
FExpressionInput* SwitchFalseInput = ExpressionStaticSwitchParameter->GetInput(1);
}

UE4:获取材质表达式的信息和值
http://muchenhen.com/posts/40430/
作者
木尘痕
发布于
2022年11月27日
许可协议