View Frustum Culling

View frustum cullingbir önceki yazıda oluşturduğumuz modelleri çevreleyen küreleri kullanarak, “view frustum” adı verilen, sadece kameranın gördüğü bölgenin içinde kalan modellerin çizilmesi, bu bölgenin dışında kalan modellerin ise çizimden ayırt edilerek performans sağlanması işlemidir. 3D bir modelin çizdirilmesi sayfasında view frustum ile ilgili detayları görebilirsiniz. Bu işlem özellikle çok sayıda model içeren, kalabalık sahnelerde ciddi performans artışı sağlamaktadır. Ancak birçok küçük modelden oluşan bir sahnede her model kontrol edileceğinden verimi düşürebilir.

View frustum culling” işlemini yapabilmek için öncelikle view frustum denilen, kameranın gördüğü bölgenin hesaplanması gerekir. Kameralara özgü görünüm ve projeksiyon matrislerini bildiğimiz için, kameranın gördüğü alanı da kolaylıkla hesaplayabiliriz. Hesaplayacağımız bu değeri tutmak için kamera sınıfına (abstract Camera class) BoundingFrustum sınıfında yeni biz özellik ekleyelim. BoundingFrustum sınfı view frustum içerisinde BoundingSphere olup olmadığını kontrol eden bir methoda sahiptir.

Görünüm ve projeksiyon matrislerinin sürekli değişeceğini düşünürsek, kameranın gördüğü alanı da sürekli güncellememiz gerekir. Bunu yapmak için generateFrustum() adında bir method yazarak, View ve Projection özellikleri içerisinde çağıralım.
Kodlar eklendikten sonra kamera sınıfı şu şekildedir.
Yaptığımız değişiklikleri görmek için Game1 sınıfındaki Draw() methodunu şu şekilde değiştirmek faydalı olacaktır. Burada dikkat edilirse çizilen hiçbir model olmadığı zaman ekran kırmızı renge boyanmaktadır. Kodun nasıl çalıştığını anladığınızda bu kısımları kaldırabilirsiniz.
Sade haldeki Draw() methodu şu şekildedir.