トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

オクルージョンカリングする【Unity】

オクルージョンカリング

カメラに写っていないオブジェクトは表示しないようにする処理

公式リファレンス

docs.unity3d.com

細かい設定はこの記事が詳しかったです

note.com

設定する

Static設定

オブジェクトをOcculuder Static

f:id:bibinbaleo:20200914132250p:plain

シーン内でオクルージョンを適用する全てのオブジェクトには Inspector 内で Occluder Static タグをつける必要があります。これを行う最速の方法は,オクルージョンの計算に含めたいオブジェクトを複数選択し, Occluder Static および Occludee Static のチェックマークをつけることです。

他のオブジェクトを遮ることがない透明なオブジェクトや小さなオブジェクトには, Occluders ではなく Occludees のチェックマークをつけるべきです。このチェックが付けられたオブジェクトは,他のオブジェクトによる遮蔽判定の時には考慮され,遮蔽する側として判定時には無視されます。これにより計算コストが下がります。

オクルージョンカリング - Unity マニュアル

 

Bake

その後Window>Occulusion Culling

f:id:bibinbaleo:20200914132451p:plain

Bakeする。

f:id:bibinbaleo:20200914133827p:plain

SmallestOcculuderは手前のオブジェクトサイズの大きさ。単位はm

小さすぎるとストレージを圧迫するって。

オクルージョンカリングを行う際に、他のオブジェクトを非表示にするために使用されるオブジェクトの最小サイズです。このサイズよりも小さなオブジェクトは、それらによってオクルージョンされたオブジェクトをカリングすることはありません。たとえば、値が5の場合では、5メートルより高いまたは広いすべてのオブジェクトは、その背後に隠れたオブジェクトがカリングされることになります(レンダリングされず、レンダリング時間を節約します)。このプロパティーのよい値を選ぶことによって、オクルージョンデータのためにオクルージョンの精度とストレージのサイズのバランスをとることができます。

オクルージョンカリング - Unity マニュアル

完成 

できた!

f:id:bibinbaleo:20200914133417g:plain

おもしろい!!

 

SmallestOcculuderを5mでキューブを5m以上に設定したけど、後ろのオブジェクト描画されてるなー

f:id:bibinbaleo:20200914134343p:plain

まあいいか

 OcculusionArea

よくわかっていないが空のオブジェクトにOcculusionAreaをつけたら、そのエリア内でオクルージョンカリングされる??

f:id:bibinbaleo:20200914143033p:plain

f:id:bibinbaleo:20200914143038p:plain

付けてないときはシーン全体に適用される

メモ: オクルージョンエリアを一つも作成していない場合は、デフォルトではシーン全体にオクルージョンカリングが適用されます。

注意: カメラがオクルージョンエリア外にある場合、オクルージョンカリングは適用されません。したがって、カメラが移動する可能性のある場所をオクルージョンエリアに設定しておくことがいいです。しかし、オクルージョンエリアをあまりに大きしすぎると、今度はベイク処理に時間がかかってしまいます。

オクルージョンカリング - Unity マニュアル

 

距離

遠くまで適用されるわけではない!

なお、カメラのClipping Planeの1/3の距離(上の設定の場合66.7m)以上離れるとOccluderがほぼ機能しなくなるため、それ以上遠いオブジェクトの描画を省略する場合はLODでCullingするか、LocalトリガーでオブジェクトのMesh RendererをDisableにする等の対処が必要です。

オクルージョンカリングは近距離~中距離くらいの描画を省略するために使うことを覚えておく必要があります。遠距離ではLODのCulling、さらに遠くではカメラのClipping Planeの調整が重要になります。

VRChat ワールド軽量化のための設定+オクルージョンカリングについて|Kluele_VRC|note

LODも今度やってみよ! 

処理負荷

無駄な描画を減らしてパフォーマンス向上させるためのオクルージョンカリングだけど、いっぱい設定するとオクルージョンカリング自体の処理が負荷になるらしい。

いつだってなにかとトレードオフ

読み込み

アセバンなどで外部から読み込んだオブジェクトに適用するにはどうしたらいいのか。

アセバンのオブジェクトにオクルージョンカリング設定してても意味ないのかな。

 

無理?

forum.unity.com

回答がついてない;;

answers.unity.com

BakeするとOcculusionCullingDataができる

f:id:bibinbaleo:20200914143041p:plain

動的オクルージョンカリングアセット

事前にベイくしなくてもカリングしてくれるアセット

www.asset-sale.net

上の記事の時はまだVRをサポートしてなかったみたいだけど、今見たらサポートしてた!

assetstore.unity.com

— 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

 

これを使えばアセバンから読み込んだものもできるのかな~

参考

atelier-hinata.hatenablog.com