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

Unreal Engine

水ノ茉の宣伝

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

シリーズ説明

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

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

始まり

今度こそ、最終回、なのです。

成果物

観たい時に下までスクロールするのが面倒なので先に貼り付けます。

Rein Cloth

えちえち GPU Cloth Simulationとして進行していたものが形になったので、おまけから本編に昇格です。

内製のCPU及びGPUクロスシミュレーションです。

揺れモノって18禁感がないのにエッチだよね。ご満悦です。

生まれたてほやほやでセルフコリジョンが未完成だったり、コリジョンや自然な揺れ方が目標とする品質に達していませんが、とりあえずは実践投入です。少しずつ育てていくとします。

アルゴリズムはPBDとXPBDの選択式です。基本的には後者の方が結果が安定しますが、物理挙動を学ぶ際にお世話になったPBDさんも残しています。

UEには純正でChaosClothというCPUクロスシミュレーションが提供されていますが、相も変わらず汎用性の代償として膨大なパラメータ、そしてあまりにも現実的な物理挙動でゲームやセル系の映像作品では扱い熟すのが中々に難しかったりします。ChaosClothほどの複雑で多機能なモノは、それを扱い熟すための学習コストと、その機能自体を1から作成する自作コストに然程差はないと思っています。なので、欲望に身を任せて作ってみたのです。たしか鉄拳も内製のクロスシミュですよね。CEDEC2024で観た記憶があります。というかそこで他人が作っている事例を見たので、それなら私でも出来るやろと思えたのも発端のひとつです。面倒くさがりな筆者さんにおいてきっかけを与えてくれるイベントは重要なのです。諸刃の剣だけど。

ライティングパスの最適化

計測してみるとライティングに含まれるクリアパスが常駐的な負荷を叩き出しています。

クリアパスの最適化

単位はナノ秒なのでそこまで気に留める必要がないと思えちゃいますが、ディファードライティングは当然ながらライトごとにライティングパスが挿入されるため、普通に塵積案件、無視はできません。そもそもクリアパスが挿入されている理由に、後続のパスのブレンドモードにAddやMinを使っている、シャドウやライトファンクションが球や円錐のプリミティブで描画されており、書き込まれていない領域が発生するというのがあります。汎用性や安全性のために負荷を取っている感じです。トゥーンパス群においては汎用性という設計思想は一切不要なので、最初に投下するパスのブレンドモードをReplaceに設定、パスが一切投下されない場合はダミーバッファをフェッチという形で最適化をしていきます。書き込まれていない領域に関しては後ほどライティング計算の大改修をする際に解消されるので今は無視します。

シャドウのステンシル書き込みの最適化

シャドウは純正の負荷対策としてステンシルを書き込むフラスタムなプリミティブを投下した後に、先ほどのステンシルを元にテストしながらシャドウを書き込んでいます。純正パスであれば2重描画を加味してもある程度効果的な結果を得られるのですが、独自パスの場合においてはかえって悪化することがありました。本当にケースバイケースなので一概に悪いとは言い切れませんが、少なくともアベレージが悪化していることは事実でしょう。

一応効果的に作用するカットも存在はするはずなので機能を残しつつ、トゥーンのステンシルテストと併用して全体的に負荷を下げました。最終的には純正のステンシルテストな仕組みはオミットするかもしれませんが、一旦はこれで様子を見るとします。ちなみに純正の最適化効果が薄い理由としては、キャラに当てているライトが多すぎて基本的にシャドウのフラスタム内に収まってしまうので2重描画としての負荷が勝ってしまっている感じです。こういう場合は視錐台とカプセルでCPU内外した方が軽かったりします。無論カプセル数によって結果は変動しますが。

尚最終的にCoffeeLiveでは当てるライトが多すぎてほぼ常駐で影が落ちることが分かったので、純正のステンシルテストはオミットされました。

被写界深度の対応

被写界深度を設定すると映像作品感が増しますね。

ぱっと見はいい感じですが、半透明な衣装の後景がボケていなかったり、キャラクターにも被写界深度が適用される都合、輪郭線が薄くなったりボケたりして、セルルック感の損失に繋がっている箇所が見られます。キャラクターの品質は最優先なのでコンポジットパスを調整して解消していきます。

被写界深度の後にコンポジットすることで、キャラクターがボケることなく且つ半透明な衣装の後景が正しくボケるようになりました。改善後の見た目が少し白っぽいのはライトシャフトが乗っていることが原因です。コンポジットパスを変えたことでライトシャフト計算時にトゥーン深度が存在せずに位置関係が若干不正を起こしているんですよね。この部分はそもそもキャラにシャフトを乗せるべきかを比較するところからなので今は見逃します。

陰影の改修

