[UE5][Shader]furcraeaToonLock — UE5で作る Unlit + MPC ベースのトゥーンシェーダ

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

も作っていく予定です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です