メインコンテンツまでスキップ

シェーダーとマテリアルの高度な設定

OpenForge MCP を使って、Shader Graph ベースのマテリアルを効率的に作成・管理する。PBR テクスチャの設定、マテリアルバリアント、ライティングベイク、Poly Haven からのテクスチャ取得まで一通りカバーする。

前提

  • Unity (URP または HDRP) が起動し、OpenForge MCP に接続済み
  • Shader Graph パッケージがインストール済み
  • PBR ワークフローの基本概念(Metallic/Roughness)を理解していること

PBR テクスチャワークフロー

PBR (Physically Based Rendering) マテリアルは以下のテクスチャマップで構成される。

マップ役割チャンネル
Albedo (Base Color)表面の色。照明の影響を含まない純粋な色RGB
Normal Map表面の凹凸を疑似的に表現するRGB (タンジェント空間)
Metallic金属か非金属かを定義するR (グレースケール)
Roughness (Smoothness)表面の粗さ。Unity では Smoothness (1 - Roughness)R (グレースケール)
Ambient Occlusion環境光の遮蔽。隙間や角が暗くなるR (グレースケール)
Height (Displacement)実際にメッシュを変形させる。Parallax Mapping にも使うR (グレースケール)
Metallic vs Smoothness

Unity の Standard/URP Lit シェーダーでは Metallic マップの Alpha チャンネルが Smoothness として使われる。外部テクスチャの Roughness マップを使う場合は値を反転する必要がある。

ステップ 1: Poly Haven からテクスチャを取得する

Poly Haven は CC0 ライセンスの PBR テクスチャを提供している。OpenForge MCP から直接ダウンロードできる。

あなた:

Poly Haven から "castle_brick" テクスチャを 2K 解像度でダウンロードして。必要なマップは全部。

AI の応答例:

Poly Haven からテクスチャをダウンロードしました。

castle_brick_wall_03 (2048x2048):
- castle_brick_wall_03_diff_2k.png (Albedo)
- castle_brick_wall_03_nor_gl_2k.png (Normal, OpenGL)
- castle_brick_wall_03_arm_2k.png (AO/Roughness/Metallic packed)
- castle_brick_wall_03_disp_2k.png (Displacement)

保存先: Assets/Textures/PolyHaven/castle_brick_wall_03/

ARM テクスチャは AO (R), Roughness (G), Metallic (B) がパックされた形式だ。Unity のチャンネルパッキングと一致しない場合は分離が必要になる。

ステップ 2: マテリアルを作成する

あなた:

URP Lit マテリアルを "M_CastleBrick" という名前で作って。ダウンロードしたテクスチャを全部割り当てて。Roughness は Smoothness に変換して。

AI の応答例:

マテリアル M_CastleBrick を作成しました。

シェーダー: Universal Render Pipeline/Lit
テクスチャ割り当て:
Base Map: castle_brick_wall_03_diff_2k.png
Normal Map: castle_brick_wall_03_nor_gl_2k.png (Scale: 1.0)
Metallic Map: castle_brick_wall_03_arm_2k.png の B チャンネル
Smoothness Source: Metallic Alpha
Occlusion Map: castle_brick_wall_03_arm_2k.png の R チャンネル

Roughness → Smoothness 変換を適用しました。
(ARM テクスチャの G チャンネルを反転して Smoothness として設定)

Height Map: castle_brick_wall_03_disp_2k.png
Parallax: 有効 (Scale: 0.02)

ステップ 3: カスタム Shader Graph を作成する

標準シェーダーでは足りない場合、Shader Graph を作る。ここでは風化エフェクト付きのレンガシェーダーを作る。

あなた:

Shader Graph で "SG_WeatheredBrick" を作って。URP Lit ベースで以下の機能:

  • Base Map と Normal Map の入力
  • 風化度合いをコントロールする float パラメータ "_WeatherAmount" (0-1)
  • 風化が進むと Albedo が暗くなり、Roughness が上がる
  • 頂点の上面 (World Normal Y > 0.7) にだけ苔テクスチャをブレンドする
  • 苔の量も "_MossAmount" パラメータで制御

AI の応答例:

