「水面をゆらゆら揺らしたい」「敵が被弾したら白く光らせたい」——やりたい表現は明確なのに、調べると出てくるのはHLSLの呪文のようなコード。シェーダーはやりたいことと学習コストのギャップが一番大きい分野かもしれません。
そのギャップを埋めるのが Shader Graph——Unity公式のノードベースビジュアルシェーダーエディタです。ノードを線でつなぐだけで、発光するマテリアルや波打つ水面、ホログ ラムのようなエフェクトまで、コードを1行も書かずに作れます。
この記事でわかること
- Shader Graphの構成要素(Master Stack・Blackboard・プロパティ)
- 作成から適用までの基本操作と、テクスチャ・スクロールの実例
- スクリプトからの変更とMaterialPropertyBlockの使いどころ
- Sub Graph・Keyword・Custom Functionによる発展
- 実践:被弾で白く点滅するシェーダーを組む
動作確認環境: Unity 6 (6000.x)/URP
従来のシェーダーとの違い
従来のシェーダーの課題
- プログラミングの知識が必須
- デバッグが難しい
- 試行錯誤に時間がかかる
- 非エンジニアには敷居が高い
Shader Graphの利点
- プログラミング不要 - ノードを接続するだけ
- ビジュアルで分かりやすい - 処理の流れが視覚的に理解できる
- リアルタイムプレビュー - 変更結果を即座に確認
- 再利用性が高い - Sub Graphで共通パーツを作成
- URPとHDRPに対応 - Built-in RPはバージョンにより対応状況が異なる
Built-in RP対応状況:
| Unityバージョン | Built-in RP対応状況 |
|---|---|
| 2021.1以前 | 非対応 |
| 2021.2以降(Shader Graph 12〜) | Built-Inターゲット で Lit / Unlit とも対応 |
Built-Inターゲットでは、URP/HDRP向けに先行して追加される一部ノード・設定が使えない制限があります。挙動が違うと感じたら、公式ドキュメントで対象ターゲットの対応状況を確認してください(本記事の検証はUnity 6 / 6000.0時点)。
Shader Graphの構成要素
| 要素 | 説明 |
|---|---|
| Shader Graphアセット | シェーダーの設定を保存するファイル |
| Blackboard | プロパティとキーワードのリスト |
| Master Stack | シェーダーへの最終的な出力 |
| ノード | シェーダーの処理単位 |
| プロパティ | シェーダーの外部パラメータ |
| Sub Graph | 再利用可能なパーツ |
Shader Graphアセットの種類
| 種類 | 用途 |
|---|---|
| Unlit Shader Graph | ライトの影響を受けない(UI、エフェクト向け) |
| Lit Shader Graph | ライトの影響を受ける(PBRマテリアル向け) |
Master Stackの構造
Master Stackは2つのステージで構成されています:

| ステージ | 処理内容 | 主な用途 |
|---|---|---|
| Vertex | 頂点シェーダー処理 | 頂点アニメーション、位置変形 |
| Fragment | フラグメントシェーダー処理 | 色、テクスチャ、ライティング |
Position端子: Vertexステージの Position 端子に接続することで、頂点の位置を変形できます(波打つ水面、風になびく草など)。
Lit Shader GraphのPBRパラメータ
| パラメータ | 説明 |
|---|---|
| Base Color | 基本色 |
| Normal | 法線マップ(凹凸表現) |
| Metallic | 金属度(0=非金属、1=金属) |
| Smoothness | 滑らかさ(0=ザラザラ、1=ツルツル) |
| Emission | 発光色 |
| Ambient Occlusion | 環境遮蔽(影の濃さ) |
| Alpha | 透明度(Transparent設定時に使用) |
透明・半透明マテリアルの設定
ガラスや半透明のマテリアルを作成するには:
- Shader Graphを選択し、Graph Inspector を開く
- Surface Type を
Transparentに変更 - Master Stackの Alpha 端子に透明度を接続(0=完全透明、1=不透明)
Graph Inspectorの主要設定一覧:
| 設定 | 選択肢 | 用途 |
|---|---|---|
| Surface Type | Opaque / Transparent | 不透明 / 透明 |
| Render Face | Front / Back / Both | 描画面 |
| Alpha Clipping | On / Off | テクスチャ切り抜き |
| Two Sided | On / Off | 両面描画 |
| Cast Shadows | On / Off | 影の投影 |
Alpha Clipping: 葉や草など、テクスチャで切り抜きたい場合は Alpha Clipping を有効にし、Alpha Clip Threshold を設定します。テクスチャの A(透明度)をMaster Stackの Alpha にもつないでおかないと、切り抜かれません。
Shader Graphの作成と基本操作
Shader Graphアセットの作成
- Projectウィンドウで右クリック
Create > Shader Graph > URP > Unlit Shader Graphを選択- アセットをダブルクリックしてエディタを開く
ノードの作成と接続
- 作業スペースで右クリック → Create Node
- 検索フィールドでノードを検索
- ノードの出力ポートからMaster Stackの入力ポートへドラッグ
マテリアルの作成と適用
- Shader Graphアセットを右クリック →
Create > Material - 作成されたマテリアルをオブジェクトにドラッ グ&ドロップ
プロパティを使った動的なシェーダー
プロパティの追加
- Blackboardの
+ボタンをクリック - プロパティの種類を選択(Color、Float、Texture2Dなど)
- プロパティをShader Graphウィンドウにドラッグ&ドロップ
スクリプトから色を変更
// 方法1: material直接変更(マテリアルの複製が作られる。不要になったら Destroy で片付ける)
renderer.material.SetColor("_Main_Color", Color.red);
// 方法2: MaterialPropertyBlock(バッチング維持、推奨)
var mpb = new MaterialPropertyBlock();
renderer.GetPropertyBlock(mpb);
mpb.SetColor("_Main_Color", Color.red);
renderer.SetPropertyBlock(mpb);
SRP BatcherとMaterialPropertyBlockの関係(SRP Batcherの仕組みは ドローコールとバッチング を参照):
- SRP Batcher有効環境ではMaterialPropertyBlockを使用するとSRP Batcherのバッチが切れます
- 少数のオブジェクト → MaterialPropertyBlockで問題なし
- 大量のオブジェクト → material instanceの方がSRP Batcherの恩恵を受けられる場合がある
- 用途に応じて使い分けてください
重要: Reference名について スクリプトからプロパティにアクセスする際は、Blackboardで設定した Reference名 を使用します。Blackboardでプロパティを選択し、Graph Inspectorで Reference フィールドを確認してください。デフォルトでは
_プロパティ名の形式になります(例:Main Color→_Main_Color、スペースはアンダースコアに変換) 。Reference名はGraph Inspectorで自由に変更可能です。
テクスチャを使ったシェーダー
- Texture2Dプロパティを追加
- Sample Texture 2Dノードを追加
- プロパティをTexture入力に接続
- RGBA出力をBase Colorに接続
スクロールするテクスチャ
「動くシェーダー」の入門はこれです。川の流れ、ベルトコンベア、背景の雲——Timeノードで取得した時間をUVのオフセットに流し込むと、テクスチャが延々と流れ続けます。

- Timeノード を追加(時間を取得)
- Vector2ノード を追加(X方向のみに時間を適用)
- Tiling and Offsetノード を追加
- Vector2の出力をOffset入力に接続
- Sample Texture 2DのUV入力に接続
スピード調整にはMultiplyノードを使用します。