当然ですがスポットライトは照射範囲内しか照らさないため、範囲外に出る際にスフィアマスクのような見た目になります。

これ自体は計算仕様で正しいのですが、陰影を2値化しているセルルックではライトの移り変わりが明らかに露出し過ぎており、雰囲気が台無しです。少なくとも筆者はこういう親和性の欠片もないブツ切りな見た目が嫌いです。

このタイミングでライトの基盤部分を改修するのは心が穏やかではないのですが、この見た目で動画を作ったら未来の私がブチギレる気がするので、正直乗り気じゃないですが、過去のうちに直しておきます。

スポットライトの改修

円錐と点の距離計算を自前の関数に置き換えます。純正の計算を流用してもいいのですが、目標とする絵が特殊な場合は、物理挙動な計算を無理に取り込んだところで破綻するのがオチです。自作しか勝たん。

先の距離計算の引数として突っ込んでいる点座標を任意のアクター座標に変更します。これでキャラクター全体が明るくなったり、暗くなったりします。物理挙動からは逸脱していますが、これにより入退出時に露出するスフィアマスク感を抑制しつつ、ライトが離れると徐々に暗くなるという最低限の要件は満たせます。

キャラクター全体で明暗を遷移することにより、局所的な挙動を抑制できました。これでライトが移り変わる際に雰囲気が損なわれることがなくなりましたね。ふふん。想定通りの動作で大変気分良きです。

陰影の変更後の見た目です。変更の副作用としてライトカラーが若干白飛びしていますが、後ほど改修を加えるのでスルーしてください。開発途中の絵ですが、我ながら良い出来です。スカートが揺ら揺らしているのがマジで刺さります。やっぱり揺れモノっていいですね。

ライトカラーの改修

スカートに注目すると分かりやすいですが、先の陰影と同様の問題がライトカラーでも発生します。

厄介なことにライトカラーは逆光を考慮する必要があります。左が先の計算を単純適用して逆光を無視、右がシャドウを適用して逆光を考慮した絵です。後ろから当てている橙色の加算度合いで逆光抑制の有無が分かると思います。

逆光を抑制すればライトの当て方がとても自然に見えます。問題なのはそれを抑制するのにシャドウを使用していることです。当然ながらシャドウは2値ではありません。結果として陰影で2値化した見た目を破壊してしまうのです。

逆光抑制の改修

可能な限り逆行を抑制しつつ現状の階調を壊さないようにシンプルなアクターのベクトルとライトベクトルによる内積で抑制しました。バックライトのカラーである橙色が乗っていないのが分かります。

エンジンシェーダーのホットリロードが便利

CoffeeLiveから導入したシェーダーのホットリロードがマジで便利です。イテレーションが爆速なのです。

内部実装を隠蔽しながらプラグインとして公開する方法を心得たので今後はもう少し色々と出せるかもです。あとはシェーダーファイルを隠せたら完璧なのですが、シェーダーってプロファイリングツールでキャプチャすると余裕で覗けちゃうんですよね。実装部分も解析すれば似たようなものですが、シェーダーは特に覗きやすいから困ります。使われる分には構わないんだけど、中身は見てほしくないという難しいお年頃なのです。

ライトファンクションの改修

DMXの各成分ごとに出力してライトシェーダーでより細かな操作が出来るように改修しました。

髪陰を途中まで頑張った

顔陰ツールの派生型として髪陰ツールがあります。

こんな感じで曲線な陰を作れるのですが、操作が空間座標過ぎて途中で力尽きました。

あまりにも面倒なのです。

面倒過ぎたので頂点インデックスからいい感じに引ける新しいフローを作りました。

それはまた今度です。

顔陰の調整

ライトを当て過ぎてそもそも陰になることが極端に少なかったので形状を大幅に削減しました。最終的な成分はオフセットシャドウとシャドウと口元の常駐陰のみになりました。ゲームでは目元や鼻の周囲に三角形の陰を出すことがよくあるのですが、畑の違いなのか、いまいちな見た目だったので採用を見送りました。

リムライトの改修

単純なNoVの絶対値だと不必要なところにまで伸びてしまいます。かといってリムマスクを設定するほどの労力は掛けられないので、アウトラインパスで外周を検出、その外周と逆光という条件が揃ったらリムを書き込むように変更しました。

平面反射の対応

被写界深度対応時にトゥーンパスのコンポジットを被写界深度の後に変更しました。この変更はシーンキャプチャやリフレクションとの相性が悪いです。というのも、各種キャプチャ処理は処理負荷対策としてポストパス群をデフォルトで実行しない設定になっています。そして被写界深度はポストパス群に含まれます。

