Shader Graph
Shader Graph は HLSL を書かずノード接続でシェーダーを作る仕組みです——数学やテクスチャを配線し、カスタム表面効果を作れます。Dissolve、Fresnel Effect、Blackboard プロパティ操作まで実践的に学べます。図解とシミュレーターでノード配線を追い、自学にも使えます。
想像してみてください...
Shader Graph はグラフィックスの回路基板です。各ノードが部品:Texture ノードは画像をサンプリング、 Math ノードは色を加減乗、Time ノードは動きを作ります。コードの代わりにポートを配線します。 結果は Master Stack へ——Base Color、Metallic、Normal… を決める最後のノード。視覚的で HLSL 不要です。
概念の詳細
Shader Graph は Universal Render Pipeline
(URP) と HDRP の一部です。Built-in では使えません。
各グラフは .shadergraph アセット——保存時に Unity が HLSL にコンパイルします。作成:
Create → Shader Graph → URP → Lit/Unlit Shader Graph。
ノードの系統:Input(Time、UV、Position、Normal、Color、Texture
2D、Vector)、Math(Add、Multiply、Lerp、Step、Smoothstep、Sine、Noise…)、
Utility(Sample Texture 2D、Normal Map、Fresnel Effect…)。最終結果は
Master Stack の Fragment(と Vertex)へ入ります。
Properties と Keywords が Inspector のつまみを露出する手段です。 Properties は Blackboard(左パネル)にあり——Float “Speed” を追加すると、この Shader を使う すべての Material にスライダーが付きます。
よくある技法:dissolve(Noise + Step + clip)、outline (頂点拡張)、water ripple(sine + UV offset + normal)、 hologram(fresnel + emission + scanline)。Shader Graph は Sub-Graphs もサポート——ノード群を再利用可能な部品にまとめられます。
例:Dissolve Effect Graph
// Noise → Step で境界をはっきり → Alpha Clip でピクセルを切る → Dissolve 効果
ハンズオン手順
Shader Graph Editor を開く
Create → Shader Graph → URP → Unlit/Lit Shader Graph。アセットをダブルクリックしてエディタを開く。
Blackboard に Properties を追加
Blackboard (+) → Float、Color、Texture2D… を追加。プロパティをキャンバスにドラッグして入力ノードを作る。
ノードを接続
出力ポート(右の円)から入力ポート(左の円)へドラッグ。ポート色が一致する必要(Vector3 → Vector3、Float → Float)。
Master Stack に配線
Fragment ブロック(右側):最終結果を Base Color、Alpha、Emission… へ。プレビューがライブ更新。
保存 → Material を作成
Ctrl+S でコンパイル。Material を作成 → 新しい Shader を選ぶ。Properties が Material Inspector に表示されます。
インタラクティブシミュレーター
エフェクトプリセットを選び、対応するノードグラフとプレビューを確認。
Node Graph
Preview
コード例
基本C# から Shader Graph プロパティを駆動——時間とともに dissolve。
using UnityEngine;
using System.Collections;
public class DissolveEffect : MonoBehaviour
{
// Property name must match the Shader Graph blackboard
static readonly int DissolveID = Shader.PropertyToID("_DissolveThreshold");
Renderer rend;
void Awake() => rend = GetComponent<Renderer>();
public void PlayDissolveOut(float duration = 1f)
{
StartCoroutine(DissolveRoutine(0f, 1f, duration));
}
public void PlayDissolveIn(float duration = 1f)
{
StartCoroutine(DissolveRoutine(1f, 0f, duration));
}
IEnumerator DissolveRoutine(float from, float to, float dur)
{
float t = 0f;
while (t < dur)
{
t += Time.deltaTime;
rend.material.SetFloat(DissolveID, Mathf.Lerp(from, to, t / dur));
yield return null;
}
rend.material.SetFloat(DissolveID, to);
}
}コード例
上級Dissolve Graph の HLSL 相当——最適化や Sub-Graph 構築時に便利。
// HLSL fragment shader equivalent of the graph above
// (ShaderLab wrapper omitted for brevity)
// Properties matching the Shader Graph blackboard
float4 _BaseColor;
sampler2D _BaseMap;
float _DissolveThreshold; // Driven from C#
sampler2D _NoiseMap;
float4 frag(v2f i) : SV_Target
{
// Sample noise at the mesh UV
float noise = tex2D(_NoiseMap, i.uv).r;
// Step: clip the pixel if noise < threshold
float dissolve = step(_DissolveThreshold, noise);
clip(dissolve - 0.001f); // Discard if dissolve < 0.001
// Edge glow: pixels near the boundary light up
float edgeWidth = 0.05f;
float edge = step(_DissolveThreshold - edgeWidth, noise) * dissolve;
float3 edgeColor = float3(1, 0.4, 0.1) * edge * 3f;
float4 baseColor = tex2D(_BaseMap, i.uv) * _BaseColor;
return float4(baseColor.rgb + edgeColor, baseColor.a);
}📌 要点
- ▸Shader Graph は URP と HDRP のみ
- ▸Blackboard Properties → Material Inspector に表示
- ▸Sub-Graph: ノード群を再利用用にまとめる
- ▸C# から速く当てるなら Shader.PropertyToID()
- ▸Master Stack の Alpha Clip には Render Face と Alpha Clip の設定が必要
⚠️ よくあるミス
❌ ポート色が合わず赤い線
Vector3 を Float に接続——型不一致
✅ Split/Combine ノードで型を変換
❌ Shader Graph が Material ドロップダウンに出ない
グラフが未保存(Ctrl+S)
✅ 保存し、Unity のコンパイル完了(プログレスバー)を待つ