【UE5で気分転換!セルルック×ライティングでキャラを魅せたい】第2回:セル、トゥーンレンダリング専用のパス群を追加してみた – Unreal Engine 5.6

Unreal Engine

水ノ茉の宣伝

準備中...
ゲームを作る予定なの
水ノ茉こおり

シリーズ説明

本シリーズで最終的に検証したい内容は、DMXで制御されたバカみたいな量のライト、それらすべてをキャラクターに当てても破綻しないレンダリングパイプラインの構築です。

実装の手段は選ばないため、普段展開している【UE5】◯◯◯ – Unreal Engine ◯.◯と比べると多少敷居が高く、また、実装の再現性を提供しないこともあるため、いつも以上に趣味嗜好が全開となります。

始まり

本シリーズで暴れるための基盤整備の回です。

セル、トゥーンレンダリングを純正パスではなく、独自に追加したトゥーンパスで描いていきます。

GrimでForward+を実装してから自前パスで自由にシェーダーを書けることに味を占めてしまい、純正だと満足できなくなりました。ステンシルテストを自由に出来るのが割と楽しい。

環境

  • Windows 10
  • Unreal Engine 5.6 (d1a4dda)
  • Visual Studio 2022
  • Visual Studio Code
  • RenderDoc, PIX
  • Blender 4.3

トゥーンパス群の挿入位置

トゥーンパス群の挿入位置はVolumetricFogの前に置くか、MeasureFlickeringLumaの後に置くか検討中です。

とりあえずはMeasureFlickeringLumaの後に置いて半透明パスの亜種として仮実装は進めます。

パス構成は上から順番です。

未使用機能の削除

最適化や可読性の観点からCoffeeLiveで使わない描画機能は実装ごと削除しちゃいます。

例を挙げるとNinate, Hair, VSM, Substrateなどです。

ファーストパーソンは動的分岐なのでバリエーションを閉じて最適化しちゃいます。

#define SUPPORT_FIRST_PERSON_RENDERING 1

未定義の初期値が(1)で強制展開されちゃうのかどうかと思いますが、ランタイム側でバリエーション制御していないので強制展開するしかなかったのでしょう。

バリエーションについては文句があるけど、Apply関数で現行挙動を維持しつつ新機能を追加する形は良いですね。

ToonVelocity

速度と深度を書き込むパスです。

このパスはBasePassより先に実行されます。

要はPreDepthです。

これによりBasePass時点でDepthが確定しているため、深度テストを行うことでBasePassはオーバードローを抑制でき、最適化の観点から大変優れています。

しかもこのパスに投下されるマテリアルは条件が揃っていれば最適化された軽量版のマテリアルに切り替わるようになっており、処理負荷を最小限まで抑える工夫がされております。

TwoSidedもDefaultMaterialを許可する

純正では軽量版のマテリアルに切り替わる条件にTwoSidedが使われていないことが含まれています。

CoffeeLiveではTwoSidedの場合に軽量版を使われて不都合になることは現状ないため、最適化も兼ねて許可することにしました。

改修後は全てWorldGridMaterialに変わっていることが確認できました。

ToonBasePass

EmissiveをSceneColorに書き込んだり、法線や各種ライティングに必要な情報をGバッファに書き込むパスです。

GBufferレイアウトはGBufferAがFP16精度のワールド法線で、GBufferBがRGBA32_UINTで各情報を8ビットで詰めています。

RGBA8を使わない理由はレイアウト変更のたびにバッファ増減のランタイム対応が面倒だったからです。

1枚に詰めておけばランタイムの実装は1回で済みます。レイアウトを変更する際はシェーダー側のエンコードとデコードを書き換えるだけなので、イテレーションを確保したい初期ではこの方が都合が良いのです。

あと純正だとBasePassがウーバーシェーダーに乗っかっている都合上、UINTに変更するのがとんでもなく面倒なので、独自パス群なら簡単に実現できるということで、やりたくなったのです。

ToonLights

Gバッファを参照してライティングをするパスです。

ライティングに着手するのはもう少し先なのでリソースはダミーを突っ込んでいます。

独自のトゥーンパス群を追加しようと思った理由のひとつに、このライトパス存在があります。

ライティングシェーダーを読んだことある方なら分かると思いますが、動的分岐が非常に多いのです。

本当に多い。

