らぷとのメモ帳

VRChatとその周りに関することをメインに記事を書いています

3DCG:視錘台カリングってなんだ?!

カリングとは見えないものを描画しない工夫であり,そのなかで視錘台カリングは原始的かつ効果的な手法です.

カリングとは

ゲームというのは常に時代の最先端の性能を求めます. 特に3Dゲームはその傾向が強いです. しかし開発者たちは決してその最新性能を怠惰に消費しません. 持ち合わせの性能を最大限に生かすために様々な工夫をしています.

さて3Dゲームの無駄,それは見えもしないものを描画することです. 3Dではいろんな形で見えないものが登場します,そっぽを向いているとか,何かに遮られてるとかが多いでしょう. これら見えないものを描画しないための工夫をカリング(Culling)と呼びます. 今回説明するのは,そっぽを向いたときに見えなくなったものを描画しない工夫,視錘台カリングです.

視錘台カリング

視錘台カリングは前述のとおり,そっぽを向いたせいで見えなくなったものを描画しない工夫です.

まず,視錘台というのは以下の画像のようなカメラの画角の延長で作られた錘台(立体的な台形)です.

f:id:rapt_vrc:20210807141855p:plain

プレイヤーの画面に映るものはこの視錘台に必ず収まります. f:id:rapt_vrc:20210807141859p:plain

反対に,視錘台に収まっていない物体は必ず表示されません. そこで,視錘台に収まっていない物体を描画しない工夫をすれば,描画資源をとてつもなく節約できますね.

f:id:rapt_vrc:20210807141903p:plain

これが視錘台カリングです.物の数が多くなるとそのパワーを実感できます. f:id:rapt_vrc:20210807141844p:plain

注意点は,視錘台カリングでは遮蔽で見えないものについても描画するということです. そのため壁の向こう側にたくさんの物体があるような場面では視錘台カリングは上手くいきません.

f:id:rapt_vrc:20210807141908p:plain

あくまで視錘台に収まっていない物を描画しない工夫です.

こういう時は遮蔽カリングなどの別の手法を合わせて使います(それについてはまた別の機会に).

Unityでは?

視錘台カリングはUnityで最初から有効です. 特に設定する必要はありません.

VRChatではワールド,アバターともに有効です.つまり視点から外れたアバターやワールドは描画されません.

VRChatのワールドなどでは見る向きによってFPSが違うことがありますが,それは視錘台カリングが効いている証拠です.

Unityでの注意点として,ワールドなんかでメッシュを一つにまとめると,それが描画単位になりますので,視錘台カリングが効きません.

程よくオブジェクトを分割してあげるといいかもしれないです.

今回はカリングと,その代表的な手法である視錘台カリングの基礎を解説しました. ここらの話を踏まえればワールド周りの最適化への理解につながるかもしれません.

個々の具体的なテクニックはもうネット上にたくさんあるので探してみてください. (たとえばVket等のイベント関連の技術ブログは役に立ちます.視線誘導によりカリングがよく効くように調整されています)

関連するキーワードだけ最後に置いておきますね. 読了ありがとうございました.お疲れ様です.

関連リンク

動く城のフィオ氏によるVketの解説

キーワード

  • 裏面カリング(バックフェースカリング,Backface Cullilng)
  • 遮蔽カリング(オクルージョンカリング,Occlusion Culling)
  • ゲームオブジェクト (Game Object)
  • MeshBaker(メッシュを一つのゲームオブジェクトにまとめる)
  • ドローコール (Draw Call/Batch Draw Call/Batch Pass Call)