【Unity】視錐台(カメラ)カリングについて

2019/07/09DEVELOP, Unity

Unityでも自前でカリングすると効果あります。

前置き

通常、ゲーム画面にはありとあらゆるオブジェクトが配置されています。それがキャラクターだったり、アイテムだったり、マップだったり。

こうした無数に置かれているオブジェクトを描画する場合、画面から見えないと分かっているオブジェクトに関しては、事前段階で極力描画しない様にする必要があります。

なぜそんなことをする必要があるのか?それは単純な話で、無駄を省くためです。
無駄を省くといえばカリング、なので今回はカリングについての投稿です。

視錐台(カメラ)カリング

カリングといってもいくつか種類がありますが、今回は視錐台(カメラ)カリングについてです。また、Unityを使って動作確認していますが考え方の話なので、他の言語に置き換えれば同様に使えます。

視錐台(しすいだい)については、公式にも説明が載っています。
Unity – マニュアル: 視錐台を理解する

公式ドキュメントにいろいろと書かれてはいますが、一言でいえば「空間上における表示領域を定義したもの」になります。図で表すなら、


Near/Far間を結ぶ台形がそれです。

理解できたら、以下のコードが有効に働くはずです。

/// <summary>
///  バウンディングボックスによる、視錐台カリング。
/// </summary>
public void FrustumCulling(Bounds[] _boundsList)
{
    Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera.main);
    System.Array.Resize(ref planes, 4);     // near,far面は要らないので排除。
    foreach (Bounds bounds in _boundsList)
    {
        if (GeometryUtility.TestPlanesAABB(planes, bounds))
        {
            // 内側。
                    // Renderer true などとする
        }
        else
        {
            // 外側。
                    // Renderer false などとする
        }
    }
}

やっていること

1. GeometryUtility.CalculateFrustumPlanes カメラの視錐台(表示領域)を取得。
2. 内外判定用のバウンディングボックスをチェック。
3. 内側と判定されたものに対して、表示をON、外側と判定されたものに対しては表示をOFFにする。

結果

奥のオブジェクトがカメラの表示範囲外になると消えているのが確認できます。UnityだとSceneビューでカリングされる様子が簡単に目視でき実装確認がとりやすく大変便利です。

Posted by kazupon