Shader Graph "SG_WeatheredBrick" を作成しました。

パス: Assets/Shaders/SG_WeatheredBrick.shadergraph

プロパティ:
_BaseMap (Texture2D) - メインテクスチャ
_NormalMap (Texture2D) - 法線マップ
_MossMap (Texture2D) - 苔テクスチャ
_MossNormal (Texture2D) - 苔の法線マップ
_WeatherAmount (Float, 0-1, default 0.3) - 風化度合い
_MossAmount (Float, 0-1, default 0.5) - 苔の量
_MossThreshold (Float, 0-1, default 0.7) - 苔が生える法線 Y の閾値

ノード構成:
1. Sample Texture 2D (_BaseMap) → Lerp (暗い色へ) → _WeatherAmount で制御
2. World Normal Y → Step (_MossThreshold) → Multiply (_MossAmount)
→ 苔テクスチャとのブレンドマスク
3. Base Albedo と Moss Albedo を Lerp でブレンド → Fragment の Base Color へ
4. Roughness: _WeatherAmount で 0.4 → 0.9 に補間
5. Normal: Base Normal と Moss Normal をブレンド

ステップ 4: マテリアルバリアントを作成する

同じシェーダーで異なるパラメータ値を持つバリアントを作る。

あなた:

SG_WeatheredBrick を使って以下の 3 バリアントを作って:

  • M_Brick_New: WeatherAmount=0, MossAmount=0 (新品)
  • M_Brick_Old: WeatherAmount=0.6, MossAmount=0.3 (古い)
  • M_Brick_Ruins: WeatherAmount=0.9, MossAmount=0.8 (廃墟) 全部同じ Base Map と Normal Map を使って。

AI の応答例:

3 つのマテリアルバリアントを作成しました。

M_Brick_New:
Shader: SG_WeatheredBrick
_WeatherAmount: 0.0
_MossAmount: 0.0
外観: きれいなレンガ、色鮮やか

M_Brick_Old:
Shader: SG_WeatheredBrick
_WeatherAmount: 0.6
_MossAmount: 0.3
外観: くすんだ色、部分的に苔

M_Brick_Ruins:
Shader: SG_WeatheredBrick
_WeatherAmount: 0.9
_MossAmount: 0.8
外観: 非常に暗い、苔に覆われている

保存先: Assets/Materials/Brick/

あなた:

3 つのマテリアルを並べた比較用のオブジェクトを作って、スクリーンショットを撮って。

AI の応答例:

比較シーンを構築しました。
- 3 つの Cube (2m x 2m x 2m) を横に並べて配置
- 左: M_Brick_New / 中央: M_Brick_Old / 右: M_Brick_Ruins
- ディレクショナルライト + 環境光を設定
スクリーンショットを撮影しました。

ステップ 5: ライティングベイク

静的オブジェクトにはライトマップをベイクしてパフォーマンスを上げる。

あなた:

シーン内の壁と床を Static に設定して。ライトマップをベイクして。設定は以下:

  • Lightmapper: Progressive GPU
  • Lightmap Resolution: 40 texels/unit
  • Bounce: 2 回
  • Ambient Occlusion: 有効、Distance 1.0
  • Directional Mode: Directional

AI の応答例:

ライトマップベイク設定を適用しました。

Static 設定:
- Wall_North: Contribute GI + Receive GI (Static)
- Wall_South: Contribute GI + Receive GI (Static)
- Wall_East: Contribute GI + Receive GI (Static)
- Wall_West: Contribute GI + Receive GI (Static)
- Floor: Contribute GI + Receive GI (Static)

ベイク設定:
Lightmapper: Progressive GPU
Resolution: 40 texels/unit
Bounces: 2
AO: Enabled (Distance: 1.0)
Directional Mode: Directional

ベイクを開始します...
ベイク完了 (18.3 秒)
ライトマップ: 2 枚 (1024x1024)
合計テクセル: 2,097,152

パイプライン: テクスチャ取得からマテリアル適用まで

一連の流れをまとめると以下のようになる。

name: pbr-material-pipeline
description: Poly Haven テクスチャからマテリアルを作成して適用する
version: "1.0"

