RecentlyRendered を使って可視判定を行う際の注意点について
Was Actor Recently Rendered
ノードは、指定した時間内に描画されたかどうかを調べるノードです
なのでこれを使えば「画面内にいるか」「プレイヤーの視界内にいるか」を簡易的に判断できます
…というのがよくある 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 します
その Sphere(StaticMeshComponent)の詳細パネルで、下記のように設定をします
- Lighting
- CastShadow -> OFF
- Rendering
- Render in Main Pass -> OFF
- Render in Depth Pass -> OFF
あとは Sphere の Was Component Recently Rendered
を使って判定を行いましょう
結果チェック #
百聞は一見にしかずなので、ぜひ手元で試してみてください
マップは ThirdPersonTemplate のものです
Manny の方が BP_RenderCheck
で、 Was Actor Recently Rendered
で判定をしています
Quinn の方が BP_RenderCheckAlt
で、判定用の Mesh を追加し、 Was Component Recently Rendered
で判定をしています
両方映っているシーン
中央のオブジェクトを回り込んで、両方の Mesh が見えないようにした状態
Alt の方だけ Not Rendered になっています
FreezeRendering で確認すると、Mesh が映っていなくとも、Shadow が描画されていることがわかります