【UE5】SceneTextureノードからアウトラインカラーとマスクを取得できるようにしてみた – Unreal Engine 5.4

Unreal Engine

水ノ茉の宣伝

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

始まり

アウトラインカラーとマスクをSceneTextureノードから取得できるようにします。

SceneTextureノードとは?

シーンカラーや深度、GBufferなどを取得するノードです。

Scene Texture Id見た目

エンジン改造とは?

ゲームエンジンのコードを書き換える行為をエンジン改造と呼びます。

尚エンジン改造という呼称が正式かは知らんです。

これ以上の真面目な説明はググればヒットするので割愛します。

以下、実際の描画まわりの改造事例です。

前髪を透かしたり

毛先まで綺麗に表現できるポストプロセスなアウトラインを描いたり

キャラと背景を別々のシャドウマップに書き込んでセルフシャドウを抑制したり

髪影を落としたり

頂点IDノードを追加して、それを元に鼻に線を引いたり

独自のトゥーンパス群ですべて描いたり

リポジトリ

最新バージョンのみ保守しています。
過去バージョンが動かないと言われても基本的には知らんがなスタイルです。

実装

めっちゃ簡単。

Engine/Source/Runtime/Engine/Public/MaterialSceneTextureId.h

ESceneTextureId列挙体にPPI_OutlineColorを追加します。

RGBでアウトラインカラー、Alphaにアウトラインマスクを格納するレイアウトです。

githubで実装を見る(L81-L82)

Engine/Source/Runtime/Engine/Public/MaterialShared.h

SceneTextureノードでPPI_OutlineColorが選択された際にGバッファが使用されることをマークしています。

Gバッファにアクセスすることが許容されていないマテリアル(不透明など)で使えないようにするための対応ですね。

githubで実装を見る(L760)

Engine/Shaders/Private/MaterialTemplate.ush

PPI_OutlineColorのシェーダー側の定義です。

IDはMaterialSceneTextureId.h側で定義しているものと一致させておきましょう。

githubで実装を見る(L86)

SceneTextureノードでPPI_OutlineColorを選択された際にアウトラインカラーとマスクを返している箇所です。

githubで実装を見る(L3094)

ポストプロセスマテリアルで使ってみる

以前作成したポストプロセスアウトラインを元に動作確認をしていきます。

アウトラインカラーの反映

髪の毛と肌と衣類で色を別けてみました。

アウトラインマスクの反映

目元のアウトラインをマスクしてみました。

アウトラインマスクが真っ黒になっている箇所は線が引かれていないですね。

おわり!!!

簡単でしょ。

次回はアウトラインカラーとマスクを可視化するビジュアライザを整備していきます。

関連するエンジン改造

雑談

ゲームというか物語を創りたいというか好きなことしたいというか、まぁ適当な理由付けから始めたゲーム制作ですが、えぇ、飽きましたの。

筆者が得意とする領域は描画R&D寄りなので、ゲーム制作、その中でもインゲームに関する知識は、ほぼ皆無なのです。ということで勉強、インプットも兼ねて適当なプロジェクトをちまちま進めていたのですが、約214時間ほどの作業を経て、無事、飽き性が発症しました。

飽き性が標準搭載な人生。
早ければ数週間、長くても数か月も経てば、また元に戻ることでしょう。

我ながら火力は高いと自負しているのですが、燃料が切れると途端にダメなんですよねぇ。

短時間で新しい知識を詰め込み過ぎて脳がパンク気味な感じもするので、ここらで軽い振り返りです。

エロゲって気分でもないのよね。
鳥羽莉さん絡みでFAは遊びたいんだけど、遊びたいってだけで、遊ぶかは別問題。

最近は通知すら見てないけど、どうせFANZAのポイント失効してるわ。
500円セールで買える相当だと微妙に凹むけどそれで買っちゃうと無限ループから抜け出せないんだよね。
なんて悪質なエッチな罠なんでしょうか。

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

昔ながらの王道な手法ですが、キャラと背景のシャドウデプスを別々に書き込むことによって、キャラのセルフシャドウを完全に防ぎつつ、背景に影を投影しています。

背景のシャドウデプス
キャラのシャドウデプス

こんな感じでキャラクターの影を地面に落としつつ、キャラクターには背景の影を落として、キャラクター自身の影(セルフシャドウ)を落とすことは回避しています。厳密にはキャラクターですがね。