そのことから察せると思いますが、標準設定ではトゥーンパスの結果が反映されないのです。ポストパス群まで描画すれば解消できますが、これ以上の負荷上昇は受け入れがたいので、各種キャプチャ処理で描画されている場合は、従来の位置でコンポジットするように改修しました。これで処理負荷を極端に上げずにリフレクションの対応が完了です。

鏡面反射とライティングの親和性っていいよね。本来であればこの反射を活かせるカメラワークに変更するべきなのですが、流石に今更手を加えるのは嫌なので、現状のカメラワークで強行突破します。

心臓に悪い

パッケージ化した時にしか顕現しない不具合って心臓に悪いよね。陰影がぶっ壊れてる。

インゲームは知らないけど、レンダリングはプロファイラのアタッチとか、デバッグバリエーションとかで奇跡的に動作しちゃうことが稀にあるんですよね。修正完了っと。最初の1コマだけ胸が貫通しているのは、再現性のために再生位置を変えていることが原因なので気にしないで下さい。

ライトシャフト最適化

なんすか、この負荷は。ふざけてるんすか。いやまじで。

流石に頭にきたので最適化します。命令の見直しや冗長な計算を排除して約10ms削減です。

多少のトレードオフと引き換えに50%ほど削減。これだけやってもギリギリのラインである33.3msには届かないですね。面倒ですがライトシャフト専用パスを作ってハーフ解像度と専用の最低限なシェーダーをアタッチを試しますか。ライトシャフトは多光源の要ではあるので、削り過ぎるのもそれはそれで嫌なんですよね。我儘ですが。

専用パスを作ろうと思いましたが、半透明の描画物がほぼライトシャフトだけなので、手を抜いて純正機能のスクリーンパーセンテージに頼ることにしました。これで一安心です。UEは動的解像度部分の仕組み結構いいですよね。汎用性と安定性と品質、全体的にバランスが取れていて割と好きです。LumenやTSRなどの独自機能は信頼していませんが、基盤部分や機能は流石に商業エンジン、安定していますよね。普通に勉強にもなるから良きです。行列はZUpな所為で互換性がなくて腹立たしいけど。

大量のライトは諦めた

見てください。

もう十分に頑張りました。僕はエンジニアなのです。これ以上領域外の作業をするとマジで発狂してしまいます。大量のライトを当てても破綻しない設計であることは明白。シリーズ目標の根幹部分は達成できたので強制終了です。

撮影

RTX 3090Tiと5090の性能差ってこんなにあったんですね。2倍ぐらいFPSが違います。

ハイスペの弊害

クロスの計算結果に差異が生まれました。左が3090Tiで右が5090の見た目です。変わることは当然把握していましたが、ここまでとは思いませんでした。

想定外ではありましたが、今後の課題が見えたので良かったです。今回はパラメータ微調整で終わりにしておきます。物理挙動の対応は簡単なのですが、問題はコリジョンなんですよね。スカートの揺れ具合はめり込みと押し出しを込みであの見た目になっているので、フレームが細分化過ぎるとそもそも貫通することがなくてベロシティが穏やかになり過ぎて反発によるフリフリ感が上手いこと生まれないのです。質量で頑張るしかないのかね。あとは意図的に埋め込んで反発させるとかなのかな。計算が安定しないと暴れる挙動を意図的に利用していたのが仇となりましたわ。

完成!!!

DMXやカメラワーク、リターゲットの微調整をしたり、最適化をしたり、リファクタリングをしたり、色々と書き留める気が起きないような細かくて気分が削がれる作業を経て完成です。

vp9の仕様、変わってないんですね。懐かしいです。

おわり!!!

ルックデヴしたい欲求が解消されました。

すっきりです。

熱々な珈琲も冷めちゃいましたね。

また今度、気分が湧いたら淹れましょうか。

おしまい。

営利目的でCoffeeLiveのルックや技術に興味がありましたら、お問い合わせからよろしくどうぞです。

セルルック関連

20周年らしい

たのしかった(こなみかん)

うどん Pro 3

とりあえず買ったけど、相変わらずブランド価格で草なのですわ。

柑橘ジャム

3LJという呼称があんまり好きじゃないので日本語化パッチを当てて、柑橘ジャムと呼んでいます。

続々と出荷されています。

むふふ。

お届け物

えへへ。

ゆずさんは安定の複数購入です。店舗特典があるのが悪いのです。

記録しようとしたけど品数多くて途中で飽きちゃった。

セレオブの時に残りの収納スペースがゼロになったんですよね。

さて、どうしようか。

いや、どうしようもないか。

好きなものに散財して眺める時間は有意義なものです。

シンプルに仕舞う場所がないから野ざらしになっているだけですが。

お仕事頑張った甲斐がありました。

えへへ。