中EN
概念页

材质系统

Material System

更新于 2026-10-15 约 14 分钟UE5材质材质实例着色模型混合模式PBR

UE 材质 (Material) 是用节点图描述「表面如何与光交互」的着色器生成器。它有三个正交维度:着色模型 (Shading Model) 决定光照模型(Default Lit、次表面、清漆、毛发等),混合模式 (Blend Mode) 决定与背景的合成公式(Opaque/Masked/Translucent…),参数 + 材质实例 (Material Instance) 让美术在不重编译着色器的前提下做变体。PBR 输入(Base Color/Roughness/Metallic/Specular)直接对应 RTR4 的金属度-粗糙度工作流;最大的工程坑是静态参数导致的着色器排列爆炸。

材质是什么

官方定义:材质 (Material) 定义场景中物体的表面属性,可理解为涂在网格上的「颜料」;更技术地说,它告诉渲染器表面如何与光交互——颜色、反射、凹凸、透明度等,数据来自纹理和基于节点的材质表达式 (Material Expression),以及材质自身的属性设置。(Materials (landing))

从图形学角度看,材质图 (Material Graph) 本质上是一个可视化的着色器生成器:节点是 HLSL 片段的可视化,Apply 时先被翻译成 HLSL 再编译成 GPU 字节码,所以「改图 = 重编译着色器」。(Essential Material Concepts、Materials (landing))翻译管线、MaterialTemplate.ush、常量折叠与 LocalN 见 材质图到 HLSL 的翻译;需要手写 HLSL 时用 Custom 材质表达式(会阻止常量折叠)。这与 着色频率与材质系统 的「材质模板 → 着色器变体」同一问题。材质函数 (Material Function) 把一段图打包成可复用节点,分层材质 (Layered Materials) 用于组合复杂表面;UE 5.x 另有 Substrate 材质框架作为单独主题。(Materials (landing)、Essential Material Concepts)

三个正交的选择:着色模型 × 混合模式 × 参数

