OpenGL ES 2.0'da geometri örnekleme


12

OpenGL ES 2.0'da geometri örneklemesi yapmayı planlıyorum. Temelde aynı geometriyi (bir sandalye) belki de sahnemde 1000 kez oluşturmayı planlıyorum.

Bunu OpenGL ES 2.0'da yapmanın en iyi yolu nedir?

Model görünümü mat4'ü bir özellik olarak geçirmeyi düşünüyorum. Nitelikler köşe verisi başına olduğundan, aynı üçgenin her köşe için üç kez aynı mat4'ü geçmem gerekir (model görünümü üçgenin köşelerinde sabit kaldığı için).

Bu, GPU'ya gönderilen çok fazla fazla veri anlamına gelir (2 ekstra köşe * 16 yüzer * (Üçgen sayısı) ekstra veri miktarı).

Ya da mat4'ü her üçgene sadece bir kez mi göndermeliyim?

OpenGL ES 2.0'da örnek oluşturmanın en iyi ve verimli yolu nedir?


3
Gerçekten özledim glVertexAttribDivisor:(
Will

Yanıtlar:


9

ES2'nin glVertexAttribDivisor veya kayan nokta dokuları yoktur, bu nedenle seçenekleriniz oldukça sınırlıdır.

Zaten yapmadıysanız kesinlikle sandalye modelinizi bir VBO'ya koyun. Oradan, her bir sandalye için bir tane olmak üzere, bireysel çekiliş çağrılarıyla daha fazla veya daha az kısıtlısınız, bu nedenle her sandalye için dönüşüm matrisini GPU'ya mümkün olduğunca verimli bir şekilde getirmektir.

Bunu düzenli glUniform çağrılarla yapabilir veya bazı ekstra köşe özellik yuvalarını kötüye kullanabilir ve her sandalyeyi çizmeden önce bu tür 4 yuva kullanarak matrisi belirterek bazı glVertexAttrib (not: not glVertexAttribPointer) çağrıları yapabilirsiniz ve bu değerler 4 sandalyede sonraki her köşe. Bu, bazı donanımlarda yeterince hızlı ancak diğerlerinde daha yavaş bir yol olabilir, böylece denemeniz gerekir.

Sandalyeleriniz başka bir şeyi döndürmezse, gölgelendiricinize konum göndermek ve oraya anında yeni bir dönüşüm matrisi oluşturmaktır. Bu kulağa korkunç geliyor ama aslında inanılmaz hızlı (sadece 3 şamandıra ayarlı) ve işi yapabilir.

Genel olarak ve tipik bir mobil platform hedeflediğinizi varsayarsak, çizdiğiniz her ne olursa olsun, telefon görüşmelerinin sizi öldüreceğini düşünüyorum.


6

En iyi seçeneğiniz, tenli modellere oldukça benzer bir örnekleme yaklaşımı kullanmaktır. Sandalyenizin birçok kopyasını tutacak bir VBO oluşturun, hepsi aynı. Şimdi, her tepe noktasının, dizini uygulanacağı dönüşüm matrisine taşıyacak bir bayt özniteliği olmalıdır. Gölgelendiricinize bir dizi matris gönderin ve bunları her sandalyenizin dünya dönüşümü olarak kullanın. Bu şekilde, VBO'daki herhangi bir veriyi yeniden yazmak zorunda kalmadan her çağrıda, array parametresinin maksimum boyutu kadar sandalye çizebilirsiniz.


3

Wolfire Games, hızlı nesne örnekleme hakkında mükemmel bir blog yayınına sahiptir . Yaptıkları şey modeli birkaç kez yapmak, ancak her nesne için tek tip bir yuvaya farklı bir matris göndermek.

Bu, bir sürü nesneyi örneklemenin oldukça etkili bir yoludur, çünkü verileri yalnızca bir kez göndermeniz gerekir (bir nesne kümesini oluştururken en büyük darboğaz her zaman bant genişliği olacaktır) ve ardından modeli bir gölgelendiricide dönüştürmeniz gerekir.


Her neyse, Nvidia metnine referans vermenin mobil PVR çipleri için de geçerli olduğundan emin değilim. Özellikle sürücü bölümü hakkındaki sözleri hakkında . http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil

1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

Bu, WebGL'de bir Google Talk, yani JavaScript için OpenGL ES, yani geometri örneklemesi de yok. Size bir fikir verebilir, ancak söylemek zor çünkü darboğazınızın GPU'da mı yoksa CPU'da mı olduğunu bilmiyorum.

Düzgün değişkenler hakkında bilgi edinmelisiniz, bir özellikte kesinlikle bir mat4 göndermeye gerek yok, sandalyenizin tüm köşeleri aynı matris tarafından dönüştürülecek, üçgen başına değil, model başına sadece bir kez göndermelisiniz. Düzgün değişkenler bunu yapmanıza izin verir, gölgelendirici programında ayarlayabileceğiniz özel bir değişken türüdür.

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.