メインコンテンツへスキップ
  1. 記事/

RecentlyRenderedを使って可視判定を行う(UE5版)

UnrealEngine UE5.5 Blueprint
目次

RecentlyRendered を使って可視判定を行う際の注意点について

この記事はUnreal Engine (UE) Advent Calendar 2024 の 7 日目の記事です

Was Actor Recently Rendered ノードは、指定した時間内に描画されたかどうかを調べるノードです
なのでこれを使えば「画面内にいるか」「プレイヤーの視界内にいるか」を簡易的に判断できます

alt text

…というのがよくある Tips なのですが、UE5 からはこの用途に使うことが難しくなっています

原因
#

UE4 では、Mesh(Primitive)が遮蔽された時点でレンダリング対象から外れていましたが
UE5 では、近距離のもの(Epic 設定でおよそ 5000 ぐらい)まではレンダリング対象から外れないようになっています

FrustumCulling 等で Mesh そのものの描画がなくなっても、Shadow の描画は切れないので
レンダリングされている判定となり、結果 RecentlyRendered が true を返す、という状態になります

おそらく、近距離の場合は視界が激しく動くので、それに合わせて Shadow の描画を切り替えていると、影がパカパカ切り替わるようになって、見た目に悪影響があるからかな?と思います
TAA や TSR は前フレームの情報を参照するので、そのへんでも良くないのかも

Engine の Scalability を Middle まで下げると、UE4 と同等の判定になりますが、さすがにそれは本末転倒なのでやりたくないところ

代替案
#

Shadow が描画されるから RecentlyRendered が true を返すのであれば、Shadow がなければ良い、とのことで
つまるところ CastShadow を OFF にすれば良い、ということになります

ただし、それを Mesh 側でやってしまうと、Mesh の Shadow がなくなってしまうので不都合です

なので、RecentlyRendered の判定専用の Primitive を Attach し、そちらを使って判定をしてみましょう


今回は簡単にするために、Sphere を Attach します

alt text

その Sphere(StaticMeshComponent)の詳細パネルで、下記のように設定をします

  • Lighting
    • CastShadow -> OFF
  • Rendering
    • Render in Main Pass -> OFF
    • Render in Depth Pass -> OFF

あとは Sphere の Was Component Recently Rendered を使って判定を行いましょう

alt text

結果チェック
#

百聞は一見にしかずなので、ぜひ手元で試してみてください

マップは ThirdPersonTemplate のものです

Manny の方が BP_RenderCheck で、 Was Actor Recently Rendered で判定をしています
Quinn の方が BP_RenderCheckAlt で、判定用の Mesh を追加し、 Was Component Recently Rendered で判定をしています

両方映っているシーン

alt text

中央のオブジェクトを回り込んで、両方の Mesh が見えないようにした状態
Alt の方だけ Not Rendered になっています

alt text

FreezeRendering で確認すると、Mesh が映っていなくとも、Shadow が描画されていることがわかります

alt text

関連記事

CheatManagerを使って開発専用のショートカットキーを管理する
UnrealEngine UE5.4 Blueprint
TypePromotionについての考察
UnrealEngine UE5.1 TypePromotion C++ Blueprint
BPでn次元配列を扱う
UnrealEngine Blueprint UE5.2