Bir tepe dizisi ne zaman ve ne zaman VBO kullanılır?


14

Köşe dizileri ve köşe arabelleği nesneleri hakkında bilgi edinmeye çalışıyorum , ancak farklılıklar açısından anlamıyorum:

  • kullanım durumu (araziler gibi statik geometri, parçacık sistemi gibi her kareyi değiştiren geometri vb.)
  • verim
  • taşınabilirlik (eski grafik kartı, konsollar, Android veya iPhone gibi cihazlar vb.)

bazı açıklamalar?


3
Buraya gelen herkes için, burada en çok oylanan yanıtı kontrol edin .... stackoverflow.com/questions/430555/…
afuzzyllama

Yanıtlar:


14

İşte VBO'lar hakkında iyi bir yazı.

Verim

İşte çağrı semantiğine iyi bir genel bakış.

İşte performans sorunlarına iyi bir genel bakış; İçinde VBO'ların dizilerden daha performanslı olduğunu görüyoruz.

VBO'ları tercih etmemizin nedeni, verilerin karta yüklenmesidir ve bu nedenle her kareyi aktarmanız gerekmez. Oluşturulan VBO tipine bağlı olarak, grafik sürücüsüne kullanımla ilgili ipuçları verebilirsiniz (çok yazma, çok okuma, çok yazma, hiç okuma vb.).

kullanım

VBO'lar, değişmeyi beklemediğiniz arazi gibi statik geometri veya anlık geometri için gerçekten iyidir.

Köşe dizileri, sık sık değişen ancak ana makine tarafından da okunan veriler için iyidir - bu nedenle, manipüle edilen verileri doğrudan oluşturmak için (örneğin lazerli uzaklık ölçer veri tamponları bunları sık kullandığım yerlerdir). Ana cihazdaki verileri asla okumamaktan kurtulabiliyorsanız (sadece kartın üzerine iterek), sadece yazma modunda VBO'lar iyi bir seçenektir.

taşınabilirlik

İstemci Tarafı Köşe Dizileri Bunlar 3.0'dan önce OpenGL'de bulunur, 3.0'da kullanımdan kaldırılır ve 3.1+ sürümüne geçer. OpenGL ES bunları destekler (OpenGL ES 2 desteklemez).

VBO'lar Bunlar OpenGL 1.5'ten sonra mevcuttur. Geometri verilerini OpenGL ES 2'de (ve böylece WebGL) depolamanın tek yolu bunlar.


2
Bu PerformanceTuning.pdf dosyasında, VBO'ların "En uygun olmayan durumlarda performansa zarar verebileceği" yazıyor ... ama ayrıntılı değil. Bu vakaların ne olduğu hakkında bir fikrin var mı? Ben her durumda geometri güncellemek için gereken bir durum var, bu yüzden bir köşe dizisinin bu durumda bir VBO daha iyi veya daha kötü olacağını merak ediyorum. Teşekkür.
sidewinderguy

1
okumak opengl.org/sdk/docs/man/xhtml/glDrawElements.xml ve opengl.org/wiki/GlDrawElements - Köse dizilimi kaldırılmış ne de kaldırıldı DEĞİLDİR, hala OpenGL 4.x itibariyle desteklenir; gerçeklerinizi düzleştirin, dostum, çünkü

1
@vaxquis İstemci tarafı tepe noktası dizileri kullanımdan kaldırılmıştır. Sunucu tarafı tepe dizileri değildir. VAO'lar farklı bir şeydir ve devleti kurtarmak içindir. Gönderide yanlış bir şey yoktu, ancak istemci tarafını belirtirse daha doğru olabilirdi. Ama sanırım bu örtükti.
concept3d

1
"İstemci tarafı tepe dizisi dizileri kullanımdan kaldırıldı. Sunucu tarafı tepe dizisi dizileri kullanılmıyor." "Köşe Dizileri Bunlar 3.0'dan önce OpenGL'de kullanılabilir, 3.0'da kaldırılmıştır ve 3.1+'de gider." "ayrı köşe noktaları (...) önceden belirtebilir ve bunları glDrawElements için tek bir çağrı ile ilkel dizisi oluşturmak için kullanabilirsiniz. 4.4 sürümünde çekirdek" - Bu ifadelerde çelişki görüyorum.

2
Ayrıca, bir şey "kullanımdan kaldırıldı" demeden önce, söz konusu ifadenin kaynağını, tercihen resmi belgede belirtin. StackExchange'ten StackOverflow'a bir kanıt olarak işaret etmek bilimin çalışma şekli DEĞİLDİR ve "Örtük olduğunu tahmin ediyorum" ile savunma bir argüman değildir. Kimse istemci / sunucu dizilerini sormadı, soru VBO'ya kıyasla en geniş anlamda köşe dizisi hakkındaydı. Btw, VAO hakkında hiçbir şey söylemedim, bu fikir nereden?

11

(Bunu, ChrisE'nin cevabının son derece belirsiz olması nedeniyle ekliyorum, bu da maalesef orijinal sorunun belirsizliğinden kaynaklanıyor. Ancak OP'nin sorusunun " VAO'ların ne zaman kullanılacağı" başlıklı olması gerektiğini varsayacağım. ve VBO'ların ne zaman kullanılacağı ".)

V ertex B Uffer O (çok diğer türlerinden farklı değildir bjects B Uffer O örneğin bjects U niform B Uffer O bjects) grafik donanım yükleme köşe veriler için bir araç sağlar.

V ertex bir rray O bjects ek olarak kullanılan VBO ayrı köşe tampon ve yeniden ayar köşe rebind için gerekli aramaların sayısını azaltarak istemci tarafı (CPU tarafı) performansı arttırmak amacıyla s istediğiniz her zaman niteliklerini belirli bir şekilde işlemek için değiştirin. Her karede işe yarayan her şeyi yapmak yerine, bunu bir kez (başlatma sırasında) yaparsınız ve daha sonra ilişkili köşe özelliklerini kullanan her (dizi) çizim çağrısı için uygun VAO'yu yeniden hatırlarsınız .

Buna rağmen, VAO'ları sizi her bir kareyi değiştiren herhangi bir veri için glBindBuffer+ yapma zorunluluğundan kurtarmaz , örneğin oyun varlığı pozisyonları / rotasyonları / dönüşüm matrisleri. Yalnızca renderleme için yapmanız gereken tamamen statik verileriniz olduğunda .glBufferDataglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)


+1 VAO korkunç ve kafa karıştırıcı bir isim ve bana her zaman openGL'nin ne kadar karışık olduğunu hatırlatıyor.
concept3d

1
Ben de bu soru ile ilgili bir tartışma devam hatırlıyorum (çoğu silindi). Yine sorun OpenGL'nin korkunç terminolojisinde. Chris'in cevabını daha doğru olması için de düzenledim.
concept3d
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.