中EN
概念页

Custom 材质表达式

Custom Material Expression

更新于 2026-10-15 约 6 分钟UE5材质CustomHLSL常量折叠HLSLccDXC

Custom 节点允许在材质图里直接写 HLSL:任意数量输入、指定输出类型,可选额外输出、#define 与外部 .ush/.usf 包含路径。它是「内置节点做不到」时的逃生口;代价是无法常量折叠、输入仅函数局部可见、且必须是合法 HLSL。优先用内置节点与材质函数,只在必要时上 Custom。

节点能做什么

从材质面板 Custom 分类或右键搜索放入。选中后 Details 中的关键属性:(Custom Material Expressions)

属性含义
Code要执行的 HLSL(见下方警告)
Output Type主输出数据类型
Description节点标题栏显示名
Inputs / Input Name输入数组;名称既是图上针脚名,也是 HLSL 里引用该输入的标识符
Additional Outputs额外输出针脚(Output Name + Output Type)
Additional Defines额外宏(Define Name + Define Value)
Include File Paths从引擎已提供的公共着色器路径之外包含源文件

用法:按需加输入并命名 → 在 Code 里写带 return 的函数体,或写简单表达式(如 Input.bgr)→ 设好 Output Type。(Custom Material Expressions)

官方示例:用 Texture2DSample 在 UV 上按半径 r、步长 dist 做十字形累加模糊,再除以 2*(2*r)+1 后 return blur——典型「内置节点能拼但很丑、或需要显式循环」的场景。(Custom Material Expressions)模糊/卷积的通识背景见 图像处理与后处理、着色器纹理采样。

陷阱 1:输入参数是函数局部的

Custom 表达式总是有返回值,因为整段 Code 被包在外层函数里。所有输入(如 Tex、UV、r)是该外层函数的形参,作用域是函数局部。

若在 Code 里定义带成员函数的 struct,成员函数看不到这些形参,必须手动拷贝进结构体再调用。下面这种写法会编译失败(假定输入名与官方模糊例相同):(Custom Material Expressions)

struct InnerStruct
{
  float4 Run()
  {
    // ERROR: Tex / TexSampler / UV 在 InnerStruct 内不可见
    return Texture2DSample(Tex, TexSampler, UV);
  }
};
InnerStruct S;
return S.Run();

这与手写 GLSL/HLSL 时「嵌套函数/成员访问捕获外层变量」的直觉不同——在 UE Custom 里要按「已被包进函数」来想。GLSL 片元语法对照见 片元着色器与 GLSL 基础(语言不同,但「作用域」教训可迁移)。

陷阱 2:HLSLcc 后端与类型写法

部分仍走旧 HLSLcc 的着色后端会对 vector / matrix 一类写法报语法错。官方建议写明确类型:float4、float4x4。引擎在修这类 bug,同时把精力转向 DirectXShaderCompiler (DXC)。(Custom Material Expressions)

警告:禁止常量折叠 → 可能更贵

官方两条硬警告:(Custom Material Expressions)

  1. Custom 阻止常量折叠,指令数往往显著多于等价内置节点图。引擎会把「整次 draw call 恒定」的链(例如 Sin → 乘参数 → 再加)收成更少指令;Custom 内部引擎什么都折叠不了。因此:只有内置节点做不到时才用 Custom。
  2. Code 必须是合法 HLSL。

折叠机制与 LocalN / ScalarExpressions 打包见 材质图到 HLSL 的翻译。(How the Unreal Engine Translates a Material Graph to HLSL)

flowchart LR
  subgraph builtin ["内置节点链"]
    N1["Sin"] --> N2["Mul 参数"] --> N3["Add"]
  end
  subgraph fold ["翻译器"]
    F["常量折叠"]
  end
  subgraph custom ["Custom 节点"]
    C["整段 HLSL 黑盒"]
  end
  builtin --> fold
  fold --> H1["更少 GPU 指令"]
  custom --> H2["无法折叠"]

实践建议

  • 先查材质表达式/材质函数库;噪声、塑形、图案等程序化块优先复用或对标 噪声函数、塑形函数、程序化图案 的思路,用节点实现。
  • 需要显式循环、特殊 intrinsic、或已有 .ush 工具函数时再用 Custom;用 Include File Paths / Additional Defines 接引擎着色器库,而不是把大段工具代码贴进每个材质。
  • 改完用 Window → Shader Code → HLSL Code 确认自己的 Code 如何被包进外层函数;再用 viewmode shadercomplexity(Alt+8)看指令热度——见 UE5 性能分析。(Shader Complexity (from Viewport Modes))
  • 材质域、着色模型、混合模式仍由主材质属性决定;Custom 只替换「某一段表达式」,不替代 材质系统 的整体选择。
  1. Custom Material Expressions UE 5.8 文档
  2. How the Unreal Engine Translates a Material Graph to HLSL Epic KB
  3. Essential Material Concepts UE 5.8 文档