シャドウの設定がキャラと背景、それぞれで細かく設定できるのも利点です。
一番の恩恵はカスケード距離を別々に調整の部分ですね。

あとめっちゃ細かいことで伝わる人が限定されますが、これディファードライティングなんですが、フォワードと同じ位置でシャドウデプスパスを挿入、その後にシャドウマップを作成しているので、ベースパスで影を落とせます。ルックデヴ作業のイテレーションを改善するために、Unlitで色々と完結させたくて大改造しました。

これの欠点としては、Gバッファが未確定なのでSSSの減衰が考慮されないのですが、そもそもトゥーン表現はSSSもなにもないですからね。無問題です。

Visual Novel Dialogue

当たり前ですけどエロゲを作る訳じゃないです。

なんですが、筆者の好きなゲームジャンルってFPSとMMORPGとエロゲという、PCゲームの3種の神器なんです。社会人になってからはエロゲしかしてませんがね。それも年に数本程度。

個人的には深淵3点セット。少なくともこれらのジャンルを通ってきて居心地がいいと感じる輩にいい人はいない。筆者がそうだから。マジで偏見だけど多分自覚あるひと、それなりに居ると思う。知らんけど。

話を戻すと、好きなこととはいえ、エロゲを降臨する訳にもいかないので、会話パートで少し暴れようかなと思ったのです。

………と思ったのですが、なんなんですか、UEさん? あなたは表示速度フェード表示に該当する機能を標準で有していないのですか、そうですか、そうですか、そうなんですか。クソが。

無いなら作ればいいだけなので、RichTextを参考に作ってみました。Slateは頂点カラーを乗算する設計だったのでエンジン改造を踏まずに純正で実装が済みました。弊害として文字毎にドローコールを叩いているので、インスタンシング描画をしたいところなのですが、部分的にグループに纏めて投下するという最適化を内部で行っているようで、まぁ気にし過ぎなのかなぁと現状は様子見な感じです。

文字列の権利違反が怪しいけど私的利用だから許して。茉優先輩が好きなの。

ふと思いましたが、どうやら現実世界の筆者さんは茉優先輩より軽かったようです。

ちなみに水着シーンのコントラストが好きすぎてヤバいです。あれ、まじ、良い。

リドジョは初心者におすすめです。

茉優先輩の次に千咲ちゃんが好きかもです。
アトロポスでも胡桃ちゃんが好きだったり、サブヒロとカテゴライズされる方々が結構刺さるんですよね。

脱線しましたが、エロゲの雰囲気を感じるダイアログシステムは、汎用化が終わったらブログネタとして登場してもらうかもです。

肌色

実運用がまだ先なのでそこまで本格的に着手していませんが、PreintegratedSkinをNPRとPBRの中間ぐらいにしてみました。えっへんポイントは、肌テクスチャを一切使わずに単色だけで表現している点です。

髪陰

アニメルックな陰って非現実的が過ぎるんです。法線とライトベクトルから考えたらあり得ない形状、なんでそこで全陰にならないんや?!という摩訶不思議現象、色々と枠にはまった計算だけではどうにもならない理不尽に遭遇します。

そしてこの理不尽はアニメルックに留まらず、エロゲのCG絵でもよく見られます。

計算だけで実現するのは限界です。疲れました。

疲れたので陰を作るツールを作りました。

作ったら更に疲れました。

………なんやこの無限ループ。

現状だとエッジが目立つのでUV展開を工夫したり、サンプリングでエッジを誤魔化したり、品質向上部分は残っていますが、ツールとして利用できるところまでは爆速で準備が出来ました。

別件で作っていた顔陰ツールのお陰ですね。

髪陰とは関係ないですが、眉やまつ毛のジャギが目立つのはアルファ抜きの関係です。
2値で処理するか、透明度を設けるかは悩み中なのです。

ルックに関しても好きなことをしたいので、その一環でForward+と独自パス群を構築しています。作りたいから作っただけで、プロジェクトに適しているかはあんまり考えていないので、こんな感じで仕様が浮いている箇所が結構あるんですよね。描画はエンジンをいじれば手軽になんでも実現できる領域なので、最後の方に一気に畳みかけて終わらせれば良いのです。

さてと、ダイアログとクエストの繋ぎ込みの続きをやろっと。