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

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

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

関連記事