材质表达式技术指南

关于如何创建新材质表达式以在材质编辑器中使用的指南。

Windows
MacOS
Linux
On this page

在UE4中创建新材质表达式十分简单。例如,我将创建一个让输入呈正方形的新材质表达式,叫做MaterialExpressionSquare。请注意,UE4中的所有材质表达式都在`MaterialExpressions.cpp`中实现。

声明

首先,添加一个新引擎脚本文件,并使用从MaterialExpression衍生而来的新类型。声明该表达式的输入和虚拟函数,例如:

MaterialExpressionSquare.h

UCLASS(HeaderGroup=Material, collapsecategories, hidecategories=Object)
public class UMaterialExpressionSquare : public UMaterialExpression
{
    GENERATED_UCLASS_BODY()

    UPROPERTY()
    FExpressionInput   A;

#if CPP
    virtual int32 Compile(FMaterialCompiler* Compiler);
    virtual FString GetCaption() const;
#endif

}

如果要添加希望能在材质编辑器的属性页面中编辑的表达式变量,请务必在`UPROPERTY()`宏中定义类别:

UPROPERTY(Category=MaterialExpressionSquare)
float ClampMin;

实现

该构造函数用于设置属性的默认值。在该示例中,它向材质编辑器内部的表达式库中的各个类别分配材质表达式。

UMaterialExpressionSquare::UMaterialExpressionSquare(const FObjectInitializer& ObjectInitializer)
    :Super(ObjectInitializer)
{
    // 用于保存一次性初始化的结构体
    struct FConstructorStatics
    {
        FName NAME_Particles;
        FName NAME_Constants;
        FConstructorStatics()
            :NAME_Particles(TEXT("Particles"))
            , NAME_Constants(TEXT("Constants"))
        {
        }
    };
    static FConstructorStatics ConstructorStatics;

    // 属性初始化
    MenuCategories.Add(ConstructorStatics.NAME_Particles);
    MenuCategories.Add(ConstructorStatics.NAME_Constants);
}

Compile()在`FMaterialCompiler`上调用相应函数。在该示例中,我们可以使用现有的编译器功能(Mul)来实现正方形(Square),但根据自定义表达式,可能需要添加新的材质编译器功能。

int32 UMaterialExpressionSquare::Compile(FMaterialCompiler* Compiler)
{
   if(!A.Expression)
      return Compiler->Errorf(TEXT("Missing Multiply input A"));
   else
   {
      int32 Arg1 = A.Compile(Compiler);
      return Compiler->Mul(
         Arg1,
         Arg1
         );
   }
}

GetCaption()返回在材质编辑器图表中作为节点说明显示的文本。

FString UMaterialExpressionSquare::GetCaption() const
{
   return TEXT("Square");
}

您的新材质表达式现在应该位于材质编辑器的列表中。在下面,您可以看到Square表达式的作用方式:

MaterialExpression.png

Tags
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback