Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE5 Substrateでのトゥーンシェーダーの可能性を探る

この記事はUnreal Engine (UE) Advent Calendar 2025その1、21日目の記事となります。

qiita.com

さて、今年も年1の更新となってしまいましたが、Unreal Engine 5.7が正式にリリースされ、"Substrate"という機能がProduction Readyとなりました。これからSubstrateは旧式のマテリアルがUE5.9で廃止と共にメインマテリアルシステムになる予定です。

Substrateは以前、"Strate"と呼ばれていた機能であり、ちょうど3年前にもここで解説していました。この頃とは大分機能回りも変更されており、あくまでも参考程度にしてください。

unrealengine.hatenablog.com

今回はSubstrateを使って、トゥーンシェーダーを作る場合について、可能性の話をしたいと思います。

※読む前の注意。この話には結論があるわけではなく、あくまでも可能性の話を語るだけですので、読み物としてお楽しみください

Substrateについての事前知識

Substrateについての事前知識がない方はEpic Games Japan 向井さんの公式スライドをまずは呼んでみるのがよいと思います。

www.docswell.com

Substrateはわかりやすく言えば『複数層マテリアルで光を透過して表現ができる』新しいマテリアルシステムです。これまではLayerd MaterialやMaterial Layerという仕組みでもマテリアルに複数層をもたせることはできましたが、内部の光の透過までは表現することができず、不完全な表現でした。

ただし、トゥーンシェーダーやセルシェーダー、NPRの表現において、これが必要なのか?と言われると難しいところだと思います。正直に言えばこの仕組みがなくてもどうにでもなるような気はします。

今回はあえてSubstrateを使って、どこまで表現ができるのかを検証していきます。3Dモデルについては『鳴潮』の『千咲』というキャラを使っていきます。

wutheringwaves.kurogames.com

DLは以下からMMDモデル形式でDL可能。インポート方法はここでは解説しません。

www.bilibili.com

Copyright ©KURO GAMES. ALL RIGHTS RESERVED.

Unlitによる表現

非常にシンプルなセルシェーダーを組んでおきます。ディレクショナルライトの方向を受け取り、影を落とすというもので、これは以前にこのブログで解説したものとほぼ同様です。

unrealengine.hatenablog.com

これをシンプルに表現するのであれば、『Substrate Unlit BSDF』ノードで表現ができます。

『EmissiveColor』にセルシェーダーの結果をマテリアル最終ノードの『フロントマテリアル』ピンに接続するだけです。

うん、これだけでも十分悪くない結果と言えるでしょう。ただし、Unlitで作ろうとすると、問題はライトがない環境下で発生するシェーディングです。

背景もライトがないのにキャラクターだけが光って、そのまま画面内に残ってしまいます。これがUnlitで作る時の弊害です。光がない時はちゃんと暗くなってほしい。これに正確に対応しようとすると、ブループリント&マテリアルでライト計算を行って反映させる、もしくはエンジン改造でシェーディングモデルを自作する必要ができます。

これに対応するために、UE4時代では『Subsurface』シェーディングモデルで代用していました。Subsurface Colorは光の透過を表現するため、ライティングの影響を受けるが、強く受けすぎないという特徴もあり、比較的トゥーン、セルシェード向けのシェーディングモデルとして利用されていました。

ではUE5になって、Substrateを使った場合、どうすればいいのでしょうか?

Slabを使って表現

Substrateは『Substrate Slab BSDF』ノードが最も一般的に利用されるノードです。

特に重要となるのは以下のピンです。

  • Diffuse Albedo
  • F0
  • Roughness
  • SSS MFP
  • SSS Phase Anisotropy

先にF0とRoughnessを説明します。

まず『F0』は光の反射率に近いもので、これまでのマテリアルではメタリックで表現されていたものに近いです。ただしF0では色と輝度を設定することが可能です。余計な光の反射が発生してほしくないので、基本的にConstantで『0』にしておきましょう。

次に『Roughness』ですがこちらはUE4時代から大きく変わることはありません。『0』に近いほど滑らかとなり、鏡面反射が発生しますので、こちらも基本的にConstantで『1』を設定しておきます。

そしてここからが重要となってきますが、『Diffuse Albed』についてです。これはUE4時代では『Base Color』に相当するものですが、名前の通り拡散反射される光の割合という意味で、色だけを制御するものではありません。数値が高いほど拡散反射される光の量が変わるため、制御が非常に難しくなります。

先程のUnlitで作ったノードをそのまま『Diffuse Albed』に接続してみるとします。

色は付きましたが、ちょっとリアルなレンダリングになってて少し怖いです。ここからSubstrateのSubsurface Scattering(通称SSS)機能を使ってみましょう。

SSS機能について

SubstrateのSSSはUE4時代までとは違います。扱いになれるまでかなり苦戦します。Subsurface Colorのようなピンは存在しないので、これはDiffuse Albedで代用します。

次にSubsurface Typeです。『Substrate Slab BSDF』ノードを選択して、詳細パネルをみてください。

初期は『Diffuse』になっていますが、『Two Sided Wrap』を選択しておきます。これは本来薄いフォリッジのようなメッシュに使いますが、光の反射を良い感じに淡く拡げてくれるので、使いやすいです。

更に『SSS MFP』についてです。これは光が入った時の光量の伝達量を設定するもので、より直感的に設定するためには『Substrate Transmittance-To-MeanFreePath』ノードと一緒に使用します。

これを設定した状態で確認します。

並べてみないとわかりづらいですが、髪の下に入る影の色がかなり薄くなりました。これだけでも実はとても大きな変化です。ただし、これだけではまだ微妙です。

ここから更に『SSS Phase Anisotropy』というパラメーターを設定します。これによってフェーズ関数が引き伸ばされて、散乱効果が現れるそうです。

数値は『0.2』くらいで。これでまた比較してみましょう。

かなり髪の下の影が薄くなっていい感じになりましたね。

最後に色を調整

全体的に色が濃いのでここで色を調整するために『Blend_Overay』ノードを利用します。

最後にこれまでの色と白に近いグレーでブレンドしたものを『Diffuse Albed』へ渡します。

今回最終的に出来上がったのがこちらです。ただし、現状はまだ検証中の状態であり、満足しているわけではありません。もっと良くなる部分は多々あるはずです。

しかしSlabノードを使ってここまで来れたのは一定の成果がありました。今後もSSS機能をもう少し検証し、もっとトゥーンやセルシェード、NPR表現を模索したいと思います。可能であれば他のSlabノードとミックスすることでより多層構造のマテリアルで表現したいとも考えています。

というわけで、少し中途半端となってしまいましたが今回はここで時間切れとなり終了。またどこかで成果をだせればいいですね。

しかしUE5.8ではエンジン標準に『Toon BSDF』ノードがつくらしいので、ここまでやる必要がなくなるかもしれませんね。よい機能が標準で付くことを祈る。

追記

UE5.8から入る予定のToon Shading BSDFについて