Ertelenmiş gölgeleme sadece daha sonraki aşamalar için gerçek gölgeleme işlemini "ertelemek" için bir tekniktir, bu 10 geçiş gerektiren 10 ışık oluşturmak için gerekli geçiş sayısını (örneğin) azaltmak için harika olabilir. Demek istediğim, kullandığınız oluşturma tekniğinden bağımsız olarak, oluşturma hattınızın işlemesi gereken nesne sayısını (köşeler, normaller vb.) Azaltan olası olası oluşturma optimizasyonları vardır.
Render optimizasyonları için fiili bir standart yoktur, aksine belirli performans özelliklerini elde etmek için birbirinin yerine veya birlikte kullanılabilen bir takım teknikler vardır. Her tekniğin kullanılması büyük oranda oluşturulan sahnenin doğasına bağlıdır.
Ertelenmiş oluşturma, ışık sayısı arttığında sorunu çözmeye çalışır, bu da ileri oluşturmada geçişlerin sayısını patlatabilir.
Bu teknikler ertelenmiş gölgeleme parçasını doğrudan optimize etmez, ancak açıklamanıza göre ertelenmiş gölgeleme kısmı sizin probleminiz DEĞİLDİR. Senin problemin tüm sahneyi boru hattı oluşturmaya göndermen. Sonuç olarak, g-tamponuna sonucu gönderebilmek için motorunuzun sahnenizdeki (örneğin tüm 100 milyon köşeyi) işlemesi gerekirken, 100 milyon tepe noktasının çoğu önemsiz bir şekilde kaldırılabilir ve işlem öncesi tepe noktası ve fragmanlar geçer.
İleriye dönük bir oluşturucu olması durumunda, N tepe noktası, köşe aşaması tarafından toplam olarak vertex count*lights count
ve parça aşaması tarafından toplam olarak işlenecektir fragments count*number Lights
, ertelenmiş gölgeleme, bu vertex count
sorunu fragments count
çözmeden önce etkili bir şekilde yalnızca köşe aşaması ve parça sayısı için azaltır . gerçek gölgeleme. Ama yine de N işlenemeyecek kadar çok olabilir, özellikle de çoğu önemsiz bir şekilde kaldırılabilirse.
Bu, ileri işleme / birden çok geçiş durumunda ayıklamayı daha etkili hale getirir. Tek başına gölgeleme ertelenen çünkü Ama en motorları bir çift oluşturma yaklaşımını kullanır unutmayın değil şeffaf nesneler çözmek, bu optimizasyonlar mutlaka kullanarak bu markaları, ben hepsini yapmayın herhangi bir ticari motor bilmiyorum.
Frustum Toplama
Yalnızca görünüm frustumuna tamamen veya kısmen dahil edilen nesnelerin, oluşturma hattına gönderilmesi gerekir. Bu, frustum culling'in temel kavramıdır, maalesef bir örgünün görünümün içinde / dışında olup olmadığını kontrol etmek frustum pahalı bir işlem olabilir, bu nedenle motor tasarımcıları (AABB) Eksen Hizalanmış bir sınırlama kutusu veya sınırlama küresi gibi yaklaşık bir sınırlama hacmi kullanırlar. , bu gerçek ağın kullanımı kadar doğru olmasa da, doğruluk farkı gerçek ağ ile kontrol etme zahmetine değmez.
Sınırlayıcı hacimlerde bile, her birini kontrol etmeniz gerekmez, alternatif olarak daha önceki bir ayıklama yapmak için sınırlayıcı bir hacim hiyerarşisi oluşturabilirsiniz , bunu kullanmak sahnenin karmaşıklığına bağlıdır.
Bu, daha küçük bir motor için iyi ve basit bir tekniktir ve şimdiye kadar kullandığım her motorda neredeyse kullanılmaktadır. Motorunuz çok karmaşık sahnelerin oluşturulmasını gerektirmiyorsa, hiyerarşisiz "normal" Sınırlayıcı Hacim / Frustum kontrolü kullanmanızı öneririm.
Arka yüz kaldırma
Bu bir zorunluluktur, neden zaten görünmeyecek yüzler çizin? oluşturma API'leri, arka yüz kaldırma işlemini açmak / kapatmak için bir arayüz sağlar. Neden açmamanız gerektiğine dair güçlü bir nedeniniz olmadıkça, belirli durumlarda arka yüzleri çizmesi gereken bazı CAD uygulamaları gibi, bu bir zorunluluktur.
Oklüzyon Önleme
Z tamponunu kullanarak görünürlük belirlemesini çözebilirsiniz. Ancak sorun Z-tamponunun performans açısından her zaman harika olmamasıdır, çünkü Z-tampon sadece boru hattının sonraki aşamalarında çözülebilir, tıkanmış nesneler rasterleştirilmeli ve Z-tamponuna ve Z testi başarısız olmadan önce renk tamponu.
Oklüzyon ayıklama bunu, oluşturma frustumunda tıkalı nesneleri itmek için bazı erken testler yaparak çözer. Oklüzyon ayıklamanın pratik bir uygulaması nokta tabanlı sorgular kullanmak ve belirli nesnelerin belirli bir nokta görünümünden görünür olup olmadığını kontrol etmektir. Bu, son görüntüye katkıda bulunmayan ışıkları çıkarmak için de kullanılabilir, bu özellikle ertelenmiş bir motor oluşturucusunda yararlıdır.
Bu tekniğin harika bir gerçek dünya örneği, gökdelenlerin stratigically şehrin merkezine yerleştirildiği GTA5'te, sadece süslemeler değil, aynı zamanda şehrin geri kalan kısmını etkili bir şekilde tıkayan ve olmasını önleyen tıkayıcı olarak da çalışıyor. rasterleştirilebilir.
Ayrıntı Düzeyi
Ayrıntı seviyesi yaygın olarak kullanılan tekniktir, fikir, örgü sahneye daha az katkıda bulunduğu zaman ağın daha basit bir versiyonunu kullanmaktır. iki yaygın uygulama vardır; biri, büyük ölçüde katkıda bulunmadığında ağı daha basit bir anahtarla değiştirir, ağ, ağın kapladığı mesafe ve piksel sayısı (dağ eteğindeki alan) gibi bazı faktörlere göre seçilir. Diğer versiyon, ağı dinamik olarak mozaikler, bu arazi oluşturmada yaygın olarak kullanılır.
Ya tüm bunlar işe yaramazsa?
Bu iyi bir soru.
Yapmanız gereken ilk şey, uygulamanızı bir grafik profili kullanarak Profillendirmek ve darboğazın nerede olduğunu belirlemektir. Oluşturulan içerik değiştikçe darboğazın değişebileceğini unutmayın. Darboğazlar ayrıca CPU üzerinde çalışan kodun bir parçası olabilir, bu yüzden bunu da ölçmeniz gerekir.
Bundan sonra, darboğazda bazı optimizasyonlar yapmanız gerekir, bunun için doğru bir cevap olmadığını ve donanımdan diğerine farklı olacağını unutmayın.
Bazı yaygın GPU optimizasyon hileleri:
- Gölgelendiricilerde dallanmayı önleyin.
{VNT}
Aynı dizide veya {V},{N},{T}
farklı dizilerde araya eklenmiş farklı köşe yapılarını deneyin .
- Sahneyi önden arkaya çizin.
- Örneğin bir görüntünün Z testine ihtiyacı yoksa bazı noktalarda Z arabelleğini kapatın.
- Sıkıştırılmış dokular kullanın.
Bazı yaygın CPU optimizasyonu hileleri:
- Küçük işlevler için satır içi işlevleri kullanın.
- Mümkünse SIMD (Tek komutlu çoklu veri) kullanın.
- Düşmanca önbellek atlamalarını önleyin.
- VBO'ları "doğru" miktarda veriyle kullanın. (donanımınıza bağlı olarak), ancak genellikle daha az çekiliş daha iyidir.
Ama darboğazım ertelenmiş gölgede olsaydı ne olurdu?
Bu durumda, ertelenmiş gölgelendirme ışıklar hakkında daha fazla endişe duyduğundan, en belirgin kısım gerçek gölgeleme hesaplamalarını optimize etmektir. dikkat etmeniz gereken bazı noktalar:
- Son görüntüyü gerçekten etkileyen ışıkları işle. Başka bir deyişle, katkıda bulunmayan ışıkları çıkarın. Bu, daha önce bahsettiğim oklüzyon ayıklama kullanılarak etkili bir şekilde uygulanabilir.
- Bu ışığın spekülatif veya başka bileşenlere ihtiyacı var mı? Belki de değil.
- Bu ışık gölgeli mi? Bazı ışıkların gölge atmasına gerek yoktur.
- Bu hafif katkı önceden hesaplanabilir mi? Hareket etmiyorsa, muhtemelen bazı yönler önceden hesaplanabilir.