executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
scenario-unreal-materialsUse when a UE5 task involves materials or textures: a master material and instances for a kit, Substrate or legacy, Blendable vs Adaptive GBuffer, glass, emissive screens, decals, edge wear and dirt, landscape layers and RVT, toon or cel shading, "too many shaders" or shader permutations, static switches, usage flags, texture compression (BC7, normal maps, …
Independent GitHub snapshot · Automated classification · Original documentation governs
Expert level means a few master materials whose instances cover the kit, a known and budgeted permutation count, cost proven in milliseconds on a fixed camera, and physically plausible values before any artistic push. The graph is authored once (scripted build or template); everything else is instances, Custom Primitive Data and textures that follow a role policy. Never trust the instruction count or a pretty preview. If a sibling skill named here is missing from your available skills, ask the user to install it (npx skills add scenario-labs/skills --skill <name>); unattended, proceed from tool schemas and flag the gap.
REQUIRED BACKGROUND: scenario-unreal-expert (channels, review loop, 5.8 traps).
Status (2026-09-24): Unreal is not installed; offline tests pass (tests/code/unreal-materials/run_all.sh, editor layer on a fake unreal). Every snippet is not yet run in Unreal: run P0 first.
switch_ranking; Fortnite kept its top 10 [00:29:31]).cost_census), open every material function ("cheap" in a name is not a measurement [00:22:31]), decide on ms at a fixed camera.listtextures in a cooked build; RDO shrinks disk, not memory.| Input | What it changes | Default when silent |
|---|---|---|
| Platforms and frame rate | GBuffer format (Blendable caps all), closures, samplers (16 on ES3.1), Adaptive-only features | console 60 Hz and PC: Blendable, 1 closure |
| Project Substrate state | r.Substrate in the ini (P1); upgraded projects stay legacy | read it, never assume |
| Style | PBR; Toon BSDF (per asset, experimental); post-process EV cel (whole world) | PBR |
| Architecture | lean master or Material Layering System (Sumo), by library size and projected permutations (lauf_permutations) | lean master, under 10 presets |
| World-wide values (wetness, alert state) | MPC: at most 2 per material; adding parameters recompiles every user (instances doc) | one game-wide, one per level |
| Mesh types per family | usage flags: static, Nanite, skeletal, cloth, Niagara, decal, UI | static + Nanite |
| Texture sources | packing, DirectX green, texel density, source size | ORM packed, DirectX, 2K |
| Budgets | samples, transcendentals, unique static sets, shaders, BasePass ms, texture pool | project decision; lint warns above 12 samples [added] |
um.probe() lists what 5.8 really exposes; P1 reads the ini and runs um.choose_gbuffer_format(targets, needs), whose reasons state the ceiling and the fallback. GATE: CANDIDATES corrected; the format decision written.switch_ranking count; channel picks are Channel Mask Parameters; architecture written.pack_channels, import_textures, audit_textures(apply=True), albedo_stats. GATE: audit passes; resident size at most 2048; lint_graph(g, textures=...) finds no sampler mismatch; normals keep Normalize after making Mips; albedo sRGB 20 (50 rough) to 240, metals at least 180.um.build_kit_surface or a template: texture-gating switches, an If for the paint-mask source, Custom Primitive Data for per-actor wear and dirt, Specular = 0.5 x (1 - cavity) as specular occlusion. Substrate: the Metalness helper feeds a base slab, a bare-metal slab takes albedo 0 and a measured F0, a parameter-blended Horizontal Blend takes the wear mask. Options: value-clamped ID masks, 4 bands per channel (Sumo [00:14:54]); world-aligned texture and normal across modular seams, 3 samples per texture (Ben [pXOknekvmwE 00:12:57]); world-space directional dust (Sumo [00:20:11]). GATE: no failed links; lint_graph free of fail and warn; one closure; clean compile log.make_presets sets static switches; children change values; Custom Primitive Data varies placed actors. GATE: unique sets at most the preset count, no override at default, HSPR only on presets; audit_instance_values_project clean (dielectric F0 at most 0.08, metal albedo 0, Metallic 0 or 1).shader_count per root (an upper bound). 5.8 compiles only connected, non-zero outputs (r.Material.UseShaderCompilationParameters): deleting nodes to strip shaders is folklore. Skin-cache and Slate levers (P7) only after measuring. GATE: shaders within budget; the fallback board shows no gray default material.r.Velocity.TemporalResponsiveness.Supported=1 and a small WPO on Nanite meshes (5.7 article). Decals (P14) end in Convert To Decal; overlapping DBuffer-expression decals do not blend; each receiver's Decal Response covers only the channels its decals write (decal_response_for). Landscape P11, stylized P12 and P13, switch triage P8. GATE: references/critique.md for the family.r.ScreenPercentage 100, warm-up, CSV profile, medians of GPU and pass time, cost_census beside them. GATE: deltas within budget; instruction counts recorded as context only.ue_review.review_images runs before anyone looks. GATE: critique rubric passes.listtextures, stat streaming and r.Streaming.PoolSize through texture_memory_findings; hand over reports, captures, open [verify] items.| Value | Relative to | Source |
|---|---|---|
| Specular 0.5 = F0 0.04 (4%) | 90 to 98% of non-metals | Ben [fePsD_8p9vM 00:12:09] |
| Dielectric F0 at most 0.08; gems, carbon fiber up to about 0.18 | legacy Specular spans IOR 1 to 1.788 | Morgan [00:09:30] |
| Metal: albedo 0, F0 average at least 0.5 (doc) or 0.6 (Ben) | Substrate slab | Ben [a94Lpu1_4dg 00:16:16] |
| Base color sRGB 20 to 240, floor 50 when rough; metals at least 180 | 8-bit sRGB | Ben [fePsD_8p9vM 00:05:28, 00:22:48] |
| Glass IOR 1.5, MFP thickness 0.02; frosted roughness 0.2 to 1 | rough refraction on | Ben [sf-K257zWh8 00:11:02, 00:17:16] |
| 10 shaders, 20 with Skeletal, 27 with Niagara mesh, 186 with every flag | one material, project-dependent | Nadro [00:06:28, 00:07:05] |
| Fetch about 200 cycles; multiply 4; sine about 20 | AMD GCN: a ranking, not Apple truth | Swierad |
| BC1 2048 = 2.66 MiB with mips; BC3, BC5, BC7 double; BC6H one eighth of RGBA16F | GPU memory | textures doc |
lint_graph (with textures= and project budgets=) free of fail and warn; census within presets; audit_textures and audit_instance_values_project pass; shader_count per root; BasePass, Translucency, DBuffer ms A/B; Substrate Material Count 1 on Blendable; VirtualTextureUpdate near zero when still; cooked texture_memory_findings clean; no blank frame.references/critique.md): transitions read as two materials; wear on edges, dirt in cavities, crevices darker in the Specular buffer; no tiling or seams from far; glass free of silhouette seams; screens neither clipped nor smeared; no gray fallback on any mesh type; toon bands stable under a sun sweep.| Mistake | What it looks like | Fix |
|---|---|---|
| Budgeting pixel instructions | "under 200" passes, the frame is still slow | samples and transcendentals, measured ms |
| Switch for a UV channel, tint or mask channel | a shader map per unique instance | If, Enum or Channel Mask |
| Parent flag "just in case"; decal or UI material keeping Used with Static Mesh | every unique child compiles another row | instance overrides, auto usage off, flag off |
| Deleting nodes "to strip shaders" | no change in 5.8 | check ListShaders |
| Gray metallic wear | chalky, plaster edges | two slabs, parameter-blended Horizontal Blend |
| Sharpening masks "for cost" under parameter blending or Blendable | harsher look, no gain | mask_cost applies only without them |
| Blendable "for the weaker platform" | SM6 platforms lose Adaptive features | Adaptive falls back per platform |
| Adaptive on a 60 Hz console game | up to 5x GBuffer memory, forced DBuffer | Blendable |
| Substrate Shading Model node added by hand | conversion path in a new graph | Slab, or Metalness helper into a Slab |
| Packed NOH as Normalmap; sRGB on masks; sampler left after recompression | flat terrain, shifted roughness, compile errors | BC7 or Masks, sRGB off, Fixup Mismatched Samplers |
| Mips disabled to fix blur; normals not normalized after mips | shimmer, flat distant panels | keep mips; normalize, or composite roughness |
| Time, Panner or MPC in the RVT write pass | frozen or stale pages | read pass or RVT Replace |
| Temporal Responsiveness without its cvar | text still smears | cvar, mask, small WPO on Nanite |
audit_rules() and the permutation gate.references/expert-notes.md: principles and judgment by expert, with source and timestamp.references/procedures.md: P0 to P17 with full code, test path and status.references/critique.md: the self-review rubric per material family.references/gui-paths.md: editors, menus and settings for a computer-use agent.references/sources.md: every source, credential, URL, best timestamps, revision history.scripts/ue_materials.py: texture policy, value checks, cost census, graph lint, permutation census, Substrate ini, builders, cooked texture memory, probe.