相关页面

游戏开发 · UE5材质系统Material SystemUE 材质 (Material) 是用节点图描述「表面如何与光交互」的着色器生成器。它有三个正交维度:着色模型 (Shading Model) 决定光照模型(Default Lit、次表面、清漆、毛发等),混合模式 (Blend Mode) 决定与背景的合成公式(Opaque/Masked/Translucent…),参数 + 材质实例 (Material Instance) 让美术在不重编译着色器的前提下做变体。PBR 输入(Base Color/Roughness/Metallic/Specular)直接对应 RTR4 的金属度-粗糙度工作流;最大的工程坑是静态参数导致的着色器排列爆炸。游戏开发 · UE5材质图到 HLSL 的翻译Material Graph to HLSL Translation材质编辑器点 Apply 之后,引擎先把节点图翻译成 HLSL,再把 HLSL 编译成 GPU 字节码。翻译以 MaterialTemplate.ush 为模板、由 FHLSLMaterialTranslator 做文本替换与常量折叠;内置节点能被折叠,Custom 材质表达式 则不能。每个材质还会按特性/平台/用途生成多份着色器排列。图形学片元着色器与 GLSL 基础Fragment Shaders & GLSL Basics片元着色器(fragment shader)是在每个像素(片元)上并行执行的小程序:输入位置等信息,输出颜色。GLSL 是 OpenGL / OpenGL ES / WebGL 共用的着色语言;本书用全屏 billboard 上的像素着色练习,建立程序化图形的基础心智模型。图形学着色器纹理采样Shader Texture SamplingGPU 把图像存成 sampler2D:一张浮点向量的「表」,坐标连续时硬件做插值。片元里用 texture2D(sampler, uv)(现代 GLSL 为 texture)按归一化 UV 取色。BoS 强调:通道是 [0,1] 连续域、可越界重复、可用噪声扭曲 UV——图像变成可拉伸的「数码软垫」,为后处理与光学玩具式特效铺路。图形学可编程着色器与 GPU 管线Programmable Shaders & GPU PipelineGPU 把第 2 章的概念管线实现为一组硬件阶段,分为完全可编程、可配置但不可编程、完全固定三类。现代 GPU 采用统一着色器架构:各类着色器共用同一套编程模型和核心,由 GPU 自行分配负载。着色器用 HLSL、GLSL 等类 C 语言编写,输入分为 uniform 和 varying 两类。图形学像素着色器Pixel Shader像素着色器(OpenGL 里叫片元着色器)对光栅化产生的每个片元运行,用插值后的顶点数据算出颜色,也可以输出不透明度、修改深度或直接丢弃片元。多渲染目标让它一次输出多组数据,催生了延迟着色。它通常只能写自己所在的像素,但能通过 2×2 quad 拿到相邻像素的导数。图形学着色频率与材质系统Shading Frequency & Material Systems实现着色时要按"计算频率"划分工作:整个 draw call 不变的放到应用端作为 uniform,其余放在相应的可编程阶段。实践中大多数着色在像素级完成,顶点着色器负责变换和变形。材质系统把面向美术的材质与底层着色器组织起来,处理海量着色器变体的组合问题。游戏开发 · UE5UE5 性能分析UE5 ProfilingUE5 性能分析的基本流程是:先用 stat unit 判断瓶颈在游戏线程、渲染线程还是 GPU,再用对应的 stat 组、profilegpu/GPU 统计或 Unreal Insights 的 Timing/Memory 等视图向下钻取;渲染特性(RDG、VSM、TSR)各自提供作用域和可视化。测量时要避开会扭曲数据的设置(调试构建、异步计算、可视化模式)。图形学图像处理与后处理Image Processing & Post-Processing后处理是在渲染出图像后再用 GPU 对其做图像处理:把离屏缓冲当纹理,用全屏 pass 让像素着色器(或计算着色器)对每个像素采样邻域并加权求和。核心技巧包括可分离滤波、利用双线性插值减少采样、降采样、以及借助深度/法线保持边缘的(联合)双边滤波(RTR4 12.1 节)。图形学噪声函数Noise FunctionsKen Perlin 为电影《电子世界争霸战》(Tron) 设计的噪声,解决「看起来随机却不像电视雪花」的程序纹理问题。入门路径是值噪声 (value noise):格子角点取伪随机,格内用平滑曲线插值;进阶有梯度噪声 (gradient noise)、五次插值改进版,以及用单纯形网格降复杂度的 Simplex Noise。游戏美术Filament 材质模型参数Filament Material Model ParametersGoogle Filament 的 Lit(标准)模型按 Disney/UE/Substance 互通思路设计,用 baseColor、metallic、roughness、reflectance 等参数描述导体与电介质,并叠加 clearCoat、sheen、iridescence、transmission 等层。本页从美术/TA 角度说明含义、合理范围,以及与 UE / Substance 的对照;不做 BRDF 公式展开。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原