10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

カバー株式会社Advent Calendar 2024

Day 5

UE5.5で追加された待望の機能、UserSceneTextureを使って作るポストエフェクト

Last updated at Posted at 2024-12-04

久しぶりの投稿です。

今年は転職の年でした。新しい職場ではUnrealEngineを用いてレイトレやLumenのハイエンドでフォトリアルな表現とスタイライズドな表現の共存させ、互いを引き立たせる仕事をしています。

UE5.5で入った新機能

さて、表題の件ですが、先日リリースされたUE5.5で長年のUEユーザー待望の機能が実装されました。

その名もUserSceneTextureです。
なんとポストエフェクトの結果をユーザー定義の中間テクスチャに描きこむ事が出来きます。
これまでエンジン改造をしなければ実装できなかったあんな機能やこんな機能を実装する事が出来るようになったのです。

公式が無改造エンジンを素うどんと称するくらいなので、往年のUEエンジニアは息を吸うように日々改造している思いますが、メンテコストが減るのはうれしい物です。標準で使えるものはどんどん使っていきましょう。

使い方を見てみる

UserSceneTextureの実装はとてもシンプルで、片手で足りる手順にて使用する事が出来ます。

書き込み

image.png
一番シンプルな使い方はUserSceneTextureに任意の名前を入れるだけです。
これだけで書き込み先が次のポストプロセスの入力ではなく、指定した名前の一時バッファになります。

その他のオプションとしてはUserTextureDivisorでダウンサンプリングの指定をしたり、Disable Pre Exposure ScaleでPreExporsureを掛けるかどうかの選択ができます。

フェッチ

image.png

フェッチ時は書き込み時に指定した名前を指定する事で取得できます。
フィルタリングの指定とクランプするかどうかの指定ができます。

シェーダーコード内でのフェッチ

ほぼSceneTextureと同じですね。

float2 uv = ClampSceneTextureUV(ViewportUVToSceneTextureUV(DERIV_BASE_VALUE(inUV), PPI_UserSceneTexture0), PPI_UserSceneTexture0);
float3 tex = SceneTextureLookup(uv, PPI_UserSceneTexture0, false).xyz;

機能の検証として何を実装するか

では実際にこれらの機能を使って何かサンプルを作る際に、真っ先に思いつくのはガウスブラーを縦横分離して適用する事です。
しかしながら、この実装はわざわざバッファを退避させる必要がなく、これまでの仕様でもやろうと思えばできていたので今回は見送ります。

SDF

そんな中思いついたのがSDFをリアルタイムで表示する事です。
今回はステンシルで作成したプレイヤーのマスクをもとにSDFをリアルタイムで作った紹介をします。

SDFのUE実装

今回はながさんのUE実装を参考にリアルタイム化しました。
5.3ベースで書かれており、わかりやすいコードです。
テクスチャフェッチ部分をUserSceneTextureに置き換えていくだけで動きます。
テクセルサイズや解像度なども同ノードから取得します。

大まかな処理の流れは以下です。
ステンシルに描かれたキャラクターのマスクを作業バッファへコピー
↓ 
SDFセットアップ

SDFのイテレーション

出来上がったものを作業バッファからコピー

画像の通りパス毎にマテリアルを積みます。
イテレーションの部分は2つのバッファを交互に再利用します。
image.png

実行結果

それっぽい結果が得られました。
output-palette.gif

応用してみる

せっかくSDFが生成できたので、SDFと相性のいいスタイライズドな表現を2つほど紹介します。

アウトライン

指定した距離でアウトラインカラーとブレンドするのみの簡単な実装です。

法線や深度を必要とせずに描くと以下のメリットがあります。

  • 境界の中心を通る線を引くことが出来る
  • 意図せぬ立体感を感じにくい

image.png
もちろん画角やカメラとの距離を変えても太さは変わりません
image.png

エッジのハイライト(2D的な)

マスクと比較して体の内側方向だけを見ます。
リムライトやフレネルを利用した同等の表現に比べ、意図的に立体感を消したハイライトをつける事が出来ました。
image.png
image.png

まとめ

UserSceneTextureによってこれまで実装するのに心構えが必要だったものを気軽に作れるようになりました。
動的解像度との相性の検証など、ポストエフェクトの後半で解像度が変わった際にどういう挙動をするのか詳しく追えていないので機会あればまた共有したいです。

参考

5.5リリースノート
ロードマップ
NagaSdfTextureToolForUE

10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?