【UE5で気分転換!セルルック×ライティングでキャラを魅せたい】第9回:珈琲時間 中編 – Unreal Engine 5.6

Unreal Engine

水ノ茉の宣伝

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

シリーズ説明

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

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

始まり

最終回、なのです。

最終回の予定でしたが、やりたいことを詰め込んだら溢れそうになったので急遽中編として区切ります。

見出しの時系列は崩壊しています。

若干の迷宮入り

アニメっぽいルックか、エロゲのCG絵っぽいルックか、悩ましいです。

自問自答し過ぎて誰が本体の意見か分からなくなってきたので出口が見えるまでの間、寄り道をします。

VectorParameterの色空間はHexLinearを前提です。

肌色

  • 赤みが強い
  • Lighten: FAE9E1FF
  • Darken: D85E56FF
  • 黄色みが強い
  • Lighten: FFF5D9FF
  • Darken: D58F6AFF
  • Darkenを常駐とした表現
  • 仮にセルルックとしてもSSS味は混入させてもいいかも
  • 陰影箇所のDarkenを排除した表現
  • SSS過ぎないけど、かといってセル感が極端に増すわけでもない、なんか中途半端かな
  • 指の視認性が低下する

迷宮脱出

『セルルック』って書いてあるやん。

過去の私に従ってセルルックにします。

セルルックの種類としてはアニメ調です。
ベタ塗りと輪郭線が主成分で、明暗は2値化な定番な表現です。

蒔菜まきなさんに救出されたい人生でした。監禁されるのはお断りだけど。

さてと、参考資料を撮ってきてコンフルに纏めて一気に進めるとしますか。

バフが掛かってきた感じがします。

キャラと背景を別々のシャドウデプス

ライトに照らされていない部分は暗くなるのが視覚的に自然です。

しかしこの表現、地味に処理負荷が高かったり、調整が難しかったりします。というのも、ライトベクトルと法線の内積であるNoLだけで処理しようとすると、どうしても目元や口内、髪の丸まった部分が明状態になってしまいます。これを回避するためにシャドウデプスとシーンデプスを元に作成したシャドウマップを参照するのですが、シャドウデプスの解像度が低かったり、バイアスが高すぎると、綺麗に影が落ちずに永遠と問題が解決しません。

単純に解像度を上げたり、バイアスを高くすれば解決するのですが、前者は処理負荷が素直に上昇しますし、後者はシャドウアクネと呼ばれるアーティファクトが発生する可能性が上がります。

これらの問題を背景とキャラのシャドウデプスを別々に書いて抑制していきます。別々に書く理由としては以下です。若干の注意点として根本解決のための手段として採用している訳ではなく、シンプルに分けて書きたいという筆者の気分によるものがほとんどで、理由なんて適当に紐づけしたに過ぎません。

  • 負荷が上がる
    • 高解像度なシャドウデプスで背景とキャラを一緒に書き込むから重い
      • 背景は通常解像度、キャラは高解像度で書き込めば解決
  • シャドウアクネの問題
    • 背景とキャラに同じバイアスを適用するから発生しやすい
      • 別々にすれば調整が容易(根本解決ではないけど)

キャラと背景を別々のシャドウデプスに書き込めること、それぞれでパラメータ調整出来るようになりました。

シャドウのレンジの調整

シャドウマップの精度は8ビットです。格納時にsqrtによるエンコード、取り出し時にSquareによるデコードで特定の値範囲が高精度になる工夫が施されていますが、CoffeeLiveでは品質が不足しているため、自前のエンコードとデコード処理に換装します。

改善前は量子化っぽい見た目ですが、改善後はある程度解消されていることが確認できました。特に胸の下は顕著ですね。

輪郭線の調整

アニメ調っぽい輪郭線に調整しました。線の太さは筆者が観たことあるアニメの世代に影響されています。

ポストアウトラインのパスがライティングパスの後ろにあるため、周りが発光している場面で不自然に浮くことがあります。

浮くことがあったんですが、なんか、あんまり気になりませんね。

勘違いだったかな。関係ないけどブルーム綺麗だね。

