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. 05Substrate、ガラス、デカールのレビュー

活用シーン

  1. 01アセット群で再利用するマテリアルの計画
  2. 02テクスチャ設定とマテリアルグラフの確認
  3. 03固定カメラでレンダーコストを比較
  4. 04引き渡し前のインスタンスとテクスチャメモリの監査

MCP 対応

README では Epic の MCP サーバー経由で Unreal Editor の 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 を実行してください。

スタンス(専門家との主な違い)

  • パーミュテーション数 = 使用フラグ × インスタンス間で固有の静的パラメーターセット数(Quality Switch がある場合は品質レベル数も乗算)であり、ノード数ではありません。 親フラグを追加すると、固有の子すべてにシェーダー行が追加されます(Lauf、Nadro、Fortnite[wobQ8ZKQpbc 00:24:25, 00:05:32])。親には最小限のフラグを持たせ、インスタンス側で必要なものを有効にします(5.8 Usage Flag Overrides[要確認])。スイッチを追加する前に、そのスイッチを設定するインスタンス数を数えます(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 は 1 つのスラブから始めます(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)、クック時間約 +15%、DBuffer デカールの強制が発生します(Ben Cloward[P5I38f2O6W8 00:05:46, 00:06:54])。マテリアルの変換は一方向です。
  • 塗装の隣にある金属には 2 つのスラブが必要で、グレーのメタリックではありません(グレーは漆喰のように見えます。Ben[VrY_SSvWdQ4 00:05:39])。Use Parameter Blending を使えば、Horizontal Blend はほぼロスレスで、どこでも 1 つのスラブで済みます(Morgan[00:37:35])。そのため、マスクのシャープさはコストではなく表現上の判断になります。「Mix がちょうど 0 または 1 なら一方のスラブだけが評価される」のは、Parameter Blending を使わない Adaptive の場合に限られます[00:29:38]。Vertical Coat で Parameter Blending を使うとロスが生じ、下層にも波及するため、早い段階で計画してください[00:38:08, 00:38:43]。
  • ディテールは解像度ではなく、パッキングとタイリングで実現します。 地形レイヤーあたり 2 サンプル(CR + NOH)を使い、ゲームでは 2K を上限とし、用途に応じて圧縮し、sRGB はカラーにのみ使い、パックした法線を Normalmap として使わず、無関係なチャンネルには BC7 を使います(Ben[-UZlUUQSGgQ 00:12:36]、[gjOO5g4cgng 00:11:02]、Sumo[SAr7oPKsgLE 00:29:20]、テクスチャのドキュメント)。メモリ使用量の正確な値は、Platforms パネルと、クック済みビルドでの listtextures で確認します。RDO が削減するのはディスク容量であり、メモリ使用量ではありません。
  • ガラスは不透明度ではなく、物質です。 着色する場合にのみ Colored Transmittance を使います(Gray のほうが低コストです)。Surface Translucency Volume、平面ガラスには Pixel Normal Offset、スラブには Transmittance-To-MFP を伴う 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 セル(ワールド全体)PBR
アーキテクチャマスターをシンプルにするか、ライブラリのサイズと予測されるバリエーション数(lauf_permutations)に応じて Material Layering System(Sumo)を使うマスターをシンプルにし、プリセットは 10 個未満にする
ワールド全体の値(濡れ具合、警戒状態)MPC:マテリアルあたり最大 2 個。パラメーターを追加すると、すべてのユーザーが再コンパイルされる(インスタンスのドキュメント)ゲーム全体に 1 個、レベルごとに 1 個
ファミリーごとのメッシュタイプ使用フラグ:static、Nanite、skeletal、cloth、Niagara、decal、UIstatic と Nanite
テクスチャソースパッキング、DirectX の緑チャンネル、テクセル密度、ソースサイズORM パック、DirectX、2K
予算サンプル数、トランセンデンタル数、ユニークな静的セット数、シェーダー、BasePass の ms、テクスチャプールプロジェクトで決定。12 サンプルを超えると lint が警告する[追加]

ワークフロー

  1. 調査して決定します。 P0 の um.probe() で 5.8 が実際に公開している内容を一覧表示します。P1 では ini を読み込み、um.choose_gbuffer_format(targets, needs) を実行します。理由には上限とフォールバックが記載されます。 ゲート:CANDIDATES を修正し、フォーマットの決定を記録します。
  2. ファミリーを計画します。 ドメインとブレンドモード(サーフェス、ガラス、スクリーン、デカール、UI マテリアル、ランドスケープ)ごとにマスターを 1 つ用意し、それぞれにスイッチとその適用対象、承認済みプリセット、メッシュタイプごとの使用フラグ、サンプル数とクロージャ数の予算、MPC を定めます。 ゲート:すべてのスイッチがテクスチャを制御し、switch_ranking のカウントを持つこと。チャンネルの選択は Channel Mask Parameters で行い、アーキテクチャを文書化します。
  3. テクスチャ(P2):pack_channels、import_textures、audit_textures(apply=True)、albedo_stats を実行します。 ゲート:監査に合格すること。常駐サイズは最大 2048 であること。lint_graph(g, textures=...) でサンプラーの不一致が検出されないこと。ミップ生成後も法線には Normalize を適用すること。アルベドの sRGB 値は 20(ラフネスが高い場合は 50)~240、金属の値は 180 以上であること。
  4. マスターを構築します(P3、P4):um.build_kit_surface またはテンプレートを使います。テクスチャを制御するスイッチ、ペイントマスクのソース用 If、アクターごとの摩耗と汚れ用 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])。 ゲート:リンクの失敗がないこと。lint_graph に fail と warn がないこと。クロージャが 1 つであること。コンパイルログがクリーンであること。
  5. インスタンス(P5、P6、P16):静的スイッチを設定するのは make_presets のみとし、子は値を変更し、配置されたアクターごとの差異には Custom Primitive Data を使います。 ゲート:一意なセット数がプリセット数以下であること。デフォルト値のオーバーライドがないこと。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)。シェーダーを除去するためにノードを削除するというのは俗説です。スキンキャッシュと Slate の調整項目(P7)は、測定後にのみ使用します。 ゲート:シェーダーが予算内であること。フォールバック用ボードにグレーのデフォルトマテリアルが表示されないこと。
  7. 特殊なファミリー。 スクリーン:エミッシブをライトメーターでキャリブレーションします。スクロールするテキストで TSR のにじみが発生する場合は、実験的な Temporal Responsiveness ノードをマスクして使用し、r.Velocity.TemporalResponsiveness.Supported=1 を設定し、Nanite メッシュに小さな WPO を適用します(5.7 の記事)。 デカール(P14)は Convert To Decal で終わらせます。DBuffer 式のデカールが重なってもブレンドされません。各レシーバーの Decal Response は、そのデカールが書き込むチャンネルのみを対象にします(decal_response_for)。 ランドスケープは P11、スタイライズドは P12 と P13、スイッチのトリアージは P8 です。 ゲート:ファミリーごとに references/critique.md を参照します。
  8. コストの A/B 比較(P9、ライブエディター):カメラを固定し、r.ScreenPercentage 100 を設定してウォームアップした後、CSV プロファイルを取得します。GPU 時間とパス時間の中央値を算出し、その横に cost_census を記録します。 ゲート:差分が予算内であること。命令数は参考情報としてのみ記録します。
  9. 見た目のレビュー(P10、P15):レベルのライティング下でプリセットボード、バッファの可視化、Substrate ビューを確認します。Substrate の予想外の表示があった場合は、まず Window > Substrate を開きます。ダウングレード順の機能と、パラメーターをブレンドするプレビューを確認します(Morgan [00:12:51, 00:38:43])。誰かが確認する前に ue_review.review_images を実行します。 ゲート:批評の評価基準に合格すること。
  10. クック後の確認と引き継ぎ(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]