未使用の動的分岐を削除したり、静的分岐・バリエーションに変えたりすることで、余裕で数ミリ秒を削れるレベルです。

理解はしているので補足しておくとEPICの設計が悪いとかではないです。
汎用ゲームエンジンの宿命です。

『機能ごとにバリエーションを設ければいいじゃん』と思うかもしれませんが、バリエーションはひとつ追加するたびに最低でも累乗、指数関数的に増えます。そのため、UEほどの多機能なゲームエンジンでその選択は実質不可能なのです。

結果的に動的分岐を選択せざる得ないのですが、その分岐内に秘められた処理が膨大の為、分岐したとて、重いのです。

そういう背景がある中でセルルックに対応したライティングを実装するのは負荷対策的に泣いちゃう未来が見えたので、独自パスという選択肢を選ぶ理由のひとつになったのでした。

ToonCompositionPass

トゥーンパスのライティング結果や深度や速度、GバッファをSceneColorに合成するパスです。

トゥーンの深度
メインの深度
トゥーンの速度
メインの速度
トゥーンのカラー
メインのカラー

5.6からは明示的な RemoveUnusedTextureWarning(...) は不要になったようです。

TSR環境下における速度の重要性

テンポラル系アンチエイリアスのひとつであるTSRは、とにかく速度が最重要です。

これがズレたり不一致が発生するとゴースティングの序章です。

ToonCompositionPassで速度の合成を忘れると、こんな感じで処理速度が安定しているにも拘らずゴースティングが発生します。分かりやすい部位としては前髪ですね。

細かいことはアウトラインの回で話題に上げると思います。

左が速度書き込みなし、右が速度書き込みあり

おわり!!!

機能追加や最適化のたびに設計変更は発生しますが、パイプラインの大枠は準備出来ました。

セルルック関連

雑談

基盤実装って作業者はめっちゃ楽しいんだけど、こうなんだろう、文面に起こすと絵的な面白味はないですね。

特に今回は実装方法の詳細を非公開としているので尚更。

次回は背面法なアウトラインとポストプロセスなアウトインを予定しているので、絵的な面白味は多少マシかな。

オトメきグッズ届いた

むふふ。

届きました。

半年記念ということは1周年でも出してくれるのかな。

その時はホワイトとブラックのカラバリを期待したいですね。

エロゲの準備

遊びたいなーと思うだけだと永遠と後回しにしちゃうので、とりあえず購入しました。
正式対応はVistaまでだったので結構不安でしたが無事起動して一安心です。

水ノ茉でゲームを作っている関係で今下手にシナリオを読み込むと世界観設定に影響が出てしまうかもと思い、避けていたのですが、そうすぐに完成する物語でもないので、気にせず遊ぶことにします。

ADV補助ツールもいつかネタにしようと思い続けて1年以上経過しました。
深層学習もここ数年で一気、というか異常なほど発展しましたね。
趣味の領域では付いていけないレベルなのでもう放置です。

ゆずソフト新作

むふふ。

ライムライト・レモネードジャム|ゆずソフト
ゆずソフト最新作ライムライト・レモネードジャムのPC版公式サイトです。

楽しみです。

『3LJ(スリーエルジェー)』略称はリドジョのように表記もカタカナだったらもっと嬉しかったですね。

楽しみなんですけど、未だに天使騒々を共通ルートで放置しています。
喫茶は共通ルートすら終わってないような記憶があったような、ないような。

ぶらばんを履修していないので分からないのですが、経験者はそれを思い出すような作品になるのでしょうか?

そして非日常に頼らないシナリオ構成、どうやるんでしょうか。

普通に面白そうなので期待なのです。

推しは未定です。そのうち決めます。もしくは遊んでから決めます。

いつものように店舗特典を漁ったら10万ぐらいは飛びそうですね。

もう少し浪費枠と開発費を稼ぎたいのでGW明けに転職エージェントに行ってきたのですが、現行で平均以上得ているという面白くない現実を突き付けられ、中断しました。

また今度、気が向いた時に辞めるとします。

いま思い返すと面接は平日、でも仕事ある、うーん、無理やん、という当たり前のことを忘れていました。

趣味を続けるための手段としてお仕事をしているのです。

忙しくなると目的と手段が逆転しちゃうこともありますので、お気を付けなのです。