flowchart LR
  G["材质图 节点网络"] --> SM["着色模型 Shading Model
光如何反射"]
  G --> BM["混合模式 Blend Mode
与背景如何合成"]
  G --> P["参数 Parameters"] --> MI["材质实例 MIC / MID"]

PBR 输入与 RTR4 理论的对应

UE 的 PBR 输入是 Base Color、Roughness、Metallic、Specular,取值都在 0–1;官方引用 Karis《Real Shading in Unreal Engine 4》、Burley(Disney)等文献。(Physically Based Materials)它们与 基于物理的着色 和 双向反射分布函数 中金属度/粗糙度工作流一一对应:

UE 输入官方规则理论对应
Base Color偏振滤镜下拍到的颜色;非金属如木炭 0.02、新雪 0.81非金属为漫反射反照率,金属为 F0F_0
Roughness0 镜面、1 哑光;表面变化应放在粗糙度贴图微表面法线分布宽度
Metallic纯材质只用 0 或 1,锈蚀灰尘等混合表面才用中间值;遮罩应黑白分明导体/电介质切换
Specular默认 0.5 ≈ 4% 镜面反射,适用于绝大多数材质;不要为了“很漫反射”设为 0,应提高粗糙度电介质 F0F_0(由 IOR 决定)

官方给出的 Specular 0.5 对应约 4% 反射,正是常见电介质 F0=(n−1n+1)2≈0.04F_0=\left(\frac{n-1}{n+1}\right)^2\approx0.04(n≈1.5n\approx1.5,公式为通识)。Cavity 贴图用法:BaseColor=Cavity×OldBaseColor\text{BaseColor}=\text{Cavity}\times\text{OldBaseColor},Specular=Cavity×0.5\text{Specular}=\text{Cavity}\times0.5,用于补法线贴图里实时阴影捕捉不到的微小遮蔽。(Physically Based Materials)纹理采样本身见 纹理映射管线。

着色模型 (Shading Models)

着色模型决定输入数据如何组合出最终外观。(Shading Models)

着色模型用途 / 要点对应理论页
Unlit只输出自发光;本身不照亮场景,除非开启 Lumen 或 Lightmass 的自发光静态光照Lumen 全局光照与反射
Default Lit默认,直接+间接光照与高光基于物理的着色
Subsurface / Preintegrated Skin / Subsurface Profile次表面散射;预积分皮肤更便宜、精度略低;Subsurface Profile 是最高质量皮肤实时次表面散射
Clear Coat标准材质上覆一层透明薄膜(车漆、易拉罐),可选双法线薄膜干涉与分层材质
Two Sided Foliage薄表面透光(树叶);Default Lit 叶片背面会发黑—
Hair / Cloth / Eye多重高光 / 绒毛层 / 虹膜控制;Eye 官方建议直接用 Digital Humans 的眼睛材质毛发渲染、布料着色
Single Layer Water用 Opaque 混合模式做透明水面,比半透明便宜—
Thin Translucent单 pass 物理正确的有色玻璃透明渲染与 Alpha 混合
From Material Expression逐像素在一个材质里混用多种着色模型—

在延迟渲染下,着色模型 ID 写入 G-Buffer 供光照 pass 分支使用(通识,见 UE5 渲染架构)。

混合模式 (Blend Modes)

混合模式控制本材质(源色)如何与帧缓冲中已有颜色(目标色)合成。官方公式(Material Blend Modes):

模式公式动态光照
OpaqueC=CsC=C_s兼容
MaskedCsC_s 若 OpacityMask > Clip 值,否则丢弃像素兼容
TranslucentC=Csα+Cd(1−α)C=C_s\alpha+C_d(1-\alpha)表中标注不兼容
AdditiveC=Cs+CdC=C_s+C_d不兼容
ModulateC=Cs×CdC=C_s\times C_d不兼容(贴花除外)
AlphaCompositeC=Cs+Cd(1−αs)C=C_s+C_d(1-\alpha_s)(预乘 Alpha)—
AlphaHoldoutC=Cd(1−αs)C=C_d(1-\alpha_s)不兼容

要点:Masked 被裁掉的像素完全不绘制(因此也没有反射),但省 GPU;Clip 值不是为运行时修改设计的。Translucent 官方说明当前不支持高光反射,可用 Cubemap 叠加伪造。Additive 在亮背景上难以看清,可改用 AlphaComposite。AlphaHoldout 只能作用于其后的半透明类材质,不能打穿 Opaque。(Material Blend Modes)排序与 OIT 等通用问题见 透明渲染与 Alpha 混合。

材质实例 (Material Instances)

普通材质改图要重编译(复杂材质可能要近一分钟),而参数化材质可在材质实例里改值而不重编译。实例继承父材质全部属性,但只有在父材质中声明为参数的值可改:Scalar(单浮点)、Vector(4 通道)、Texture(如 TextureSampleParameter2D、Cube)等;常量不暴露。命名惯例 M_(父)/MI_(实例)。(Material Instances)

类型何时计算用法
Material Instance Constant (MIC)运行前计算一次内容浏览器创建;车漆颜色变体等
Material Instance Dynamic (MID)运行时可改C++/蓝图 Create Dynamic Material Instance → Set Material;受损程度、实时换色

静态参数 (Static Parameters)(StaticSwitch、Static Component Mask)在编译期生效,被关掉的分支运行时不执行,但父材质中被实例使用到的每种静态参数组合都会编译一个新材质——这是着色器排列爆炸的主要来源,应尽量少用静态参数并控制实际使用的组合数。(Material Instances)

数据类型与 Custom / 翻译管线

材质图里流动的都是浮点:float / float2 / float3 / float4(Constant、Constant2/3/4Vector、Scalar/Vector Parameter、纹理)。Details 或节点内联写的值,一旦接到对应输入针脚就会被覆盖;Constant3Vector 可转成 Vector Parameter(实为 float4,float3 输入只用 RGB)。(Material Data Types、Essential Material Concepts)

创建材质后官方建议先设好 Material Domain / Blend Mode / Shading Model 三件套,它们决定主材质节点哪些输入可用(例如 Opaque 下 Opacity 灰掉)。(Essential Material Concepts)

手写 HLSL 与「图如何变成 CalcPixelMaterialInputs」不在本页展开:

需求去向
查看/理解生成的 HLSL、常量折叠、FHLSLMaterialTranslator材质图到 HLSL 的翻译
Custom 节点属性、函数局部输入、禁止折叠、HLSLcc 类型坑Custom 材质表达式
跨引擎 GLSL 片元练习(BoS / LearnOpenGL)片元着色器与 GLSL 基础
指令热度可视化UE5 性能分析 中的 Shader Complexity

实践与坑

  • 项目中常做少量「主材质 (Master Material)」+ 大量 MIC,运行时需要改的才建 MID(每个 MID 是独立对象,注意数量;此条为通识经验)。
  • Metallic 用灰度过渡、Specular 当高光贴图用,都是旧工作流的常见错误。(Physically Based Materials)
  • 材质域 (Material Domain) 决定材质的用途,有些用途(如贴花)需要渲染器做额外处理,所以非表面材质一定要设对(以下据 UE 5.7 Material Properties 页,5.8 页重定向未能抓取,Material Properties):
材质域用途
Surface默认值,物体表面(金属、塑料、皮肤等)
Deferred Decal贴花材质
Light Function灯光函数
Volume描述 3D 体积属性
Post Process后处理材质(另有 Blendable Location 色调映射前/后、Blendable Priority、基于自定义深度/模板的 Stencil Test)
User InterfaceUMG / Slate 界面
Virtual Texture运行时虚拟纹理 (Runtime Virtual Texture)
  • 使用标记 (Usage Flags):只对 Surface 域有效,例如 Used with Skeletal Mesh / Niagara Sprites / Instanced Static Meshes / Geometry Collections。引擎为每种用途单独编译着色器版本;编辑器会自动勾选,但必须保存材质。游戏中缺少对应标记时会改用默认世界网格材质并在日志中提示。多勾标记会增加着色器编译时间和内存(如 Mesh Particles)。(Material Properties)
  • 半透明光照模式:从最便宜的 Volumetric NonDirectional(不考虑法线,适合烟尘),到 Surface Translucency Volume(模糊但便宜,玻璃/水,只有漫反射),再到最贵的 Surface Forward Shading(逐像素计算每盏灯,支持局部光高光)。关闭深度测试会显著变慢。(Material Properties)
  • Max World Position Offset Displacement:限制 WPO 的最大位移,并把包围盒外扩相同距离,防止裁剪和跳变;对按簇在 GPU 上剔除的 Nanite 尤其重要。代价是位移被夹住的地方会显得压扁,动画可能卡顿;可用 Out of Bounds Pixels 显示标记检查。(Material Properties)
  • 粒子材质见 Niagara 粒子系统;PCG 的图实例机制与材质实例类似,见 PCG 程序化内容生成框架。
  1. Materials (landing) UE 5.8 文档
  2. Material Instances UE 5.8 文档
  3. Shading Models UE 5.8 文档
  4. Physically Based Materials UE 5.8 文档
  5. Material Blend Modes UE 5.8 文档
  6. Material Properties UE 5.7 文档(5.8 页重定向)
  7. Essential Material Concepts UE 5.8 文档
  8. Material Data Types UE 5.8 文档
  9. Custom Material Expressions UE 5.8 文档
  10. How the Unreal Engine Translates a Material Graph to HLSL Epic KB

相关页面

图形学基于物理的着色Physically Based Shading基于物理的着色从光与物质交互的物理出发,用 BRDF 和反射方程计算表面沿视线方向射出的辐射亮度:镜面项来自微表面理论与菲涅耳反射,漫反射项来自局部次表面散射,布料、波动光学与分层材质再作扩展。本页是 RTR4 第 9 章的总览,并收录该章第 9.13 节的材质混合与材质过滤(镜面抗锯齿)。图形学双向反射分布函数BRDFBRDF f(\mathbf{l},\mathbf{v}) 量化局部反射:只依赖入射方向 \mathbf{l} 和出射(观察)方向 \mathbf{v},涵盖表面反射与局部次表面散射。它通过反射方程把入射辐射亮度转换为出射辐射亮度,物理上需满足 Helmholtz 互易性与能量守恒,用方向反照率检验。方向光和精确光源可从小面光源的极限推导,使积分变为对光源的求和。本页对应 RTR4 9.3–9.4 节。图形学着色频率与材质系统Shading Frequency & Material Systems实现着色时要按"计算频率"划分工作:整个 draw call 不变的放到应用端作为 uniform,其余放在相应的可编程阶段。实践中大多数着色在像素级完成,顶点着色器负责变换和变形。材质系统把面向美术的材质与底层着色器组织起来,处理海量着色器变体的组合问题。图形学纹理映射管线Texturing Pipeline纹理通过修改着色方程中使用的值(颜色、粗糙度、法线等)来高效表现表面材质的变化。通用纹理管线是:空间位置 → 投影函数得到纹理坐标 → 对应函数变换到纹理空间 → 取值 → 值变换 → 用于着色。本页还整理纹理坐标约定、纹理表示方式、程序纹理、纹理动画、材质贴图、alpha 贴图和纹理光源。图形学透明渲染与 Alpha 混合Transparency & Alpha Blending本页讲最简单的"视角相关"透明:半透明物体只衰减其后方物体的颜色。z-buffer 每像素只存一个表面,所以透明物体通常要从后往前用 over 运算符混合;顺序无关透明 (OIT) 方法用多遍渲染、逐像素链表或近似公式避免排序,各有内存、性能或准确性代价。预乘 alpha 让过滤、混合和合成更正确高效。图形学实时次表面散射Real-Time Subsurface Scattering蜡、皮肤、牛奶等高散射固体中,光在离入射点不远处重新射出;当偏移大于一个像素时就不能再用 BRDF 表示。实时方法从便宜的包裹光照、法线模糊、预积分皮肤,到纹理空间/屏幕空间扩散,再到针对大尺度散射的深度图技术(RTR4 14.6 节)。图形学布料着色Cloth Shading布料的微几何与其他材质不同:可能有高度重复的编织结构、垂直伸出表面的纤维,或两者兼有,因此常需要专门的着色模型来表现各向异性高光、粗糙散射(半透明纤维造成的边缘亮光)以及随视角的颜色变化。布料 BRDF 分为经验模型、基于微表面理论的模型和微圆柱模型三类。本页对应 RTR4 9.10 节。图形学毛发渲染Hair & Fur Rendering毛发由角质层、皮质、髓质三层构成,可看作用曲线离散化的体积。几何上用沿引导曲线挤出的四边形条带并配合 alpha/顺序无关透明;着色用 BSDF(R、TT、TRT 分量),再加体积自阴影与多次散射近似;动物短毛可用壳与鳍或几何着色器挤出(RTR4 14.7 节)。图形学薄膜干涉与分层材质Thin-Film & Layered Materials几何光学假设表面不规则要么小于一个波长、要么大于约 100 个波长;真实表面在 1–100 个波长范围(纳米几何)也有不规则,会产生衍射,厚度接近光波长的表面薄膜会产生薄膜干涉,这些都需要波动光学。现实材质还常常层层叠加,最简单也最重要的是清漆层。本页对应 RTR4 9.11–9.12 节。游戏开发 · UE5UE5 渲染架构UE5 Rendering ArchitectureUE5 的渲染器是独立的 Renderer 模块,在渲染线程 (Rendering Thread) 上以「场景代理」镜像游戏线程的组件状态,每帧按固定顺序执行深度预通道、G-buffer 基础通道、光照、雾、半透明和后处理。现代渲染代码用渲染依赖图 (Render Dependency Graph, RDG) 声明通道与资源,由 RDG 自动排屏障、复用瞬态内存、并行录制;最终命令经 RHI 线程翻译成 D3D12/Vulkan 等图形 API 调用。默认走延迟着色 (Deferred Shading),也可切换前向着色 (Forward Shading)。游戏开发 · UE5Lumen 全局光照与反射Lumen Global Illumination & ReflectionsLumen 是 UE5 默认的全动态全局光照 (Global Illumination, GI) 与反射系统:先做屏幕空间追踪,未命中再对"Lumen 场景"做软件光追(有符号距离场)或硬件光追,命中点的光照从按网格离线放置的卡片 (Card) 构成的表面缓存 (Surface Cache) 中查询,表面缓存的直接与间接光照分摊到多帧更新,从而得到无限次漫反射弹射和全粗糙度范围的反射。游戏开发 · UE5Niagara 粒子系统Niagara VFX SystemNiagara 是 UE5 的 VFX 系统,由系统 (System) → 发射器 (Emitter) → 模块 (Module) 的栈式结构组成:发射器按 Emitter Spawn/Update、Particle Spawn/Update、Event、Render 分组,模块是自上而下执行、基于 HLSL 的「读-算-写」单元。继承、动态输入、事件和数据接口 (Data Interface) 提供复用与外部数据访问;发射器可选 CPU 或 GPU 计算着色器模拟。官方 5.8 文档未找到 CPU/GPU 对比页,相关取舍按通识标注。游戏开发 · UE5PCG 程序化内容生成框架PCG FrameworkPCG 框架把程序化内容表达为「点流」:PCG 组件/体积从关卡采样空间数据,图中的 Sampler 生成带变换、密度、种子与自定义属性的点,经过滤与变换后由 Spawner 生成网格或 Actor,编辑器中实时更新,也可运行时生成。属性分为 $ 静态属性和元数据动态属性,按 @Data/@Points/@Elements 域组织;图参数与图实例的用法类似材质参数与材质实例;与世界分区集成,生成物继承数据层与 HLOD 层。游戏开发 · UE5Substrate 材质Substrate MaterialsSubstrate 用一种更有表现力、更模块化的框架,取代旧材质系统里固定的一组着色模型和混合模式(Default Lit、Clear Coat 等)。材质被看作一块块「物质板 (Slab)」,每块是用有明确单位的物理量参数化的原则化 BSDF,再通过混合、垂直分层等运算组合成图。代价是光照评估更贵,所以提供参数混合和两种 GBuffer 格式(Blendable / Adaptive)来在速度和画质之间取舍。新项目默认启用 Substrate;升级到 5.7 及以后的老项目默认不启用。游戏开发 · UE5后处理体积与效果Post Process Volumes & EffectsUE 的后处理效果(调色、色调映射、泛光、曝光、景深、运动模糊等)通过后处理体积 (Post Process Volume) 或相机设置来指定,即使关卡里没有体积,引擎也有默认的后处理设置。多个体积重叠时按优先级 (Priority) 覆盖,用混合半径 (Blend Radius) 和混合权重 (Blend Weight) 平滑过渡;Infinite Extent (Unbound) 让体积作用于整个场景。游戏开发 · UE5天空大气与体积云Sky Atmosphere & Volumetric Clouds天空大气 (Sky Atmosphere) 组件是基于物理的天空与大气渲染:模拟瑞利散射 (Rayleigh)、米氏散射 (Mie) 和臭氧吸收,天色随太阳高度变化,并提供带行星曲率的空气透视,可以从地面平滑过渡到外太空。体积云 (Volumetric Cloud) 组件用材质驱动的三维体积纹理做光线步进,多次散射用若干「八度」近似,云的阴影可以用光线步进或 Beer 阴影贴图。游戏开发 · UE5移动端渲染优化Mobile Rendering Optimization移动端优化的核心是认清设备的 CPU/GPU 速度、线程、带宽和内存,然后控制最主要的几项开销:Draw Call(官方称其为当前导致图形性能低下的最大因素,在 Galaxy Tab S6 上建议约 700 个,低端设备少于 500 个)、材质复杂度和 overdraw。合并网格和材质(Substance 把多种材质画进同一张纹理,用顶点色作遮罩)是减少 Draw Call 最直接的办法。游戏开发 · UE5地形系统LandscapeUE5 的 Landscape 把地形切成大小相同的正方形组件 (Component),组件是渲染、可见性计算和碰撞的基本单位;每个组件可以再分成 1 个或 2×2 个分段 (Section),分段是 LOD 计算的基本单位。分段的顶点数必须是 2 的幂(最大 256×256),这样不同 LOD 可以存进高度纹理的 mipmap。地形材质用 Landscape Layer Blend 节点按权重图混合多个图层。图形学渲染开发与 GPU 调试工具Rendering Development & GPU Debugging Tools渲染引擎的运行时部分只是拼图的一块,还需要一批离线工具来制作内容、优化性能、诊断问题。GEA 介绍了四类:数字内容创作 (DCC) 工具、材质编辑器、资产调理管线,以及 PIX、Razor GPU 这样的 GPU 帧捕获、检查和回放工具(GEA4 卷 II 12.9)。游戏开发碰撞检测系统Collision Detection System碰撞检测系统判断游戏世界里的物体是否接触,本质上是一个"高级几何相交测试器",同时返回接触的详细信息。每个可碰撞对象由形状 + 变换描述,全部存放在独立的碰撞世界里;形状尽量用球、胶囊、盒、凸体等简单图元。为了在大量物体中快速找到真正相交的对,引擎使用时间相干性、空间划分,以及宽相、中相、窄相三级筛选(GEA4 卷 II 14.3)。游戏开发 · UE5材质图到 HLSL 的翻译Material Graph to HLSL Translation材质编辑器点 Apply 之后,引擎先把节点图翻译成 HLSL,再把 HLSL 编译成 GPU 字节码。翻译以 MaterialTemplate.ush 为模板、由 FHLSLMaterialTranslator 做文本替换与常量折叠;内置节点能被折叠,Custom 材质表达式 则不能。每个材质还会按特性/平台/用途生成多份着色器排列。游戏开发 · UE5Custom 材质表达式Custom Material ExpressionCustom 节点允许在材质图里直接写 HLSL:任意数量输入、指定输出类型,可选额外输出、define 与外部 .ush/.usf 包含路径。它是「内置节点做不到」时的逃生口;代价是无法常量折叠、输入仅函数局部可见、且必须是合法 HLSL。优先用内置节点与材质函数,只在必要时上 Custom。图形学片元着色器与 GLSL 基础Fragment Shaders & GLSL Basics片元着色器(fragment shader)是在每个像素(片元)上并行执行的小程序:输入位置等信息,输出颜色。GLSL 是 OpenGL / OpenGL ES / WebGL 共用的着色语言;本书用全屏 billboard 上的像素着色练习,建立程序化图形的基础心智模型。图形学可编程着色器与 GPU 管线Programmable Shaders & GPU PipelineGPU 把第 2 章的概念管线实现为一组硬件阶段,分为完全可编程、可配置但不可编程、完全固定三类。现代 GPU 采用统一着色器架构:各类着色器共用同一套编程模型和核心,由 GPU 自行分配负载。着色器用 HLSL、GLSL 等类 C 语言编写,输入分为 uniform 和 varying 两类。游戏开发 · UE5UE5 性能分析UE5 ProfilingUE5 性能分析的基本流程是:先用 stat unit 判断瓶颈在游戏线程、渲染线程还是 GPU,再用对应的 stat 组、profilegpu/GPU 统计或 Unreal Insights 的 Timing/Memory 等视图向下钻取;渲染特性(RDG、VSM、TSR)各自提供作用域和可视化。测量时要避开会扭曲数据的设置(调试构建、异步计算、可视化模式)。游戏美术PBR 贴图工作流PBR Texture WorkflowsPBR(Physically Based Rendering)贴图制作有两条主流工作流——金属度/粗糙度 (Metal/Roughness, MR) 与镜面/光泽度 (Specular/Glossiness, SG)。它们表达同一套物理数据,只是通道切分不同;Substance、UE、Filament 等以 MR 为主,SG 多用于兼容旧资产。本页从美术生产角度对照通道语义、引擎对应关系与取舍,不重复 BRDF/微表面公式(见图形学 基于物理的着色)。游戏美术Filament 材质模型参数Filament Material Model ParametersGoogle Filament 的 Lit(标准)模型按 Disney/UE/Substance 互通思路设计,用 baseColor、metallic、roughness、reflectance 等参数描述导体与电介质,并叠加 clearCoat、sheen、iridescence、transmission 等层。本页从美术/TA 角度说明含义、合理范围,以及与 UE / Substance 的对照;不做 BRDF 公式展开。

被这些页面引用1 篇

输入关键词开始搜索

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