誘電体のF0は最大0.08。宝石やカーボンファイバーは約0.18まで従来のSpecularはIOR 1~1.788をカバーMorgan [00:09:30]
金属:アルベド0、F0平均値は少なくとも0.5(ドキュメント)または0.6(Ben)SubstrateスラブBen [a94Lpu1_4dg 00:16:16]
ベースカラーはsRGBで20~240、粗い場合は下限50。金属は少なくとも1808-bit sRGBBen [fePsD_8p9vM 00:05:28, 00:22:48]
ガラスのIORは1.5、MFPの厚さは0.02。すりガラスの粗さは0.2~1粗い屈折を有効化Ben [sf-K257zWh8 00:11:02, 00:17:16]
シェーダー10個、Skeletalありで20個、Niagaraメッシュありで27個、すべてのフラグありで186個1つのマテリアル。プロジェクトに依存Nadro [00:06:28, 00:07:05]
フェッチは約200サイクル、乗算は4サイクル、正弦は約20サイクルAMD GCN:順位付けであり、Appleの実測値ではないSwierad
BC1 2048はミップマップ込みで2.66 MiB。BC3、BC5、BC7は2倍。BC6HはRGBA16Fの8分の1GPUメモリテクスチャのドキュメント

品質ゲート

  • 測定可能: lint_graph(textures=およびプロジェクトのbudgets=を指定)がfail、warnなしであること。センサスがプリセットの範囲内であること。audit_texturesとaudit_instance_values_projectが合格すること。ルートごとのshader_count。BasePass、Translucency、DBufferのms値をA/B比較すること。BlendableでSubstrate Material Countが1であること。静止時のVirtualTextureUpdateがほぼゼロであること。クック済みのtexture_memory_findingsに問題がないこと。空白フレームがないこと。
  • 視覚的(references/critique.md):遷移が2つのマテリアルとして認識できること。エッジに摩耗、くぼみに汚れがあり、Specularバッファで隙間が暗いこと。遠方から見てタイリングや継ぎ目がないこと。ガラスにシルエットの継ぎ目がないこと。画面がクリップされたり、にじんだりしていないこと。どのメッシュタイプでもグレーのフォールバックがないこと。太陽を動かしてもトゥーンの帯が安定していること。

