SubstrateのToon BSDFについて
※この記事はまだ正式にリリースされていない、GitHubのMainブランチのUE5.8で検証しています。リリース時には色々変わっている可能性があることをご了承ください。
Substrateとは
SubstrateはUE5.7から正式採用された新しいマテリアルシステムです。より正確で複雑な物理ベースレンダリング(PBR)を実現する目的で実装され、Unreal Engineの標準マテリアルシステムとなりました。今はまだ今までのマテリアルシステムを使用することができますが、いずれSubstrateに一本化されるみたいです。
思えばUE4のマテリアルシステムはUE3をわりとそのまま継承したもので、アップデートを繰り返してきたものの少々古い仕様でした。Metallic/Roghness/Specularでの質感表現は若干時代遅れになってきていました。
とはいえ、この記事ではそのへんの話はしません。検索すれば資料がたくさんあるのでそちらを見てください。
この記事ではUE5.8から実装されるSubstrateベースのToonレンダリングマテリアルについてちょっと解説してみたいと思います。とりあえずProject SettignsからSubstrateを有効にしましょう。UE5.8ではデフォルトで有効になっています。

この記事ではBlendable GBufferでのみ検証しています。
SubstrateにおけるToon表現
ということで、適当にToonマテリアルを作成してみましょう。空のマテリアルのFrontMaterialにSubstrate Toon BSDFノードを接続して、DiffuseColorに色を設定するだけです。簡単ですね!


1分で素敵なToon表現が完成しました。素敵!

境界がはっきりしたスペキュラも面白いですね。
ToonやSpecularをどう処理してるかの秘密はToonProfileにあります。Substrate Toon BSDFノードを選択するとマテリアルのプロパティにToon Profileという項目があります。

デフォルトではNoneになっていますが、実際にはデフォルトのToonProfileテクスチャが割り当てられています。
ドロップダウンを選択してCREATE NEW ASSETのToon Profileを選択すると新しいToon Profileが作成され、アサインされます。

作成された新しいToon Profileを開くとこのような状態になっています。これがデフォルトのToon Profileで、Noneのときはこれが適用されています。

Diffuse Rampが色部分のLUT(Look Up Texture)で、Specular Rampがスペキュラ部分のLUTです。
考え方としてはMayaのRampシェーダーに似ています。0.0 - 1.0の範囲で上部の四角いUIを移動することで編集できるようになっています。
こんなふうによりシンプルなToonにしたりもできます


Substrate界にこんな見た目のキャラが共存できるのは面白いです。

階調部分をダブルクリックしてグラフ編集もできます。RGB個別に操作も可能なので、こんなふうに色を変化させることもできます。

Toon Profileの素晴らしい点として、リアルタイムに編集が可能なのでレンダリング結果を見ながら自由に調整できます。
今まではエンジンを改造してシェーダーコードやテクスチャを編集しながら調整していたものがリアルタイムにみながら調整できるので、より細かく繊細な調整が可能になります。
内部的な話をすると、Toon ProfileはTexture Arrayとして保管され、256枚まで作成できます。「顔と服と武器と背景でそれぞれ違うToonカーブを作りたい」といった要望にも十分応えられると思います。
影の話
ところでToonシェーディングで毎度問題になるのは影の表現です。影の中に入ったときにどうなるのか。検証のためにわかりやすい感じでToon Profileに色を付けてみました。

影を確認するために直接光の影響だけを見たいのでスカイライトとグローバルイルミネーションを切った状態でみるとこんな感じです。

Diffuse Rampの横方向の数値が0.5以下の部分は通常のDiffuse Lightingでは0になる部分です。NdotL、つまり法線と光の角度が直角以上になると光が当たらないので真っ黒になるわけです。内積の結果は-1から1ですが、テクスチャに格納するために1足して0.5をかけて0から1にマッピングしています。このToon Profileでは影として扱われる真っ黒になる領域に色が付いているので、影の中にも色が付いて見えます。影の中にまでライティングでピクセルを描けるというのはUnreal史上わりと事件です。一般にToon系はDeferred RenderingよりForward Renderingの方がやりやすいというのはDeferred Renderingでは光が当たっている部分と影が分離して描画される仕組みにも事情があったりします。
スカイライトとグローバルイルミネーションを有効にするとこんな感じです。

Toon Profileで階調表現が実現できるようになっても間接光が上に乗るのでフラットなセルルックにするにはまだまだ工夫が必要になります。
キャラ全体を影に入れるとフラットな階調表現にしたかったのに滑らかなシェーディングが出てきてしまいます。

Skylight DiffuseやGIのシェーディングが一般的なLambertで計算されているので、影にはいると普通のLambertシェーディングになってしまいます。この辺はまだエンジン改造が必要になるのかな。(自分のプロジェクトではSkylight DiffuseにもToon Profileを適用していたりします)
また、Toonにするとシャドウアクネが目立ちます。プレビューマテリアルがわかりやすいですが、ギザギザのガビガビな部分ですね

レイトレーシング
レイトレ反射はどうなってるのかな?と軽く試したものです。

スクリーン外は普通のレンダリングになってしまうので、そのままではToonマテリアルは反射しないみたいですね。
まとめ
というわけで、UE5.8の目玉機能(かどうかはしりませんが)のToonを先取りで検証してみました。「この機能があればセルルックがエンジン改造無しでできるぜ」と言うには色々乗り越えないといけない問題がありますが、調整次第では面白い絵が作れるんじゃないでしょうか。まだまだ今後のアップデートもあると思いますし、楽しみな機能であるのは間違いないです。
エンジンコードを覗いてみると
#define SUBSTRATE_BSDF_TYPE_SLAB 0
#define SUBSTRATE_BSDF_TYPE_VOLUMETRICFOGCLOUD 1
#define SUBSTRATE_BSDF_TYPE_UNLIT 2
#define SUBSTRATE_BSDF_TYPE_HAIR 3
#define SUBSTRATE_BSDF_TYPE_SINGLELAYERWATER 4
#define SUBSTRATE_BSDF_TYPE_EYE 5
#define SUBSTRATE_BSDF_TYPE_TOON 6
//define SUBSTRATE_BSDF_TYPE_CUSTOM 7 Reserved for Custom shading model
CUSTOMというのが予定されてるんでしょうか。さらに自由度の高いシェーディングモデルを夢見てしまいます。
Diffuseだけでなく、ライティングやGBufferに書き出す内容とか自由にコードで書けるモデルとかだと良いなあと個人的には思ってみたり。あとは間接光のライティングもいじれるようになって欲しい。
以上、SubstrateのToonマテリアルのフライング情報でした。