勘違い、記憶違い説はありますが、設計上は明らかに不備なので自己満も兼ねて修正します。セルルックの面倒なところが計算上や設計が不適切でもそれが結果的に良い絵面に寄与していることが稀にあるんですよね。ダメだったらオミットすればいいだけなのでとりあえず改修しました。

輪郭線が真っ黒な場合は計算仕様で色が乗りませんが、成分を0.0超過させるとライトカラーが反映されるようになりました。

正直な感想としてはライティングを出来るようにしたところで制御が難しいですね。ライティングさせ過ぎるとコントラストの消失によって輪郭線らしさが無くなってしまいますし、しなさ過ぎも場面によっては輪郭線が悪目立ちしちゃいますし。そのピクセルが輪郭線か否かのフラグ情報はGバッファに格納しているので、必要に応じて例外処理を組んだ方が無難そうですね。絵を見ながら適宜調整することにします。

頂点インデックスを元に引いたり、距離ごとに係数を出来るようにしたり、細かな機能を追加です。

部位ごとに係数を細分化したのは品質調整の観点からは良かったのですが、調整するたびにアホみたいに時間が溶けますね。普段は機能提供だけしてこういう調整は一切しないことにしているので、シンプルに経験不足もあるんでしょうが。

ライトカラーの調整

ライトの色味がいい感じに乗るように計算を調整しました。

陰影の調整

瞳と顔陰の明暗制御は例外的な計算に修正です。瞳は内積に頼ると歪な明暗が出てしまい、顔陰はライト減衰を通常の計算式で反映するとSDFで任意に作成した形状を壊してしまうという、両者とも似たような理由からです。もう少しパラメータを調整して周囲との明暗の遷移を合わせたいですね。微妙な差が気になります。

速度と深度パスの不具合修正

カメラスイッチをすると一瞬だけ真っ黒になる不具合を見つけました。

ライトや陰影の正規化に使用している履歴バッファがビューに紐づいていることが原因と推定できますが、なんか違和感あるんですよね。というのもカメラカットをしたら履歴補間せずに最新の値で上書きするように組んでいるのです。気になるので調べてみましょうか。

原因判明です。

新しいカメラに切り替えたフレームは速度が不正になるため、Velocityパスを無効化しています。トゥーンパス群はVelocityパスでPreDepthしているため、無効化しちゃうとデプスバッファが書き込みされていない不正な状態になっていました。デプスがクリア値な状態でシャドウマップを作ると全影になるので、結果としてライティングがすべて真っ黒になっていたようです。

修正完了です。

最後のスイッチで一瞬だけ明るくなるのは自動露出の調整速度が早すぎることが原因なので気にせずです。当初の予定では自動露出は無効化でしたが、有効化した方が背景が映えるので方針転換です。自動露出による原作色の消失はトゥーンシェーダーの方で自動露出の乗算計算を切って、影響をポストエフェクトに限定することでそれなりに抑えられました。どのみち大量のライトを当てる過程で露出等による周辺光の取り込みは避けられない未来でした。

かわいい。

カメラワーク

動画観ながらトレースしてるだけなのにバカほど面倒です。

面倒なことが大嫌いなのに稀によくこういうバカな手段を取ってしまいます。

データコンバートした方がマシだったでしょうが、最初はカメラ動かすの楽しかったんです。

そう、最初の10分ぐらい。残りはすべて後悔の時間。

トレース完了っと。真似するだけなのに疲れたわ。

カメラトレースが終わってから思いましたが、MMDのカメラをトレースする場合、ステージ全体を見るようなカットは基本的には存在しないので、なんか、ちょっと勿体ないことをしてしまいました。これだけ光らせても画面内に映るライトシャフトなんて現状5つ程度なんですよね。

トゥーンパス群にステンシルテストを設定

ライトを本格的に配置し始めたら負荷が伸びてきました。

そろそろステンシルテストを設定して一気に軽量化するとします。

想像通り軽くなりましたね。

ライトを増やしたかった

当初はキャラに当てるライトは正面から3つほどでした。

ふと思いました。

多光源感とは。

このままではアイデンティティの喪失です。

ということで、適当に支柱を生やして等間隔にライトを配置しました。

これよ、これ。満足です。

そして問題が発生しました。