よくある間違い

間違いどのように見えるか修正方法
ピクセル命令数を基準に予算を立てる「200未満」は合格でも、フレームは遅いままサンプル数と超越関数を確認し、ms単位で測定する
UVチャンネル、色調またはマスクチャンネルを切り替える固有のインスタンスごとにシェーダーマップができるIf、EnumまたはChannel Maskを使う
「念のため」の親フラグ。デカールまたはUIマテリアルでUsed with Static Meshを維持固有の子ごとに別の行がコンパイルされるインスタンスオーバーライド、自動使用をオフ、フラグをオフにする
「シェーダーを削る」ためにノードを削除する5.8では変化がないListShadersを確認する
グレーのメタリックの摩耗チョークのような、石膏状のエッジ2つのスラブと、パラメーターでブレンドしたHorizontal Blendを使う
パラメーターブレンディングまたはBlendableの下で「コスト削減」のためにマスクをシャープにする見た目が硬くなり、効果はないmask_costが適用されるのはこれらを使わない場合のみ
「性能の低いプラットフォーム向け」にBlendableを使うSM6プラットフォームでAdaptive機能が失われるAdaptiveはプラットフォームごとにフォールバックする
60 HzのコンソールゲームでAdaptiveを使うGBufferメモリが最大5倍になり、DBufferが強制されるBlendableを使う
Substrate Shading Modelノードを手動で追加する新しいグラフに変換経路が作られるSlab、またはSlabにつなぐMetalnessヘルパーを使う
Packed NOHをNormalmapとして扱う、マスクでsRGBを有効にする、再圧縮後にサンプラーをそのままにする地形が平坦になる、ラフネスがずれる、コンパイルエラーが発生するBC7またはMasksを使い、sRGBをオフにし、Fixup Mismatched Samplersを実行する
ぼやけを直すためにミップを無効にする。ミップ後に法線を正規化しないちらつき、遠方のパネルが平坦になるミップを維持し、正規化するか、ラフネスを合成する
RVTの書き込みパスでTime、PannerまたはMPCを使うページが固定される、または古くなる読み取りパスまたはRVT Replaceを使う
cvarなしでTemporal Responsivenessを使うテキストのにじみが残る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 rough diffuse が追加され、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 ピンによって、スクリプト化されたピンのインデックスがずれます。Enum-bound スカラーは 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:コンピューター操作エージェント向けのエディター、メニュー、設定。
  • references/sources.md:すべての出典、認証情報、URL、最適なタイムスタンプ、改訂履歴。
  • scripts/ue_materials.py:テクスチャポリシー、値チェック、コスト調査、グラフのリント、パーミュテーション調査、Substrate ini、ビルダー、クック済みテクスチャメモリ、プローブ。

コメント