Shader Graphは、ノードを線でつないでシェーダーを組み立てるUnityのビジュアルエディターです。URPかHDRPを入れたプロジェクトには自動で入り、コードを書かずに色・テクスチャ・アニメーション・ディゾルブのような表現を作れます。現行の長期サポート版Unity 6.3 LTSに対応するのはShader Graph 17.3で、2026年9月時点の最新Supported版Unity 6.6は17.6です。
この記事では、アセットを作ってマテリアルに当てるまでの手順、検索の多いStepノードとTimeノードの仕様、エミッションを光らせる設定、Custom FunctionとSub Graphの使い方を、Shader Graph 17.3の公式マニュアルに沿って説明します。Unity公式の日本語マニュアルで確認できるのは10.0版だけなので、版によって画面や手順が違う箇所も併せて書きます。
まとめ:Shader Graphの要点
- Shader GraphはURP・HDRPを入れると自動で入ります。Built-in Render Pipelineでも2021.2以降は使えますが、互換目的の対応で、XRとGPU Instancingは使えません。
- 作成は「Create > Shader Graph > URP > Lit」、編集画面ではSpaceキーでノード検索、完成したグラフを右クリックして「Create > Material」でマテリアルを作ります。
- Stepノードは成分ごとに「In >= Edge なら1、それ以外は0」を返します。生成コードは
step(Edge, In)で、値が等しいときは1です。境界をなめらかにしたいときはSmoothstepを使います。 - TimeノードのTimeは経過秒数(
_Time.y)です。UVスクロールはTime×速度をTiling And OffsetのOffsetに入れます。 - エミッションを光らせるには、HDRカラーに加えてURPのBloomが必要です。BloomのIntensityは既定値0(無効)なので、上げないと光がにじみません。
- 同じ処理を何度も使うならSub Graph、ノードで書けない処理はCustom FunctionでHLSLを直接書きます。
Shader Graphの対応パイプラインとUnity 6での版の変化
Shader Graphは com.unity.shadergraph パッケージとして提供されます。公式マニュアルは次の3点を明記しています。
- URPかHDRPをインストールすると、Shader Graphも自動でインストールされます。
- Built-in Render Pipelineでは、Unity 2021.2以降にPackage Managerから手動で入れれば使えます。ただしバグ修正以外の更新は行われず、XR非対応で、GPU Instancingも効きません。
- グラフのTarget(出力先)は、Universal・HDRP・Built-inに加え、Custom Render Texture用を選べます。複数のTargetを同時に選ぶと、Targetごとにサブシェーダーが生成されます。
Unity 6以降はエディターのマイナー版ごとにShader Graphの版が上がります。各版の「New in Unity」ページに記載されたShader Graphの追加機能は次のとおりです。
| Unity | Shader Graph | 主な追加(公式の新機能一覧より) |
|---|---|---|
| 6.0 LTS | 17.0 | Heatmapカラーモード、UGUI(Canvas)対応、サンプル追加 |
| 6.2 | 17.2 | Appendノード、キーワードのDynamic Branch設定 |
| 6.3 LTS | 17.3 | テンプレートブラウザ、URPカスタムライティング、Terrain・UI Toolkit対応 |
| 6.4 | 17.4 | Terrain Propertiesノード |
| 6.5 | 17.5 | Expressionノード、Switchノード、HLSL関数のノード化 |
| 6.6 | 17.6 | Preprocessor Directives、パーティクル用ノード5種 |
6.1の新機能一覧にはShader Graphの節がありません。Unityのリリース情報APIで確認すると、2026年9月30日時点の最新は6.3 LTSが6000.3.25f1、6.6が6000.6.3f1です。ネット上のチュートリアルで「From Templateが無い」「Appendノードが見つからない」という食い違いが起きる場合は、まず使っているエディターの版を確認してください。Unity 6.3全体の変更点はUnity 6.3 LTS(6000.3)の新機能と6.2からの変更点で扱っています。
日本語マニュアル(10.0版)と英語版17.x系の使い分け
「shader graph」で検索すると、上位にUnity公式の日本語マニュアル「初めての Shader Graph」が出ます。このページはShader Graph 10.0(Unity 2020.2世代)の版です。docs.unity3d.com/ja/Packages/com.unity.shadergraph@ の後ろの版番号を11.0・12.0・12.1・13.1・14.0・15.0・16.0・17.0〜17.4・17.6の13通りに変えてindex.htmlを取得すると、いずれもHTTP 404でした(2026年9月30日確認)。同じURLから /ja を除いた英語版は表示されます。
10.0の時点でMaster Stackは導入済みなので基本操作は通じます。一方で、Built-in対応(Unity 2021.2以降)、テンプレートブラウザ、Heatmap、UI用ノードは載っていません。Unity 6で作業するなら、英語版の17.x系マニュアル(URLの@以降を自分のShader Graphの版に合わせる)を正本にするのが確実です。
Shader Graphアセットの作成からマテリアル適用までの手順
URPのLitシェーダーを例にした、公式マニュアルの手順です。
- Projectウィンドウで右クリックし、「Create > Shader Graph > URP > Lit」を選んで名前を付けます。Unity 6.3以降は「Create > Shader Graph > From Template」でテンプレートからも作れます。
- Shader Graphウィンドウが開かなければ、作ったアセットをダブルクリックします。アセットを選んでInspectorの「Open Shader Editor」を押しても開けます。
- 作業領域を選んでSpaceキーを押すとCreate Nodeメニューが開きます。「color」で検索し、Input > BasicのColorを追加します。
- ColorノードのOut(4)ポートを、Master StackのFragmentにあるBase Colorへドラッグしてつなぎます。Main Previewの球の色が変わります。
- 左上の「Save Asset」で保存します。保存しないとマテリアルに反映されません。
- ProjectウィンドウでShader Graphアセットを右クリックし、「Create > Material」を選びます。できたマテリアルのShaderには自動でこのグラフが割り当てられます。
- マテリアルをシーン内のオブジェクトへドラッグすれば適用完了です。
「Blank Shader Graph」で空のグラフを作った場合は、Graph InspectorのGraph SettingsでTargetを追加しないと機能しません。生成されたHLSLを読みたいときは、アセットのInspectorにある「View Generated Shader」で確認できます。
Master StackのVertexとFragmentの役割
Master Stackはグラフの終点で、1つのグラフに1つだけ置きます。中身はVertexとFragmentの2つのコンテキストに分かれ、Vertexにつないだノードは頂点シェーダー、Fragmentにつないだノードはピクセル(フラグメント)シェーダーの一部になります。
同じノードを両方のコンテキストにつなぐと、頂点とフラグメントで2回実行されます。Graph Settingsの変更で使えなくなったブロックはグレー表示になり、そこだけにつながったノード列も最終シェーダーに含まれません。
Blackboardのプロパティをマテリアルとスクリプトから操作する設定
Colorノードの代わりにBlackboardの「+」でColorプロパティを作り、Graph InspectorのNode Settingsで「Show In Inspector」を有効にすると、マテリアルのInspectorから値を変えられます。スクリプトから触るときに使うのは表示名ではなく「Reference」の値です。Referenceがアンダースコアで始まらない場合、Unityが自動で先頭に付けます。
Scopeを「Global」にしたプロパティはInspectorに出ず、C#からの一括設定専用になります。マテリアルごとに変えたい値は「Per Material」のままにします。次は、Referenceを _Threshold にしたFloatプロパティをスクリプトで動かす例です。コードをDissolveDriver.csとして保存し、Rendererと対象マテリアルを持つゲームオブジェクトにアタッチします。
using UnityEngine;
public class DissolveDriver : MonoBehaviour
{
static readonly int ThresholdId = Shader.PropertyToID("_Threshold");
[SerializeField] float speed = 0.3f;
Material mat;
void Start()
{
// renderer.material はこのオブジェクト専用の複製を返す(共有マテリアルは変えない)
mat = GetComponent<Renderer>().material;
}
void OnDestroy()
{
if (mat != null)
{
Destroy(mat);
}
}
void Update()
{
mat.SetFloat(ThresholdId, Mathf.PingPong(Time.time * speed, 1f));
}
}
ノードのカテゴリ一覧と代表的なノード
Create Nodeメニューのノードは機能別のカテゴリに分かれています。画面右上のColor Modeを「Category」にすると、ノードの見出しがカテゴリ色で塗られます。
| カテゴリ | 色 | 代表的なノード |
|---|---|---|
| Input | #CB3022 | Color、Time、Sample Texture 2D |
| Math | #4B92F3 | Step、Smoothstep、Lerp、Multiply、Remap |
| UV | #08D78B | Tiling And Offset |
| Procedural | #9C4FFF | Simple Noise、Gradient Noise |
| Channel | #97D13D | Split、Combine、Swizzle、Append |
| Artistic | #DB773B | Blend、Contrast、Saturation |
| Utility | #AEAEAE | Branch、Comparison、Custom Function |
自作のSub GraphはCreate Nodeメニューの「Sub Graph Assets」か、Sub Graph側で指定したカテゴリに並び、Category表示ではUtilityと同じ色になります。個々のノードは、選択してF1キーを押すと公式リファレンスが開きます。
Stepノードの仕様とSmoothstep・Comparisonとの使い分け
Stepノードは、入力Inが入力Edge以上なら1、そうでなければ0を、ベクトルの成分ごとに返します。ポートはEdge(しきい値)・In(判定する値)・Outの3つで、生成されるコードは次のとおりです。
void Unity_Step_float4(float4 Edge, float4 In, out float4 Out)
{
Out = step(Edge, In);
}
つまずきやすいのは次の3点です。
- 引数の順番:HLSLの
step(Edge, In)はしきい値が先です。ノイズとしきい値の接続先を交換すると、値が異なる場所では白黒が逆になります。ただし、値が等しい場所は交換前後とも1なので、厳密な反転にはOne Minusを使います。 - 等しいときは1:比較は「以上」なので、In=0.5・Edge=0.5なら1です。
- 境界のギザギザ:出力は0か1だけなので、斜めの境界にジャギーが出ます。なめらかにしたい場合はSmoothstepで幅を持たせます。
| ノード | 入力 | 出力 | 向いている用途 |
|---|---|---|---|
| Step | Edge、In | 0か1 | くっきりした切り抜き、ディゾルブ |
| Smoothstep | Edge1、Edge2、In | 0〜1(エルミート補間) | やわらかい境界、フェード |
| Comparison | A、B(Float) | Boolean | Branchの条件(6種の比較) |
ComparisonはEqual・NotEqual・Less・LessOrEqual・Greater・GreaterOrEqualの6種を選べ、主にBranchノードの条件に使います。ただしBranchノードは両方の分岐を評価してから片方を捨てる仕様なので、「重い処理を分岐で飛ばす」目的には使えません。0か1の値を掛け算に使うだけなら、Stepで済ませる方がノードが1つ少なくなります。
Stepで組むディゾルブと縁の発光
ノイズで物体が溶けて消えるディゾルブは、URP Litグラフで次のように組みます。
- Graph SettingsでAlpha Clippingを有効にし、FragmentにAlphaとAlpha Clip Thresholdのブロックを出します。Alpha Clip Thresholdは0.5にします。
- Simple Noise(出力は0〜1、Scaleの既定値は500)をStepのInへ、Floatプロパティ
_ThresholdをEdgeへつなぎ、StepのOutをAlphaへつなぎます。 - 縁を光らせるには、Edgeに「
_Threshold+幅」を入れた2つ目のStepを作り、1つ目のStepから引きます。幅には正の値(例:0.05)を指定します。結果は、ノイズがしきい値以上・しきい値+幅未満の帯だけが1になります。 - その帯にHDRカラーを掛けてEmissionへつなぎます。
_Threshold を0から1へ動かすと、ノイズの値が小さい場所から順に消えます。前の章のDissolveDriverはこの値を往復させる例です。
Timeノードの出力とUVスクロール・点滅アニメーション
Timeノードの5つの出力は、それぞれ次の組み込み変数に対応します。
| 出力 | 内容 | 生成コード |
|---|---|---|
| Time | 経過時間(秒) | _Time.y |
| Sine Time | Timeの正弦(-1〜1) | _SinTime.w |
| Cosine Time | Timeの余弦(-1〜1) | _CosTime.w |
| Delta Time | 前フレームからの経過秒 | unity_DeltaTime.x |
| Smooth Delta | 数フレーム平均のDelta Time | unity_DeltaTime.z |
テクスチャを流すUVスクロールは、Time×速度(Vector 2)をTiling And OffsetのOffsetへ入れ、その出力をSample Texture 2DのUVへつなぎます。Tiling And Offsetの計算は UV * Tiling + Offset なので、Offsetが時間とともに増えるぶんだけ模様が移動します。
点滅には、-1〜1で揺れるSine Timeを0〜1に直して使います。Remapノードで入力範囲を-1〜1、出力範囲を0〜1にするか、0.5を掛けて0.5を足します。速さを変えたい場合は、Sine Timeではなく「Time×係数」をSineノードに通します。Sine TimeはTimeそのものの正弦で、周期を変えられないためです。
エミッションで光らせるためのHDRカラーとBloom設定
「Shader Graphで光らせる」には、シェーダー側とシーン側の両方の設定が要ります。シェーダー側は、BlackboardのColorプロパティのModeを「HDR」にしてEmissionブロックへつなぎます。HDRモードでは強さを-10〜10の露出段数で指定でき、Emissionブロックは正の値を前提としています。
シェーダーだけでは色が明るくなるだけで、周囲に光はにじみません。URPでは次の手順でBloomを足します。
- CameraのInspectorで「Post Processing」を有効にします(URPの新規シーンは既定で無効です)。
- 「GameObject > Volume > Global Volume」を追加し、Volumeコンポーネントの「New」でVolume Profileを作ります。
- 「Add Override」でBloomを追加し、Intensityの左にあるチェックボックスをオンにして、値を0より大きくします。Thresholdを変更する場合も、その左のチェックボックスをオンにします。
見落としやすいのが既定値です。BloomのIntensityは既定で0、つまり効果が無効な状態で追加されます。Thresholdの既定値は0.9(ガンマ空間の明るさ)で、これより暗い画素にはBloomがかかりません。HDRカラーの強さをThresholdより上げ、Intensityを上げて、初めて発光して見えます。
Custom FunctionノードとSub Graphによる処理の再利用
ノードで組んだ処理を部品にするのがSub Graph、HLSLを直接書くのがCustom Functionです。
Custom Functionノードの書き方(File・Stringモード)
Custom FunctionノードはUtilityカテゴリにあります。Graph InspectorのNode SettingsでInputs・Outputsのポートを定義し、Typeを次のどちらかにします。
- String:Bodyに関数の中身だけを書きます。引数や波かっこはUnityが補い、
$precisionと書いた箇所はノードの精度に応じてhalfかfloatに置き換わります。 - File:プロジェクト内の
.hlslファイルをSourceに指定し、Nameに関数名を書きます。Nameには精度の接尾辞_floatや_halfを付けません。
Fileモードのファイルは、同じ関数を二重に読み込まないよう #ifndef と #define で囲みます。ファイルを複数作るなら、識別子はファイルごとに変えます。前の章のディゾルブの判定を1つの関数にまとめると次のようになります。
//UNITY_SHADER_NO_UPGRADE
#ifndef DISSOLVE_EDGE_INCLUDED
#define DISSOLVE_EDGE_INCLUDED
void DissolveEdge_float(float Noise, float Threshold, float Width,
out float Alpha, out float Edge)
{
Alpha = step(Threshold, Noise);
Edge = Alpha - step(Threshold + Width, Noise);
}
#endif //DISSOLVE_EDGE_INCLUDED
ノード側ではInputsにNoise・Threshold・Width(Float)、OutputsにAlpha・Edge(Float)を定義し、Nameに DissolveEdge と書きます。この例は _float 版だけなので、Node SettingsのPrecisionを明示的にSingleへ設定します。Halfで使う場合は同じ引数の DissolveEdge_half も用意してください。
ファイル内で関数の外に宣言した変数(uniform)はグローバル扱いになります。マテリアルごとには設定できず、値は Shader.SetGlobalFloat などで一括設定するしかありません。
Sub Graphの作り方と入出力ポート
まとめたいノードを選んで右クリックし、「Convert To Sub-graph」を選ぶと、選んだノードが別アセットのSub Graphになります。空から作る場合はProjectウィンドウで「Create > Shader > Sub Graph」です。Sub GraphにはMaster Stackがなく、代わりにOutputノードが終点になります。
- 入力ポートは、Sub GraphのBlackboardにプロパティを追加すると作れます。
- 出力ポートは、Outputノードを選び、Node SettingsのInputsで「+」を押して追加します。
- プレビューは最初の出力ポートで描かれます。先頭にはBoolean・Float・Vector・Matrixのいずれかを置くと、プレビューがエラーになりません。
Custom Functionノード自体は1つのインスタンスなので、別のグラフで再利用するならSub Graphに入れておくと、ポート定義を作り直さずに済みます。なお、Unity 6.6の新機能にある「Deprecate subgraphs」は、自作のSub Graphに非推奨の印を付けてノード検索から隠す機能です。Sub Graphという仕組みが廃止されるわけではありません。
Shader Graphでできないことと手書きシェーダーへ切り替える判断基準
Shader Graphで編集できるのは、Master StackのVertexとFragmentの2段と、パイプラインが用意したブロックだけです。次に当てはまる場合は、Shader Graphにこだわらずコードで書く方が早く済みます。
- ステンシルの読み書き:Graph Settingsにステンシルの設定項目がありません。URPでの回避方法はUnity Shader Graphでステンシル(Stencil)を使う方法で詳しく説明しています。
- Built-in Render PipelineでのXR・GPU Instancing:公式にサポート外です。Built-in向けの対応はバグ修正のみなので、新しい表現を作るならURPへ移る前提で考えます。
- URP・HDRPでのGPU Instancing:SRP Batcherとは併用できず、通常のMeshRendererではSRP Batcherが優先されます。GPU Instancingを使うなら、Graphics.RenderMeshInstancedで直接描くか、RendererにMaterialPropertyBlockを付けるなどしてSRP Batcherの対象から外します。同じメッシュと同じマテリアルを大量に描く場合は、GPU Instancingの方が効率的な場合があるため、ProfilerでSRP Batcherとの性能差を確認します。
- パスを独自に増やす処理:アウトラインのように2パス目を足す表現は、グラフの外(ShaderLabやRenderer Feature)で組むことになります。
反対に、HLSLの数行で済む計算がノードで組めないだけなら、Custom Functionで足りるので手書きに切り替える必要はありません。Unity 6.6ではGraph SettingsにPreprocessor Directives欄が加わり、pragma・define・includeもCustom Functionなしで追加できるようになりました。
重いノードを見つけるHeatmapと精度設定
Unity 6.0で加わったHeatmapカラーモードは、ノードごとの推定GPU負荷を10色で塗り分けます。黒は0〜3サイクル、赤は64〜127サイクル、黄は1024サイクル以上で、段階は指数的に増えます。水色は負荷不明のノードです。公式マニュアルは、Heatmapは最適化の出発点にする目安で、正確な計測には実機で動かす必要があると注記しています。Color ModeはShift+4で切り替えられます。
精度(Precision)は、Graph Settingsでグラフ全体をSingleかHalfに、Node Settingsでノード単位に設定します。デスクトップではSingleが32ビット、Halfが16ビットです。ワールド座標やUV・三角関数はSingle、短いベクトルや色はHalfが向いている、というのが公式の目安です。
よくある質問
Shader Graphの開き方は?
ProjectウィンドウでShader Graphアセットをダブルクリックするか、アセットを選んでInspectorの「Open Shader Editor」を押します。アセットが無い場合は、右クリックの「Create > Shader Graph」から作ります。メニューにShader Graphが出ないときは、URPかHDRPが入っているか、Built-inならPackage Managerでshadergraphを入れたかを確認してください。
Stepノードで白と黒が逆になるのはなぜですか?
EdgeとInを逆につないでいる可能性が高いです。Stepは step(Edge, In) で、In(判定したい値)がEdge(しきい値)以上のときに1を返します。ノイズやUVはInへ、しきい値のプロパティはEdgeへつなぎます。反転させたいだけなら、One Minusノードを後ろに足す方法もあります。
Shader GraphのTimeノードで速さを変えるには?
Timeの出力にMultiplyで係数を掛けます。点滅ならその結果をSineノードに通し、Remapで0〜1に直します。Sine Time出力はTimeそのものの正弦で周期を変えられないため、速さを調整する用途には向きません。
Shader Graphの日本語マニュアルはありますか?
Unity公式の日本語版で確認できたのはShader Graph 10.0版だけです。11.0〜17.6のうち13通りの版番号で日本語ページのURLを試すと、すべて404でした(2026年9月30日確認)。Unity 6で使うなら、英語版マニュアルのURLの版番号を自分のShader Graphの版(Unity 6.3なら17.3)に合わせて読むのが確実です。
Shader GraphとVFX Graphはどう違いますか?
Shader Graphは物体の表面の描き方(シェーダー)を作るツールで、VFX GraphはGPUでパーティクルを動かすエフェクト用のツールです。両者は連携でき、Graph Settingsの「Support VFX Graph」を有効にしたShader GraphはVFX Graphの出力に使えます。VFX Graph側の使い方はUnity VFX Graphの使い方にまとめています。