Gelecekte 3D'yi destekleyecek bir 2D oyun motoru geliştiriyorum. Şu anki geliştirme aşamasında, toplu iş oluşturucu üzerinde çalışıyorum. Bazılarınızın bildiği gibi, grafikleri bir araya getirirken, renk (RGBA), doku koordinatları, doku kimliği (doku dizini) ve model dönüştürme matrisi için tekdüze destek pencereden dışarı çıkar, bunun yerine köşe arabelleğinden geçirilir. Şu anda, modelin konumlarını, rengini, doku koordinatlarını ve doku kimliğini köşe arabelleğine geçirmeyi uyguladım. Köşe tampon formatım şu anda böyle görünüyor:
float* v0 = {x, y, r, g, b, a, u, v, textureID};
float* v1 = {x, y, r, g, b, a, u, v, textureID};
float* v2 = {x, y, r, g, b, a, u, v, textureID};
float* v3 = {x, y, r, g, b, a, u, v, textureID};
Bir dönüşüm matrisi kullanarak nesnenin dünya uzayında nerede olması gerektiğini hesaplamayı entegre etmek üzereyim. Bu bana şu soruyu sormamı sağlıyor:
Dönüşüm matrisi, CPU veya gpu'daki model köşe konumları ile çarpılmalı mı?
Akılda tutulması gereken bir şey, eğer köşe arabelleğine geçirirsem, dönüşüm matrisini köşe başına bir kez (sprite başına 4 kez) yüklemem gerektiğidir ki bu benim için bir bellek kaybı gibi görünüyor. Öte yandan, model köşe konumlarını CPU üzerindeki dönüşüm matrisi ile çarpmak, GPU'nun eşzamanlılık yeteneklerine kıyasla daha yavaş olacak gibi görünüyor.
GPU'DAKİ dönüşümü hesaplarsam köşe arabellek biçimim böyle görünürdü:
float* v0 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v1 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v2 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v3 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
Soru çoğunlukla teorik olarak yönlendirilir. Yani, teorik ve teknik bir cevap çok takdir edilecektir. Ama referans için, işte kod.