UE【材质编辑】Shader模板

【UE 4.27.2】

在UE中双击材质球会进入材质编辑界面。PBR的材质参数呈现为材质蓝图的各个节点,提供数据源,传递进材质。最后材质对其进行组织,呈现为VS,PS等着色器代码,基本流程:

本文会刨析在UE4.27.2中材质模板是如何应用的。

1.认识编辑器中的材质

打开任意材质球,双击进入材质编辑面板:

此界面形象展示了材质参数传递到材质(实例)的过程,而材质最终的呈现是Shader,我们可以打开"window->Shader Code->HLSL Code"展开Shader界面:

注意看顶上的注释:1.MaterialTemplate.ush;2.FHLSLMaterialTranslator::GetMaterialShaderCode

两个关键信息。

2.Shader模板文件

查看MaterialTemplate.usf文件(左侧),与展开的Shader界面(右侧)代码对比:

右侧标红部分为差异代码,绝大多数一致,其中差异部分如图:

不难看出,左侧模板文件在数值部分提供了一些占位符,而右侧则完成了字符的填充。

3.Shader模板填充

在编辑器中的Shader已完成了字符填充,而执行填充的位置如下:

3.1读取Shader模板

FHLSLMaterialTranslator::Translate

此时MaterialTemplate保留着最原始的模板字符串(含占位符)

3.2产生HLSL

原始的字符模板深拷贝,以供填充使用

主要解释一下PushParam函数:

cpp 复制代码
void PushParam(const TCHAR* Data)
    {
        if(ProcessUntilPercentS())
        {
            // %s被跳过,然后此处直接替换为对应数据
            CurrentState += Data;
        }
        else
        {
            // internal error, more ReplacePercentS() calls than %s in MaterialTemplate.usf
            check(0);
        }
    }



bool ProcessUntilPercentS()
    {
        //查找CurrentInputPos中第一个%s
        const TCHAR* Found = FCString::Strstr(CurrentInputPos, TEXT("%s"));

        if(Found == 0)
        {
            return false;
        }

        // copy from input until %s
        // 将%s之前的内容给到CurrentState ,且CurrentInputPos设置到%s位置
        while(CurrentInputPos < Found)
        {
            // can cause reallocations we could avoid
            CurrentState += *CurrentInputPos++;
        }

        // jump over %s
        // 跳过后方便直接替换数据
        CurrentInputPos += 2;

        return true;
    }

巧妙地通过跳过%s和填充数据实现了替换,并通过 CurrentState 和CurrentInputPos实现对处理后数据与处理前数据的分离;

4.填充参数解析

关键填充参数来源

一共32项

获取一些公共代码

以上可以理解为Shader模板共有的一些代码,除此之外还有根据Material定义的一些数据:

这部分接口反映出了材质实例的特性;

最后填充在#line 后一个行数

以此表明之后的都是公共模板代码:

5.在材质模板中加入自己的代码

包含自己的usf文件

打开Shader模板,包含我们自己的usf文件;

我们在这个文件中可以实现自己的一套工具函数:

添加自定义节点

然后,添加一个Custom节点,在其中就可以调用我们这个函数:

值得一提的是,添加Custom节点,并把它连接到有效的Pin上,会调用FHLSLMaterialTranslator::CustomExpression我们可以在其中添加一段注释:

然后看一下此时的Shader实例文件:

我们自定义的文件及函数被使用,连接到的节点被压入Shader实例文件中。

相关推荐
da_vinci_x4 天前
Substance 3D 材质流:AI 快速生成与程序化精修
人工智能·游戏·3d·材质·设计师·技术美术·游戏美术
da_vinci_x7 天前
Painter AI 材质 x 智能遮罩:告别“风格化”手K地狱
人工智能·aigc·材质·设计师·技术美术·工作流·游戏美术
CG_MAGIC7 天前
3ds Max材质高清参数设置:10分钟提升渲染真实感
3d·vr·3dmax·材质·vray·渲云渲染
云卓SKYDROID8 天前
无人机探测器技术要点解析
人工智能·无人机·材质·高科技·云卓科技
我救我自己10 天前
UE5.6 玻璃材质——Lumen
ue5·材质
DvLee102410 天前
UnityGLTF 材质创建与赋值流程
unity·材质
njsgcs11 天前
tekla python 获取所有材质信息 截面类型
材质
小喵要摸鱼12 天前
衣服面料材质宝典
材质
zhangzhangkeji15 天前
UE5 材质-17:水材质系列一 ,panner 平移节点,
ue5·材质
患得患失94915 天前
【threejs】材质共享导致的典型问题
材质·threejs