ライト制御が面倒過ぎて手が付けられない。

未来の私が負債を返済することでしょう。頼む。

試しにバックライト3つ、フロント3つ、サイド2つを当ててみます。地面に落ちている影がいいですね。すごく多光源味を感じます。

結果論ではありますが、正規化のアプローチは大正解でした。理論上はライトごとの光量調整を一切せずに大量のライトをキャラに当てても極端に白飛びすることなく、いい感じに反映できるのです。あとはどこまで耐えてくれるかの耐久テストですね。

おわり!!!

ライトを増設したり、GPUクロスシミュの実装が間に合ったり、色々と追加でやりたいことに身を委ねていたら思ったより楽しい時間が延長戦です。

割と楽しいのですが、そろぼち制作に戻らないといけないので10末頃を目途に終わりとします。

セルルック関連

えちえち GPU Cloth Simulation

SkeletalMeshに流し込めました。

あとはコリジョンとボーン行列を反映の部分を作業すればそれっぽく使えることでしょう。

開発機材の新調

4年ぶりに開発機材を更新しました。

理想は2年周期ですが、お財布の負担が大きいので基本的には4年周期と決めていて、GPUはサイクルが早いので必要に応じて買い足しというスタイルです。

昔は自作した方が安上がりだったのですが、ある時期からそこまで差が出なくなり、相性問題とか色々と考えた末にBTOで購入という形に落ち着きました。

カスタマイズ画面を眺める時間はやはり楽しいですね。

UEで頻繁にエンジンビルドをする身としてはスレッド数は正義なので大幅に強化です。理想を言えばスリッパを買いたかったのですが、予算である100万を超過しちゃうので、今回は断念です。次の購入サイクルでは買いたいですね。

おふるおにゅー
OSWindows 10 HomeWindows 11 Pro
CPURyzen 9 5900X
3.70GHz [最大4.80GHz]
12コア / 24スレッド
Ryzen 9 9950X3D
4.3GHz [最大5.7GHz]
16コア / 32スレッド
メモリ64GB128GB
NVMe SSD [1st]1TB4TB
NVMe SSD [2nd]2TB4TB
GPURTX 3090 Ti 24GBRTX 5090 32GB

クレカの限度額に引っかかって買えないので一時的に増額してもらって無事購入です。前回購入した時は無金利キャンペーンだったので喜んで48回で分割したんですが、最近はそのキャンペーンを封じたのか微塵も見る機会がないので諦めて一括です。

むふふ。楽しみです。

BTOの面白い所は同じ構成でもベースを変えるだけで最終金額が異なることです。筆者が購入したサイトだと、完全に同じ構成でもベースを変えるだけで約16万ほど変わります。すべてのBTOサイトを徘徊すればこれより安く仕入れられたり、相性問題が少ないSSDは別途購入というスタイルを取れば1~2万ほど節約できたり、この辺りを考えるのも一興ですよね。少なくとも前回か前々回買った頃はこのサイトが一番安かったんですが、今はどうなんでしょうね。ここは運営元が大手なのでシンプルに仕入れが強いんでしょう。当時は異様に安かった記憶があります。今は正直分からないですが、学生の頃から使っているので脳死で使い続けてます。

皆さんも仕事道具には可能な範囲で惜しみなく投資すると良きです。イテレーションが上がると短時間で色んなことが出来るのでより楽しく開発や検証できます。

協調性の無い子、DRAM

マジでコイツ問題児過ぎてキレそう。

おにゅーの開発環境が届いたついでにおふるのお掃除をしていたのです。

お掃除中は電源から切り離されます。

そしてその後に起動すると高確率でDRAMのエラーランプが付くのです。

原因は分かっています。

過去にDRAMを32GBから64GBに増設したことです。

大体はボタン電池リセットしたり、DRAMを2本、4本と徐々に増設して起動確認すれば乗り切れますが、今回はどうあがいてもダメでした。

タイミング的に実害はなかったですが、マジでコイツの相性問題どうにかならないですかね。

という愚痴。

ふるさと納税

楽天でポイントが付かなくなる前に駆け込みです。

約4,000ほど付与されました。

来年からはこれが得られないのですね。

惜しいです。