Material Parameter Collection(MPC)を使ってライト方向を制御する Toon Shader
最近、UE5でセルルック表現を色々試しているのですが、今回は Forward Renderer でも比較的安定して見える Toon Shader を作ってみました。
名前は furcraeaToonLock。
このシェーダでは、UE標準のライティングモデルに強く依存せず、Unlit + Emissive ベースで独自にライティングを計算しています。
そのため、
- Forward Renderer
- Deferred Renderer
の違いによる見た目の変化をかなり抑えられる構成になっています。
今回の記事では、
- なぜ Unlit ベースで作ったのか
- どうやって Toon Band を制御しているのか
- ライト方向をどう扱っているのか
- なぜ RampTexture 方式を考えているのか
などをまとめてみます。
なぜ Unlit + Emissive 構成にしたのか

■ Lit版 vs Unlit版 比較画像
左:
- UE標準 Lit
右:
- furcraeaToonLock
UE5の標準ライティングは非常に強力ですが、セルルックでは環境によって見え方が変化しやすいという問題があります。
特に、
- Forward / Deferred の差
- GI
- Reflection
- Specular
- ポストプロセス
などが強く影響すると、「狙ったトゥーン感」が崩れやすくなります。
そこで今回は、
- PixelNormalWS
- DirectionalLight の方向
- 独自の NdotL 計算
を使い、自前でセルシェーディングを行う構成にしました。
最終的な色は Emissive に出力しています。
ライト方向は Blueprint + MPC で制御

- DirectionalLight
- GetForwardVector
- SetVectorParameterValue
が見える範囲
ライト方向は、Blueprint から Material Parameter Collection に渡しています。
今回使っているのは、
DirectionalLight -> GetForwardVector
です。
取得したベクトルを、
MPC_LightDir
の
LightDir
パラメータにセットし、マテリアル側で参照しています。
これによって、
- ライト回転
- Toon境界
- ハイライト方向
などがリアルタイムに更新されます。
2Band / 3Band の Toon 制御

今回のシェーダでは、2Band / 3Band を切り替えられるようにしています。
最初は smoothstep ベースも試しましたが、グラデーション感が強くなりすぎて、セルルック特有の「段差感」が弱くなってしまいました。
そのため、最終的には step ベースで制御しています。
2Band はかなりグラフィック寄りで、強いアニメ感があります。
3Band は少しリッチで、柔らかいアニメ表現になります。
アウトラインについて

- ON / OFF 比較
アウトラインは、別メッシュ + 別マテリアル構成で作っています。
今回は、
- TwoSided
- TwoSidedSign
- OpacityMask
- World Position Offset
を使って背面のみを描画し、法線方向へ膨らませる方式にしました。
最終的には、かなり軽量で扱いやすい構成になっています。
Material Graph 構成

■ Material Graph 全体スクショ
必須:
- PixelNormalWS
- MPC_LightDir
- NdotL
- Emissive
が見える範囲
マテリアル全体はかなりシンプルです。
基本的には、
PixelNormalWS
↓
NdotL
↓
step
↓
Shadow Color / Light Color
↓
Emissive
という流れで構成しています。
現在はさらに次の展開として、
RampTexture
を使った Toon Ramp Shader 化も進めています。
RampTexture ベースの次世代版について
現在制作中の次バージョンでは、RampTexture を使って Toon 色自体を制御する構成を試しています。
通常の toon shader は、
step(NdotL)
だけで明暗を切り替えることが多いですが、RampTexture を使うことで、
- 暖色系
- 紫系
- 夜景風
- アニメ風
など、絵作り全体をコントロールできるようになります。
現在は、
furcraeaToonRampShader
として開発中です。
Forward Renderer でも比較的安定した Toon 表現
おすすめ内容:
- ライト回転
- 2Band ↔ 3Band
- Outline
- Rim
- Highlight
今回の構成では、ライト方向を Blueprint + MPC 経由で渡しているため、Forward Renderer 環境でも比較的安定した Toon 表現を維持できます。
特に、
- Toon境界
- 段差感
- アウトライン
- 色のコントロール
などが崩れにくい点が気に入っています。
Download / BOOTH

今回紹介した内容は、BOOTHで公開中の furcraeaToonLock をベースにした実装メモです。
- 2Band / 3Band
- Outline
- Rim
- Highlight
- MPC Light Direction
などを含めた構成になっています。
BOOTH:
https://furcraea.booth.pm/
商品ページ:
https://furcraea.booth.pm/items/8219556
次はさらに、RampTexture を使って色味自体をコントロールできる
furcraeaToonRampShader
も作っていく予定です。




