variables:
texture_name: "castle_brick_wall_03"
resolution: "2k"
material_name: "M_CastleBrick"
target_objects:
- "Wall_North"
- "Wall_South"
- "Wall_East"
- "Wall_West"
tiling_x: 3.0
tiling_y: 3.0

steps:
- name: テクスチャダウンロード
tool: download_polyhaven
params:
asset_name: "{{ texture_name }}"
resolution: "{{ resolution }}"
types: ["diffuse", "normal", "arm", "displacement"]
output_dir: "Assets/Textures/PolyHaven/{{ texture_name }}"
on_error: stop

- name: テクスチャインポート設定
tool: set_texture_import_settings
params:
path: "Assets/Textures/PolyHaven/{{ texture_name }}"
settings:
- pattern: "*_nor_*"
type: "NormalMap"
- pattern: "*_arm_*"
type: "Default"
sRGB: false
- pattern: "*_disp_*"
type: "Default"
sRGB: false
on_error: continue

- name: マテリアル作成
tool: create_material
params:
name: "{{ material_name }}"
shader: "Universal Render Pipeline/Lit"
on_error: stop

- name: テクスチャ割り当て
tool: set_material_textures
params:
material: "{{ material_name }}"
albedo: "{{ texture_name }}_diff_{{ resolution }}.png"
normal: "{{ texture_name }}_nor_gl_{{ resolution }}.png"
metallic_ao_packed: "{{ texture_name }}_arm_{{ resolution }}.png"
height: "{{ texture_name }}_disp_{{ resolution }}.png"
on_error: stop

- name: タイリング設定
tool: set_material_property
params:
material: "{{ material_name }}"
properties:
_BaseMap_ST: { x: "{{ tiling_x }}", y: "{{ tiling_y }}", z: 0, w: 0 }
on_error: continue

- name: マテリアル適用
tool: set_material_batch
params:
targets: "{{ target_objects }}"
material: "{{ material_name }}"
on_error: stop

- name: 確認スクリーンショット
tool: take_screenshot
params:
width: 1920
height: 1080
on_error: continue

ARM テクスチャのチャンネル分離

Poly Haven の ARM テクスチャ (AO/Roughness/Metallic packed) を Unity で正しく使うには、チャンネルの対応を理解する必要がある。

ARM チャンネル内容Unity での使い方
RAmbient OcclusionOcclusion Map として設定
GRoughness反転して Smoothness として使用
BMetallicMetallic Map として設定

あなた:

ARM テクスチャを Unity 用にチャンネル分離して。Roughness は反転して Smoothness にして。

AI の応答例:

チャンネル分離を実行しました。

入力: castle_brick_wall_03_arm_2k.png
出力:
- castle_brick_wall_03_ao_2k.png (R チャンネル)
- castle_brick_wall_03_smoothness_2k.png (G チャンネル反転)
- castle_brick_wall_03_metallic_2k.png (B チャンネル)

保存先: Assets/Textures/PolyHaven/castle_brick_wall_03/

テクスチャアトラス化

複数のマテリアルを 1 つにまとめてドローコールを削減する場合、テクスチャアトラスが有効。

あなた:

M_Brick_New, M_Brick_Old, M_Brick_Ruins の Albedo テクスチャを 1 枚のアトラスにまとめて。UV も調整して。

AI の応答例:

テクスチャアトラスを作成しました。

アトラス: Atlas_Brick_Albedo.png (4096x4096)
左上: M_Brick_New の Albedo (2048x2048)
右上: M_Brick_Old の Albedo (2048x2048)
左下: M_Brick_Ruins の Albedo (2048x2048)
右下: (空き)

UV 調整:
M_Brick_New 使用オブジェクト: UV を (0,0.5)-(0.5,1.0) にリマップ
M_Brick_Old 使用オブジェクト: UV を (0.5,0.5)-(1.0,1.0) にリマップ
M_Brick_Ruins 使用オブジェクト: UV を (0,0)-(0.5,0.5) にリマップ

マテリアル統合: Atlas_Brick_Mat (1 マテリアル, 1 ドローコール)

この手法は パフォーマンス最適化ガイド でも詳しく扱う。