mcpField
S
scenario-unreal-materials

scenario-unreal-materials

github.com/scenario-labs创意与媒体1.2k201 次安装1 天前更新
代码仓库

关于 scenario-unreal-materials

面向 Unreal 环境美术师的材料制作技能,涵盖材质主干、Substrate、纹理与着色器成本。通过预算、静态实例和可测量的质量门槛组织制作流程。

主要功能

  1. 01规划材质家族与静态开关
  2. 02打包、导入和审计纹理
  3. 03构建材质主干与实例预设
  4. 04检查着色器数量与材质成本
  5. 05评审 Substrate、玻璃和贴花

适用场景

  1. 01为一组资产规划可复用材质
  2. 02检查纹理设置与材质图
  3. 03比较固定视角下的渲染成本
  4. 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.md
expert-notes.md
gui-paths.md
procedures.md
sources.md
scripts/
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 会发出警告 [已添加]

工作流

  1. 探测并决策。 P0 um.probe() 会列出 5.8 实际提供的内容;P1 读取 ini 并运行 um.choose_gbuffer_format(targets, needs),其原因会说明上限和回退方案。 GATE:修正 CANDIDATES;记录格式决策。
  2. 规划材质系列。 每个领域和混合模式各设一个主材质(表面、玻璃、屏幕、贴花、UI Material、地形),并为每个主材质列出开关及其控制内容、获批预设、各网格类型的使用标记、 示例和闭包预算、MPC。GATE:每个开关都控制一个纹理,并有 switch_ranking 计数;通道选择使用 Channel Mask Parameters;记录架构。
  3. 纹理(P2):pack_channels、import_textures、audit_textures(apply=True)、 albedo_stats。GATE:审计通过;驻留大小不超过 2048;lint_graph(g, textures=...) 未发现采样器不匹配;法线贴图在生成 Mip 后保留 Normalize;反照率 sRGB 值为 20(粗糙材质为 50)到 240,金属材质至少为 180。
  4. 构建主材质(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;一个闭包;编译日志干净。
  5. 实例(P5、P6、P16):只有 make_presets 会设置静态开关;子实例只更改值; Custom Primitive Data 用于改变已放置 Actor 的属性。GATE:唯一参数集数量不超过预设数量,默认值未被覆盖,只在预设中使用 HSPR;audit_instance_values_project 检查通过(电介质 F0 不超过 0.08,金属反照率为 0,Metallic 为 0 或 1)。
  6. 使用标记和着色器(P7):在实例上固定需求,然后清除父级标记;关闭自动使用标记; 对仅用于贴花、UI 和 Niagara 的材质关闭 Used with Static Mesh(Nadro [00:18:38]); 每个根材质运行 shader_count(仅为上限)。5.8 只会编译已连接且非零的输出 (r.Material.UseShaderCompilationParameters):删除节点来剥离着色器只是无稽之谈。 只有在测量后才调整 Skin-cache 和 Slate 开关(P7)。GATE:着色器数量在预算内;回退方案检查板上没有灰色默认材质。
  7. 特殊系列。 屏幕:使用测光表校准自发光。对于滚动文本上的 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 中对应的材质系列内容。
  8. 成本 A/B 对比(P9,实时编辑器):固定摄像机,r.ScreenPercentage 100,预热,CSV 分析, GPU 和通道耗时的中位数,并列出 cost_census。GATE:差值在预算内;仅将指令计数记录为参考信息。
  9. 外观评审(P10、P15):在关卡光照下查看预设检查板、缓冲区可视化和 Substrate 视图。 若 Substrate 表现出乎意料,先打开 Window > Substrate:按降级顺序查看功能、参数混合预览(Morgan [00:12:51, 00:38:43])。 在任何人查看前运行 ue_review.review_images。GATE:通过评审标准。
  10. 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.788Morgan [00:09:30]
Metal:albedo 0,F0 平均至少 0.5(文档)或 0.6(Ben)基底层Ben [a94Lpu1_4dg 00:16:16]
Base color sRGB 20 至 240,粗糙时下限为 50;金属至少 1808 位 sRGBBen [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 约为 20AMD 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 仅在不使用这些方式时生效
为“较弱的平台”使用 BlendableSM6 平台会失去 Adaptive 功能Adaptive 会按平台回退
在 60 Hz 主机游戏中启用 AdaptiveGBuffer 内存最多增加 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