2013-04-21 15 views
16

OpenGL'de tek bir draw çağrısı ile çok fazla parçalanmış geometri parçasını render etmek için iyi bir yaklaşımı kavramsallaştırıyorum ve karşı karşıya olduğum duvar her parçanın farklı bir dönüşüme ve belki de rotasyona sahip olması için bunu yapmanın en iyi yoludur Çünkü tek nesne çekimleri arasında model görünümü güncellemesini güncelleme lüksüne sahip değilsiniz. Burada ve başka yerlerde birkaç soru okudum ve insanların işaret ettiği yönleri oldukça farklı görünüyor. Bunu yapmanın ana yöntemlerini listelemek ve en yaygın ya da önerilen neyin yalıtıldığını denemek güzel olurdu. gölgelendiricideki matris dönüşümleri oluşturmaFarklı dönüşümlerle toplu çizim nesneleri için en iyi uygulama nedir?

  1. : [gerçekten burada geçerli değildir olarak Instancing ait kaldırılan söz değiştir]

    : İşte kabul ettik fikirler. Burada özniteliklerin bir parçası olarak bir çeviri vektörü veya bir dönüş açısı veya kuaternion gönderirim. Avantaj, mobil dahil olmak üzere çapraz platform çalışacak. Ancak, bir nesnede, her bir öznitelik için aynı dönüşüm verisini bir öznitelik olarak göndermek biraz israf gibi görünüyor. Görüntülemeden, bu benzer vektörleri veya skalerleri, tek bir nesne için, VBO'da, aralıklı dizinin bir parçası olarak birçok kez tekrarlamak zorundayım, değil mi? Diğer dezavantaj matematik yapmak için shader'a güveniyorum; Bunun bilge olup olmadığını bilmiyorum.

  2. 1) gibi, ancak matris hesaplamaları yapmak için gölgelendiriciye güvenmek yerine, bunun yerine istemci tarafında bunu gerçekleştiririm, ancak yine de VBO'da 16 yüzer akış olarak son model görünüm matrisini gönderirim. Ancak, anlayabildiğim kadarıyla, VBO'daki her bir köşe için bu özlü akışı tekrarlamak zorundayım, değil mi? Sadece savurgan görünüyor. Yukarıdaki 2) 'lik tradeoff, vertex başına VBO'ya daha fazla veri gönderiyorum (çeviri için 3-float vektöründen ziyade 16 float ve belki de 4 float quaternion), fakat shader'ın daha az iş yapmasını gerektiriyor. Yukarıdaki tüm sınırlamaları atlayın ve bunun yerine her bir nesne için ayrı bir çizim çağrısı ile ödün vermeyin. Bu, okuduğum kitaplarda tipik olarak "öğretilir", basitlik uğruna hiç şüphesiz.

Bunlardan başka yaygın yöntemler var mı?

Akademik bir soru olarak, yukarıdakilerin hepsinin uygulanabilir ve "kabul edilebilir" olup olmadıklarını merak ediyorum ya da bunlardan biri açıkça diğerlerinin üzerinde bir kazanan mı? Eğer münhasıran masaüstü GL'yi kullanacak olsaydım, bunu başarmanın birincil yolunu muhakeme ediyor?

+3

İyi soru, bu çeşitli tekniklerin çeşitli artıları ve eksileri hakkında bir tartışma görmek isterim. –

+1

Bu, çok çeşitli donanım platformlarında makul ve doğru önerilerde bulunmak için çok donanıma sahip bir donanımdır. Sadece instancing kullanmak uygun olduğunda bile bir tartışma belirli donanım. Temelde bir aylık bir araştırma projesi hakkında konuşuyorsun. –

+3

@NicolBolas tamam .... öyleyse, instancing hakkında bir tartışmayı çıkardığımızı varsayalım; Diğer tekniklerle ilgili bir tartışmanın bir anlamı yok mu? İnsanlar, VBO'lar ve shader'lar ile her türlü şeyi dener, kesinlikle neyin farkında olunması gerektiği hakkında bazı genel fikirler vardır, ya da bu önerilerin bazılarının neden iyi olmadığının nedenleri, vb. – johnbakers

cevap

11

İki hususlar: Birden nesneleri varsa

Genellikle bağımsız dönüşümleri kullanarak her nesnenin ile, konuşma, birden beraberlik çağrılarını kullanır. bu yüzden oradalar. Eski NVIDIA "Toplu Toplu İş" sunumu, 1 GHz GPU için 10,000 ile 40.000 arasında, çerçeve başına çağrıları (D3D'de. GL'de daha fazla) gösterdi. Bugünlerde, bundan çok daha fazlasını görüyorsunuz. Bu yüzden onlarca binlerce ayrı nesneyle uğraşmadıkça, hepsi birbirinden farklı (bu yüzden instancing değil), bu oran iyi olacaktır.

başka bir fikir:

tamamen shader dışına modelview matris hesaplamaları alın ve sadece çarpma sonrası tepe noktalarını geçmektedir.Bu, farklı yönelimler ve çevirilerdeki birçok nesne için tek bir çağrıya izin verir. Maliyet sadece tüm CPU hesaplamaları ile geliyor, ama sanırım bu darboğaz çok sayıda çekilişin darboğazı kadar büyük değilse, buna değecektir.

(here Alındığı.)

5

İşte alternatif bir fikir:

her bir özelliğiyle geçirilen bir nesne kimliği vertex verin. Daha sonra, köşe gölgelendiricide, dönüşüm matrislerinizi depoladığınız bir dokuda arama yapmak için bu kimliği kullanın.

+0

Ah, doku arayışları. Bahse girerim, beğendim. Teşekkürler. – johnbakers

+0

Bu yaklaşımla oynadım, bir çeşit Sprite. Tabii ki her seferinde dokuyu itmelisin, ama sadece bir avuç, köşelerden çok daha küçük. Basitleştirilmiş durumumda, xyz-translation ve y-rotation için bir satırda vec4s kullandım. Dokudaki tam bir matris her zaman gerekli olmayabilir. –

İlgili konular