Ertelenmiş Görüntü Motoru için Sahne Grafiği


10

Bir öğrenme alıştırması olarak ertelenmiş bir oluşturma motoru yazdım. Şimdi bu motora bir sahne grafiği eklemek istiyorum ama bunu nasıl yapacağımı biraz şaşırdım.

Normal bir (ileri işleme motoru), sahne grafiğe önce tüm öğeleri (Tümü IDrawable ve IUpdateAble uyguluyor) ekleyeceğim, önce sahne grafiği genişliğini gezip her yere Draw () diyorum.

Ancak ertelenmiş bir oluşturma motorunda çizim çağrılarını ayırmak zorundayım. Önce hepsini birleştirmeden önce geometriyi, sonra gölge tekerlekleri ve sonra ışıkları (hepsi farklı render hedeflerine) çizmem gerekiyor. Yani bu durumda sadece sahne grafiğinin üzerinden geçip sadece beraberlik diyemem. Gördüğüm şekilde ya çizilmesi gereken nesnenin ne olduğunu kontrol etmek için ya sahne grafiğinin üzerinde 3 kez seyahat etmek zorundayım ya da bir şekilde birbirine bağlı 3 ayrı sahne grafiği oluşturmak zorundayım. Her ikisi de kötü çözümler gibi görünüyor, sahne nesnelerini daha şeffaf işlemek istiyorum.

Düşündüğüm bir diğer çözüm, sahne grafiğinde normal olarak seyahat etmek ve 3 ayrı listeye öğe eklemek, geometri, gölge tekerleri ve ışıkları ayırmak ve daha sonra doğru listeleri çizmek için bu listeleri tekrarlamaktı, bu daha iyi ve daha mı? her kareyi 3 liste yeniden doldurmak akıllıca?

Yanıtlar:


6

Bir C ++ projesinde kullandığım bir yaklaşım, sahne grafiğinin (uzamsal dizine sahip olan) mevcut görüntüleme frustumuna dayalı olarak 'görünür' bir std :: isabet vektörü doldurmasıdır. Bu görünür liste sahne grafiği tarafından yönetilir, bu nedenle yalnızca kamera hareket ettiğinde yeniden hesaplanır - grafikteki hareketli nesneler bu listede taşınır ve gerektiğinde sıralanıp birleştirilen mezar taşları ve sıralanmamış değişiklik listeleri kullanılarak.

Görünür öğelerin listesi önce gölgelendirici kimliğine göre ve her türün içinde kameradan uzaklığa göre sıralanır. Gölgelendirici kimlikleri, önce arazi ve daha sonra binalar ve daha sonra birimler ve daha sonra mermiler ve daha sonra parçacıklar vb. - bir RTS olacak şekilde atanır. Bazı modellerde birden fazla gölgelendirici vardır, ancak yalnızca birincil gölgelendiricilerinin reklamını yaparlar. Çizim yapmaları istendiğinde, başka bir gölgelendirici ile çizilen bitlere ihtiyaç duyanlar da kendilerini bir sonraki geçişli tek bağlantılı listeye ekler.

Böylece çizim, bir geçişte görünür diziden geçer ve bir geçişte bu öğelerin yeniden bağlanması için bağlantılı bir liste oluşturulur ve ikinci bir geçiş vb.

Önden arkaya ve sonra opak sonra saydam çizmek her şeyin aklı başında kalmasına yardımcı olur.

Bu, gölgelendirici değişikliklerinin vb. Sayısını en aza indirmez, ancak uygulanması oldukça uygulanabilir ve kolaydır.

XNA ve bunun ne kadar uygulanabilir olduğu ve oluşturduğunuz bu düşük düzeyli şeylerden ne kadar korktuğum hakkında hiçbir fikrim yok. Bununla birlikte, gazilerin C ++ RTSes için bu yaklaşım hakkında ne düşündüklerini bilmek en ilginç olurdu.


Hey Will, bu cevabı gerçekten çok seviyorum, özellikle de şimdiye kadar düşündüğümden tamamen farklı olduğu için. Yönteminiz özellikle yarı saydam nesneler (şimdiye kadar çoğunlukla kaçındım) düşünürken çok aklı başında görünüyor. Nesnelerin ziyaret etmesi için sahne grafiğinizden (bağlantılı) bir liste oluşturmak çok iyi bir fikir gibi görünüyor. Ve evet XNA'da tüm bu düşük seviye şeyleri de yapmak zorundayız :).
Roy T.Şubat

3

Benim önerim, sizin tanımladığınız gibi özel gereksinimlerinize göre uyarlanmış 2 adımlı bir yaklaşım olacaktır. Vaka gölgenizde, geometrinizde, ışıklarınızda (belki de dördüncüsü saydam nesneler mi?)

Sahne grafiği herhangi bir ilişki türüne dayalı olabilir, ancak kişisel tercihim, her düğümün hızlı ayıklamayı kolaylaştırmak için diğer düğümleri içerebileceği uzamsal ilişkilere dayalı olacaktır.

İşleme koleksiyonları, belirli bir adıma göre uyarlanmış herhangi bir veri yapısı türü olabilir. Örneğin, gölge koleksiyonu erken z reddini en üst düzeye çıkarmak için derinliğe göre sıralanmış bir liste veya ağaç olabilir. Geometri koleksiyonu gölgelendirici (durum) değişikliklerini en aza indirmek için gölgelendirici kullanımına göre sıralanabilir. Işık koleksiyonu, ışık mesafesi, boyut veya bunların bir kombinasyonuna göre sıralanan bir liste veya ağaç olabilir; böylece performansla ilgili bir sorun olduğunda ışık oluşturmayı yalnızca en etkili ışıklarla sınırlayabilirsiniz.

Hangi veri yapılarını seçerseniz seçin, ekleme işleminin hızlı olduğundan ve veri tahsisini / tahribatını ortadan kaldırmak için havuzlama ve diğer teknikleri kullandığından emin olun çünkü bu listeleri her bir kareyi temizleyip dolduracaksınız.

Şimdi hepsini birbirine bağlamak kolaydır. Sadece sahne grafiğini gözden geçirin ve her bir öğeyi ilgili render koleksiyonuna ekleyin. Veri yapınız, gereksinimlere göre yeni girişleri otomatik olarak sıralar / yapılandırırsa yardımcı olur. İşiniz bittiğinde, oluşturma koleksiyonlarını gerekli sırayla gözden geçirin ve oluşturun.

Veri yapılarınız hızlı eklenir ve çöp üretmezler, belirttiğiniz gibi listeleri yeniden doldurmak için herhangi bir ceza yoktur.

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.