关于 scenario-unreal-materials
面向 Unreal 环境美术师的材料制作技能,涵盖材质主干、Substrate、纹理与着色器成本。通过预算、静态实例和可测量的质量门槛组织制作流程。
主要功能
- 01规划材质家族与静态开关
- 02打包、导入和审计纹理
- 03构建材质主干与实例预设
- 04检查着色器数量与材质成本
- 05评审 Substrate、玻璃和贴花
适用场景
- 01为一组资产规划可复用材质
- 02检查纹理设置与材质图
- 03比较固定视角下的渲染成本
- 04交付前审计材质实例和纹理内存
MCP 相关
内容提到可通过 Epic 的 MCP server 执行 Unreal 编辑器 Python 工作流;该技能本身是指导材质制作与审核的流程。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-unreal-materials安装后在 Claude Code 中输入/scenario-unreal-materials确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/ue_materials.py详细介绍
Unreal 材质(主材质、Substrate、纹理、着色器开销)
专家级意味着用少量主材质及其实例覆盖整套资源包,排列组合数量已知且纳入预算,在固定摄像机视角下以毫秒为单位验证开销,并且在进行任何艺术化调整前确保数值符合物理规律。材质图只编写一次(通过脚本构建或使用模板);其他所有内容都使用实例、Custom Primitive Data 和遵循角色策略的纹理。切勿轻信指令数或好看的预览。如果此处提到的某个同级技能不在你的可用技能中,请让用户安装它(npx skills add scenario-labs/skills --skill <name>);若无人值守,则根据工具架构继续操作,并标明这一缺失。
必备背景: scenario-unreal-expert(通道、审查循环、5.8 陷阱)。
状态(2026-09-24): 尚未安装 Unreal;离线测试通过
(tests/code/unreal-materials/run_all.sh,在虚假的 unreal 上运行编辑器层)。所有代码片段尚未在 Unreal 中运行:请先运行 P0。
立场(专家增量)
- 排列组合 = 用途标记 x 跨实例的唯一静态参数集(x 启用 Quality Switch 时的质量级别),绝不是节点数量。 父级标记会为每个唯一子级增加一个着色器行(Lauf 和 Nadro,Fortnite [wobQ8ZKQpbc 00:24:25, 00:05:32]);父级携带的标记最少,由实例选择加入(5.8 Usage Flag Overrides [verify])。添加开关前,先统计会设置它的实例数量(
switch_ranking);Fortnite 保留了排名前 10 的开关 [00:29:31]。 - 静态开关必须控制纹理采样,或控制大多数实例都会跳过的重运算。 其他情况使用 If(参数接 A,0.5 接 B,A > B 引脚,绝不用 A == B)、绑定到 Enum 的标量或 Channel Mask Parameter;Static Component Mask Parameter 已废弃(Lauf [00:40:24, 00:40:56, 00:42:35])。可编辑开关即使保持默认值,也会设置 HSPR 标记(5.7)。
- 指令数量不等于成本。 正弦加余弦会多读取 +2,但成本约为 40 个 GCN 周期;一次取样约需等待 200 个周期(Swierad [y0QASid1v8w 00:20:57, 00:35:57])。与取样无关的运算可以隐藏在这段等待中(屏幕扫描线几乎没有成本);对采样值执行的运算则要全额付费 [00:39:34, 00:46:03]。控制采样和超越函数的预算(
cost_census),打开每个材质函数逐一检查(名称里写着“cheap”不代表经过测量 [00:22:31]),并在固定摄像机视角下根据毫秒数做决定。 - Substrate 从一个 slab 开始(Morgan,Epic [SqPaL8HS_Lw 00:25:45]):使用 Slab 或 Metalness 辅助节点,绝不手动添加 Substrate Shading Model 节点(转换目标、Substrate 概览)。Blendable 是所有平台的上限,SM6 也不例外(5.7 文章);Adaptive 会自行按平台回退,成本为 20 到 80 B/px(4K 下为 663 MB),Cook 时间约增加 +15%,并强制使用 DBuffer decals(Ben Cloward [P5I38f2O6W8 00:05:46, 00:06:54])。材质转换不可逆。
- 金属与漆面相邻时应使用两个 slab,而不是灰色金属材质(灰色看起来像灰泥,Ben [VrY_SSvWdQ4 00:05:39])。使用 Use Parameter Blending 时,Horizontal Blend 几乎无损,且处处只需一个 slab(Morgan [00:37:35]):此时遮罩锐度由艺术效果决定,而非成本。“Mix 恰好为 0 或 1 时只计算一个 slab”仅适用于未启用参数混合且使用 Adaptive 的情况 [00:29:38]。Vertical Coat 上的参数混合会造成损失并向下传播:应提前规划 [00:38:08, 00:38:43]。
- 细节来自贴图打包和平铺,而非分辨率。 每个地形层使用两个采样(CR + NOH),游戏分辨率上限为 2K,按用途压缩,仅颜色使用 sRGB,打包法线绝不能使用 Normalmap,无关通道使用 BC7(Ben [-UZlUUQSGgQ 00:12:36],[gjOO5g4cgng 00:11:02];Sumo [SAr7oPKsgLE 00:29:20];textures doc)。内存占用应以 Platforms 面板和已 Cook 构建中的
listtextures为准;RDO 减少的是磁盘占用,而非内存占用。 - 玻璃是物质,而非不透明度: 仅在需要着色时使用 Colored Transmittance(Gray 成本更低)、Surface Translucency Volume、平板玻璃使用 Pixel Normal Offset,以及带有 Transmittance-To-MFP 的 slab Simple Volume(Ben [sf-K257zWh8 00:01:39, 00:09:17])。
- RVT 是在时间 0 以正交方式捕获的缓存: 写入通道中不能使用 Time、Panner、摄像机距离、视差或 MPC;页面变化会重绘其所有写入者;每个采样的不同 RVT 都有较高的固定成本(PrismaticaDev [RLEPA16QDRw 00:20:14, 00:11:59, 01:04:29])。
首先确定
| 输入 | 影响内容 | 未明确时的默认值 |
|---|---|---|
| 平台和帧率 | GBuffer 格式(所有 Blendable 上限)、闭包、采样器(ES3.1 上为 16 个)、仅限 Adaptive 的功能 | 主机平台 60 Hz,PC:Blendable、1 个闭包 |
| 项目 Substrate 状态 | ini 中的 r.Substrate(P1);升级后的项目保持旧版 | 读取该值,切勿假设 |
| 风格 | PBR;Toon BSDF(按资源设置,实验性);后处理 EV cel(整个世界) | PBR |
| 架构 | 精简主材质或 Material Layering System (Sumo),根据库大小和预计排列组合数(lauf_permutations)决定 | 精简主材质,少于 10 个预设 |
| 全世界通用的数值(潮湿度、警戒状态) | MPC:每种材质最多 2 个;添加参数会导致所有使用者重新编译(见实例文档) | 一个全游戏通用,一个每关卡通用 |
| 每个系列的网格类型 | 用途标记:静态、Nanite、骨骼、布料、Niagara、贴花、UI | 静态 + Nanite |
| 纹理来源 | 打包方式、DirectX 绿色通道、纹素密度、源尺寸 | ORM 打包、DirectX、2K |
| 预算 | 采样数、透明混合、唯一静态集合、着色器、BasePass 毫秒数、纹理池 | 由项目决定;超过 12 个采样时,lint 会发出警告 [已添加] |
工作流
- 探测并决策。 P0
um.probe()会列出 5.8 实际提供的内容;P1 读取 ini 并运行um.choose_gbuffer_format(targets, needs),其原因会说明上限和回退方案。 GATE:修正CANDIDATES;记录格式决策。 - 规划材质系列。 每个领域和混合模式各设一个主材质(表面、玻璃、屏幕、贴花、UI
Material、地形),并为每个主材质列出开关及其控制内容、获批预设、各网格类型的使用标记、
示例和闭包预算、MPC。GATE:每个开关都控制一个纹理,并有
switch_ranking计数;通道选择使用 Channel Mask Parameters;记录架构。 - 纹理(P2):
pack_channels、import_textures、audit_textures(apply=True)、albedo_stats。GATE:审计通过;驻留大小不超过 2048;lint_graph(g, textures=...)未发现采样器不匹配;法线贴图在生成 Mip 后保留 Normalize;反照率 sRGB 值为 20(粗糙材质为 50)到 240,金属材质至少为 180。 - 构建主材质(P3、P4):使用
um.build_kit_surface或模板:纹理控制开关、用于 绘制蒙版源的 If、用于逐 Actor 磨损和污垢的 Custom Primitive Data、Specular = 0.5 x (1 - cavity) 作为高光遮蔽。Substrate:Metalness 辅助节点为基础层提供输入,裸金属层使用 反照率 0 和实测 F0,参数混合的 Horizontal Blend 使用磨损蒙版。可选方案:值钳制 ID 蒙版, 每通道 4 个频带(Sumo [00:14:54]);跨模块接缝的世界对齐纹理和法线,每个纹理 3 次采样(Ben [pXOknekvmwE 00:12:57]); 世界空间定向灰尘(Sumo [00:20:11])。GATE:没有断开的连线;lint_graph无 fail 和 warn;一个闭包;编译日志干净。 - 实例(P5、P6、P16):只有
make_presets会设置静态开关;子实例只更改值; Custom Primitive Data 用于改变已放置 Actor 的属性。GATE:唯一参数集数量不超过预设数量,默认值未被覆盖,只在预设中使用 HSPR;audit_instance_values_project检查通过(电介质 F0 不超过 0.08,金属反照率为 0,Metallic 为 0 或 1)。 - 使用标记和着色器(P7):在实例上固定需求,然后清除父级标记;关闭自动使用标记;
对仅用于贴花、UI 和 Niagara 的材质关闭 Used with Static Mesh(Nadro [00:18:38]);
每个根材质运行
shader_count(仅为上限)。5.8 只会编译已连接且非零的输出 (r.Material.UseShaderCompilationParameters):删除节点来剥离着色器只是无稽之谈。 只有在测量后才调整 Skin-cache 和 Slate 开关(P7)。GATE:着色器数量在预算内;回退方案检查板上没有灰色默认材质。 - 特殊系列。 屏幕:使用测光表校准自发光。对于滚动文本上的 TSR 涂抹,使用实验性的 Temporal Responsiveness 节点并添加蒙版,同时在 Nanite 网格上设置
r.Velocity.TemporalResponsiveness.Supported=1和较小的 WPO(5.7 文章)。 贴花(P14)以 Convert To Decal 结尾;重叠的 DBuffer 表达式贴花不会混合;每个接收材质的 Decal Response 仅覆盖其贴花写入的通道(decal_response_for)。 地形 P11、风格化材质 P12 和 P13、开关排查 P8。GATE:references/critique.md中对应的材质系列内容。 - 成本 A/B 对比(P9,实时编辑器):固定摄像机,
r.ScreenPercentage 100,预热,CSV 分析, GPU 和通道耗时的中位数,并列出cost_census。GATE:差值在预算内;仅将指令计数记录为参考信息。 - 外观评审(P10、P15):在关卡光照下查看预设检查板、缓冲区可视化和 Substrate 视图。
若 Substrate 表现出乎意料,先打开 Window > Substrate:按降级顺序查看功能、参数混合预览(Morgan [00:12:51, 00:38:43])。
在任何人查看前运行
ue_review.review_images。GATE:通过评审标准。 - Cook 后检查与交接(P17):通过
texture_memory_findings检查listtextures、stat streaming和r.Streaming.PoolSize;交付报告、截图和未解决的[verify]项。
数值
| 数值 | 相对于 | 来源 |
|---|---|---|
| Specular 0.5 = F0 0.04(4%) | 非金属的 90 至 98% | Ben [fePsD_8p9vM 00:12:09] |
| Dielectric F0 至多 0.08;宝石、碳纤维最高约 0.18 | 旧版 Specular 跨越 IOR 1 至 1.788 | Morgan [00:09:30] |
| Metal:albedo 0,F0 平均至少 0.5(文档)或 0.6(Ben) | 基底层 | Ben [a94Lpu1_4dg 00:16:16] |
| Base color sRGB 20 至 240,粗糙时下限为 50;金属至少 180 | 8 位 sRGB | Ben [fePsD_8p9vM 00:05:28, 00:22:48] |
| Glass IOR 1.5,MFP 厚度 0.02;磨砂粗糙度 0.2 至 1 | 开启粗糙折射 | Ben [sf-K257zWh8 00:11:02, 00:17:16] |
| 10 个着色器,使用 Skeletal 时为 20 个,使用 Niagara 网格时为 27 个,启用所有标志时为 186 个 | 单个材质,取决于项目 | Nadro [00:06:28, 00:07:05] |
| Fetch 约 200 个周期;multiply 为 4;sine 约为 20 | AMD GCN:仅为排名,不代表 Apple 的实际情况 | Swierad |
| BC1 2048 = 2.66 MiB(含 mip);BC3、BC5、BC7 为其两倍;BC6H 为 RGBA16F 的八分之一 | GPU 内存 | 纹理文档 |
质量门槛
- 可测量:
lint_graph(使用textures=和项目budgets=)没有 fail 和 warn; 普查结果符合预设;audit_textures和audit_instance_values_project通过;每个根目录的shader_count; BasePass、Translucency、DBuffer 的毫秒数 A/B 对比;Blendable 上的 Substrate Material Count 为 1; 静止时 VirtualTextureUpdate 接近于零;烘焙后的texture_memory_findings无问题;没有空白帧。 - 视觉效果(
references/critique.md):过渡看起来像两种材质;边缘有磨损,凹陷处有污垢,Specular 缓冲区中的缝隙更暗;从远处看没有平铺或接缝;玻璃没有轮廓接缝;屏幕既没有裁切,也没有拖影;任何网格类型都没有灰色回退;卡通色带在太阳扫过时保持稳定。
常见错误
| 错误 | 表现 | 修复 |
|---|---|---|
| 按像素指令预算 | “低于 200”虽然通过,但帧仍然很慢 | 使用采样和超越函数,以毫秒计量 |
| 为 UV 通道、着色或遮罩通道使用 Switch | 每个唯一实例对应一张着色器映射 | 使用 If、Enum 或 Channel Mask |
| “以防万一”启用父级标记;贴花或 UI 材质启用 Used with Static Mesh | 每个唯一子项都会额外编译一行 | 使用实例覆盖,关闭自动用途和标记 |
| 删除节点“以精简着色器” | 在 5.8 中毫无变化 | 检查 ListShaders |
| 灰色金属磨损 | 边缘呈粉笔状、石膏状 | 使用两层 slab,通过参数混合进行 Horizontal Blend |
| 在参数混合或 Blendable 下锐化遮罩“以降低成本” | 外观更刺眼,没有收益 | mask_cost 仅在不使用这些方式时生效 |
| 为“较弱的平台”使用 Blendable | SM6 平台会失去 Adaptive 功能 | Adaptive 会按平台回退 |
| 在 60 Hz 主机游戏中启用 Adaptive | GBuffer 内存最多增加 5 倍,并强制使用 DBuffer | 使用 Blendable |
| 手动添加 Substrate Shading Model 节点 | 新图表中出现转换路径 | 使用 Slab,或使用 Metalness helper 转换为 Slab |
| 将打包的 NOH 设为 Normalmap;遮罩启用 sRGB;重新压缩后未调整采样器 | 地形平坦、粗糙度偏移、编译错误 | 使用 BC7 或 Masks,关闭 sRGB,并使用 Fixup Mismatched Samplers |
| 禁用 Mips 以修复模糊;法线在 Mips 处理后未归一化 | 闪烁、远处面板变平 | 保留 Mips;进行归一化,或合成粗糙度 |
| 在 RVT 写入通道中使用 Time、Panner 或 MPC | 页面冻结或过时 | 使用读取通道或 RVT Replace |
| 使用 Temporal Responsiveness,但未设置相应的 cvar | 文本仍然模糊 | 设置 cvar 和遮罩,并在 Nanite 上使用较小的 WPO |
交接
- **接收:**来自 scenario-maya-lookdev、scenario-zbrush-paint-render、 scenario-blender-texturing-shading 或 Substance 的纹理(角色后缀、DirectX 法线),或通过 scenario-unreal-pipeline-automation(Interchange)获取的纹理;材质槽按系列命名的网格;来自 scenario-unreal-lighting-rendering 的曝光目标。
- **交付:**交给 scenario-unreal-world-building:母材质、预设和实例(路径、
参数、CPD 索引)、地形母材质、RVT 写入器规则、贴花以及接收方的 Decal
Response。交给 scenario-unreal-lighting-rendering:自发光和玻璃材质、Substrate 状态、
GBuffer 格式、处于合理范围内的反照率。交给 scenario-unreal-vfx:Niagara 材质(实例上启用标记,
关闭 Used with Static Mesh)。交给 scenario-unreal-performance:普查、lint、纹理和
烹制内存报告。交给 scenario-unreal-pipeline-automation:
audit_rules()和排列组合 门禁。
UE 5.8 说明
- Substrate 仅对新项目启用,默认使用 Blendable(在 Automotive 和 Architectural 模板中使用 Adaptive);5.8 新增 EON 粗糙漫反射,移除 SheenQuality,在 Blendable 上近似实现 F90,并提供实验性的 Toon BSDF。
- ListShaders 和 Total Shaders 是上限;在 GPU Scene 平台上,ISM 无需标记;混合 Material Attributes 和标量的 StaticSwitch 会导致验证错误;GetMaterialUsedTextures 取代 GetUsedTextures。
- 5.7:HSPR 标记、MPC 覆盖、Material Diff、Fixup Mismatched Samplers、实验性的 Temporal Responsiveness;Vector Parameter 的 RGBA 引脚会改变脚本化引脚索引。枚举绑定的标量见 5.7 发行说明;Unreal Fest 将其作为 5.8 内容介绍。
- Usage Flag Overrides、验证数据库、Experiments 面板:Unreal Fest 上有展示,但未出现在已保存的笔记中[待验证]。
- Mac:Adaptive 需要 SM6;高级 Substrate 可视化仅支持 Win64 DX12;虚拟纹理自 5.6 起默认启用。
参考资料
references/expert-notes.md:专家的原则和判断,附有来源和时间戳。references/procedures.md:P0 到 P17,包含完整代码、测试路径和状态。references/critique.md:针对每种材质类别的自我审查标准。references/gui-paths.md:供计算机操作 Agent 使用的编辑器、菜单和设置。references/sources.md:所有来源、凭据、URL、最佳时间戳和修订历史。scripts/ue_materials.py:纹理策略、数值检查、成本清点、图表检查、排列组合清点、Substrate ini、构建器、烘焙纹理内存、探测器。
评论
支持 Markdown