2010-05-31 18 views
5

OpenGL ile bir 2D oyun yapıyorum. VBO'ları kullanarak doku çizimimi hızlandırmak istiyorum.Köşe nesneleri ile hızlı doku çizim OpenGL. Bunu yapmanın yolu bu mu?

Şu anda acil modu kullanıyorum. Bir dokuyu döndürdüğümde ve ölçeklediğimde kendi koordinatımı oluşturuyorum. Ayrıca, bir dokudaki köşeleri yuvarlama işlevselliği var, bunları çizmek için çokgen ilkelini kullanıyorum.

Düşünüyorum ki, dokumanın kenarları için, ofset içermeyen kenarları için bir VBO yapmak en hızlı olur, bu yüzden glTranslate, glScale ve glRotate kullanarak dokum için çizim konumunu hareket ettirebilirim. Sonra aynı VBO'yu her seferinde dokuyu çizmek için hiçbir değişiklik yapmadan kullanabilirim. Yuvarlatılmış köşeler için koordinat eklemem gerektiğinde sadece VBO'yu değiştirebilirdim.

iyi yolu bunu yapmak için mi? Bunu yaparken nelere dikkat etmeliyim? Modern grafik kartlarında GL_TRIANGLES yerine GL_QUADS kullanmak gerçekten hızlı mı?

herhangi cevabın için teşekkür ederiz.

cevap

4

iyi performans için, hemen mod oluşturmayı kullanmamalısınız, ancak bunun yerine (CPU veya GPU üzerine) köşe tampon kullanmak ve yöntemlerin gibi glDrawArrays vb kullanarak çizin. Doku matrisi çarpanını değiştirerek doku koordinatlarını ölçeklemek/döndürmek bir performans sorunu değildir, sadece tüm örgü için küçük değerler koymuş olursunuz. Buradaki en önemli darboğaz, piksel başına verileri (örneğin, renk, konum ve doku koordinatları) GPU'ya aktarmaktır ve GPU üzerindeki köşe arabelleği nesneleri büyük ölçüde yardımcı olabilir.

Ekrana çizmek istediğiniz ağ statikse, yani, bir kez ayarlayın ve daha sonra değiştirmenize gerek yoktur (daha sonra), tüm ağlar için tüm doku yapısı için doku koordinatlarını oluşturabilirsiniz. köşeler) sadece bir kez. Daha sonra doku matrisi çarpanını kullanarak tüm örgü için doku koordinatlarını değiştirebilirsiniz. Bununla birlikte, farklı dönüşümler kullanarak ağın farklı kısımlarını değiştirmek istiyorsanız, ağları parçalara ayırmanız gerekecektir. Anlattığınız şeyden, içinde bir resim tutan yuvarlak köşeli bir dikdörtgeni çizmek istediğinizi anlıyorum, ki bu da tek bir statik ağ (her bir vertex verisinin bir listesi) kullanılarak gerçekleştirilebilir.

Son olarak, GL_QUADS aynı zamanda modern OpenGL şartnamede kaldırılmıştır. Zaten çok fazla işlevsellik sunmuyorlar, dolayısıyla QUADS'ı üçgenlere veya üçgen şeritler/fanlar olarak değiştirmelisiniz.

+0

teşekkür ederiz. VBOS'un bir satır kodu için çalışmasını sağlamayı başardım, ancak doku çizimi için değil. Nasıl yapılacağına dair bir fikrim yok. Denediğim her şey başarısız oldu. Sanırım başka bir soruya ihtiyacım var. –

+0

Nesnelerinizin olmasını istediğiniz yerde görüyor musunuz? Sadece modellerin doğru tekstüre mi? Nesnelerinizi doğru konumda görüyorsanız, doku koordinat değerlerinin sadece köşe konumu değerleri gibi olduğunu unutmayın. Kolayca bir şeyle başlayın (doku matrisi modunda glTranslate vb. Kullanarak doku koordinatlarını değiştirmeyin), sonra neyi görmek istediğinizi elde etmek için onu genişletmeye çalışın. – AdilYalcin

+0

Şu anda doğru yerde görüntüleniyor, sadece düzgün bir şekilde işlenmiyor. Hem GL_QUADS hem de GL_TRIANGLES için başarısız. VBO kodumla yeni bir soru yapacağım. VBO'ya önemli bilgiler renk katıyor mu? "GlColor" bir problem mi olacak? Cevabınız ve yardımınız için teşekkür ederiz. –

1

VBO'ları kullanarak dokulu bir çokgen çizmek istiyorsanız, yalnızca köşe noktaları için değil, doku koordinatlarını (köşe başına bir UV koordinatı) ve köşe tonu yapmak istiyorsanız köşe renkleri için de arabellek oluşturmalısınız. aydınlatma (değilse yerine glColor kullanın). İstenen dokuyu bağlamadan önce glClientActiveTexture (GL_TEXTUREn) kullanın. Oluşturma çağrısını yayınlamadan önce kullandığınız her bir arabellek türü için glEnableClientState() kullanmayı unutmayın.

İlgili konular