オクルージョンカリング
カメラに写っていないオブジェクトは表示しないようにする処理
公式リファレンス
細かい設定はこの記事が詳しかったです
設定する
Static設定
オブジェクトをOcculuder Static
シーン内でオクルージョンを適用する全てのオブジェクトには Inspector 内で タグをつける必要があります。これを行う最速の方法は,オクルージョンの計算に含めたいオブジェクトを複数選択し, および のチェックマークをつけることです。
他のオブジェクトを遮ることがない透明なオブジェクトや小さなオブジェクトには, ではなく のチェックマークをつけるべきです。このチェックが付けられたオブジェクトは,他のオブジェクトによる遮蔽判定の時には考慮され,遮蔽する側として判定時には無視されます。これにより計算コストが下がります。
Bake
その後Window>Occulusion Culling
Bakeする。
SmallestOcculuderは手前のオブジェクトサイズの大きさ。単位はm
小さすぎるとストレージを圧迫するって。
オクルージョンカリングを行う際に、他のオブジェクトを非表示にするために使用されるオブジェクトの最小サイズです。このサイズよりも小さなオブジェクトは、それらによってオクルージョンされたオブジェクトをカリングすることはありません。たとえば、値が5の場合では、5メートルより高いまたは広いすべてのオブジェクトは、その背後に隠れたオブジェクトがカリングされることになります(レンダリングされず、レンダリング時間を節約します)。このプロパティーのよい値を選ぶことによって、オクルージョンデータのためにオクルージョンの精度とストレージのサイズのバランスをとることができます。
完成
できた!
おもしろい!!
SmallestOcculuderを5mでキューブを5m以上に設定したけど、後ろのオブジェクト描画されてるなー
まあいいか
OcculusionArea
よくわかっていないが空のオブジェクトにOcculusionAreaをつけたら、そのエリア内でオクルージョンカリングされる??
付けてないときはシーン全体に適用される
メモ: オクルージョンエリアを一つも作成していない場合は、デフォルトではシーン全体にオクルージョンカリングが適用されます。
注意: カメラがオクルージョンエリア外にある場合、オクルージョンカリングは適用されません。したがって、カメラが移動する可能性のある場所をオクルージョンエリアに設定しておくことがいいです。しかし、オクルージョンエリアをあまりに大きしすぎると、今度はベイク処理に時間がかかってしまいます。
距離
遠くまで適用されるわけではない!
なお、カメラのClipping Planeの1/3の距離(上の設定の場合66.7m)以上離れるとOccluderがほぼ機能しなくなるため、それ以上遠いオブジェクトの描画を省略する場合はLODでCullingするか、LocalトリガーでオブジェクトのMesh RendererをDisableにする等の対処が必要です。
オクルージョンカリングは近距離~中距離くらいの描画を省略するために使うことを覚えておく必要があります。遠距離ではLODのCulling、さらに遠くではカメラのClipping Planeの調整が重要になります。
LODも今度やってみよ!
処理負荷
無駄な描画を減らしてパフォーマンス向上させるためのオクルージョンカリングだけど、いっぱい設定するとオクルージョンカリング自体の処理が負荷になるらしい。
いつだってなにかとトレードオフ
読み込み
アセバンなどで外部から読み込んだオブジェクトに適用するにはどうしたらいいのか。
アセバンのオブジェクトにオクルージョンカリング設定してても意味ないのかな。
無理?
回答がついてない;;
BakeするとOcculusionCullingDataができる
動的オクルージョンカリングアセット
事前にベイくしなくてもカリングしてくれるアセット
上の記事の時はまだVRをサポートしてなかったみたいだけど、今見たらサポートしてた!
— Supports LWRP
— Supports VR multi pass & single pass (non-instanced)
Supported platforms: DX11 on Windows x64
Not supported yet: HDRP, Linux/Mac, consoles, mobile, DX12/Vulkan/Metal/OpenGL
これを使えばアセバンから読み込んだものもできるのかな~