Ertelenmiş bir gölgelendirme oluşturucusunda geometri geçişi için ortak oluşturma optimizasyon teknikleri nelerdir? [kapalı]


16

OpenGL 3 ve C ++ (ve pencere yönetimi için glfw) kullanarak bir oyun motoru geliştiriyorum. Şimdiye kadar ilerledim, ses varlıkları ve optimizasyonlar dışında işlerin çoğunu yaptım. Motor ertelenmiş gölgeleme kullanıyor, bu nedenle ertelenmiş gölgelendirme, ortalama bir GPU için yorucu bir süreç olduğundan, oluşturma işlemini olabildiğince optimize etmek istiyorum.

Mevcut sistem, bir Oluşturucu ve mevcut Dünyayı içeren bir Sahne'den oluşur ve Dünya, varlıkları ve aydınlatma varlıklarını ayrı tutar std::vectors.

Temel olarak Sahne her çağrıldığında ->render()ve Renderer'ı çağırdığında, dünyayı bir parametre olarak geçirir ve varlık yineleyicilerini dünyadan alır, onları FBO'ya çeker ve sonra ikinci geçiş için aydınlatma varlıklarından geçer. Ve bence bu yeterli değil.

Mevcut algoritmam, varlık ekran alanında olmasa bile her şeyi yineler. Ben sadece mevcut nesneler için API işlevlerini çağırır böylece mevcut render algoritması optimize etmek için bir yol düşünüyorum, bu yüzden bu gibi renderer optimize etmek için ortak teknikler nelerdir?

Yanıtlar:


41

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 countve parça aşaması tarafından toplam olarak işlenecektir fragments count*number Lights, ertelenmiş gölgeleme, bu vertex countsorunu 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.

resim açıklamasını buraya girin

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.

Sınırlayıcı Hacim Hiyerarşisi

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.

resim açıklamasını buraya girin

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.

LOD

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.

resim açıklamasını buraya girin

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.

Maalesef, bunların ertelenmiş gölgeleme ile ilgisi yoktur, aslında tekniğin etkili bir şekilde azaldığı kesin performans sorunlarıdır ve bu nedenle yapmak için en az kullanışlı optimizasyonlardır, odaklama aydınlatma geçiş (ler) ine odaklanmalıdır, çünkü aydınlatma maliyeti yoksa baskın zaman alan, ertelenmiş gölgeleme muhtemelen yanlış seçimdir.
MickLH

@MickLH Ne yazık ki, görünüşe göre soruyu okumadınız, sorunu esasen her sahnede her seferinde yinelemesi ve deffered gölgeleme ile ilgili herhangi bir darboğazdan bahsetmemesi idi. İlk başta, gölgeli gölgelendirmenin çok fazla ışık / malzeme olduğunda geçiş patlama problemini çözdüğünü belirtmiştim. Ancak daha sonra, gölgelendirme tekniğinden bağımsız veya ileriye dönük olursa olsun, bunların herhangi bir motor için bir zorunluluk optimizasyonu olduğunu ekledim. Bunların tekniğin kesinlikle katılmıyorum migitasyon yaptığı kesin konular olduğuna gelince, burada tüm noktaları ele alamıyorum (aşağıdaki)
concept3d

örneğin frustum ayıklaması olmadan ertelenmiş bir motor oluşturmak gerçekten aptalcadır, bu nedenle motor sadece sonucu (100 milyon tepe noktası) sadece g-buffer'a gönderebilmek için işleyecektir. Farklı gölgeleme farklı bir sorunu çözüyor, ki bu onun sorunu değildi, sorunu tüm geometriyi boru hattına göndermekti.
concept3d

ancak aydınlatma hesaplamalarında bazı optimizasyonların yapılması gerektiği konusunda hemfikirim ve eğer ışık hesaplamaları baskın değilse ertelenmek yanlış bir yoldur. ama yine de bu onun sorunu değildi.
concept3d

Bu optimizasyonların ertelenmiş bir oluşturucu için aslında en az etkili olduğunu açıkça belirtirseniz, aşağı notumu geri çekeceğim, çünkü standın ona + çalışanlarına performans sorununun ertelenmiş gölgeleme ile ilgisi olmadığını göstermediniz.
MickLH

6

Sorununuz ertelenmiş gölgeleme ile ilgili değildir , belirli bir parçayı hızlandırmaya çalışmadan önce bir oluşturucunun temel çekirdek öğelerini uygulamanız gerekir.

Concept3d'nin açıkladığı şeyi bitirdiğinizde, aslında ertelenmiş gölgelendiricinin kendisini (tüm rasterleştirme geçişinin aksine) optimize etmeniz gerektiğini fark ederseniz, Karo Bazlı Ertelenmiş Gölgeleme uygulayabilirsiniz.

Dinamik ışıklar sayısına göre sınırlı değilseniz size hiç ertelenmiş gölgeleme kullanarak neden düşünmelisiniz, ancak eğer vardır o zaman Battlefield 3 olası yaptığı optimizasyonu denemek isteyeceksiniz. (Herkese açık PDF'lerinin 10. slaytında ipucu veriyorlar: http://dice.se/wp-content/uploads/GDC11_DX11inBF3_Public.pdf )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.