glVertexAttribPointer açıklama
Sadece bunu anladığımdan emin olmak için, doğru (ask bu KADAR Sohbet ederdim, ama ölü yok!):
"" Bağlama tarafından . geçerli, hangi Köşe bir Dizi var ^br>
o zaman bir Hedef bağlamak biz bir Tampon var
Hedef dolduruyoruz sonra glBufferData
)
esasen bu belliydi ne doldurur, yani bizim Tampon . hedef ^br>
ve sonra GL_ARRAY_BUFFER
bağlı her veri olmak düzenlendiği açıklar glVertexAttribPointer
diyoruz
ve bu tanımlayıcı özgün Köşe bizim Diziye kaydedilir
(1) Benim anladığım doğru mu?
documentation her şey ilişkilidir hakkında biraz seyrek.
(2) varsayılan bir tür var Dizi Köşe? /Atlanmış çünkü unuttum glGenVertexArrays
glBindVertexArray
ve benim program olmadan iyi çalıştı.
Düzenleme:Bir adım... glEnableVertexAttribArray
özledim.
(3) Tepe Öznitelik bağlı Tepe dizisinde zaman glVertexAttribPointer
denir, ve daha sonra biz Etkinleştir/devre dışı öznitelik) glEnableVertexAttribArray
herhangi bir zamanda, ne olursa olsun, hangi Köşe dizidir şu anda bağlı?
Veya (3b) Tepe Öznitelik bağlı Tepe dizisinde zaman glEnableVertexAttribArray
denir, ve böylece biz eklemek aynı Köşe Öznitelik için birden fazla Köşe Diziler çağırarak glEnableVertexAttribArray
farklı zamanlarda, farklı Köşe Diziler bağlı?
CEVAP
Terminoloji biraz kapalı
Vertex Array
bir köşe verileri içeren bir dizi (genellikle birfloat[]
). Bir şeye bağlı olmak zorunda değildir. Üzerinde daha sonra geleceğimVertex Array Object
veya bir VAO ile karıştırılmamalıdır- ** 14, yaygın olarak saklamak köşeler, ya da kısaca DURUMLARINI,
Buffer
sadece söylediğin zamanVertex Buffer Object
olarak anılacaktır. - Hiçbir şey alır kurtardı arka tepe dizi
glVertexAttribPointer
tam olarak nasıl çalışır gibiglVertexPointer
glTexCoordPointer
çalışma, sadece yerine adlı öznitelikleri almak için sağlayan bir sayı belirtir kendi özniteliği.index
bu değeri geçirir.glVertexAttribPointer
tüm aramalarglDrawArrays
glDrawElements
aramadan sonraki süre için kuyruğa girdi. Eğer bir VAO bağlı ise, VAO tüm niteliklerini ayarlarını muhafaza edecektir.
Asıl sorun burada VAOs ile köşe nitelikleri karıştırıyorsunuz. Köşe nitelikleri sadece tanımlama noktalar, texcoords, normaller, vb yeni bir yoludur. çizim için. VAOs devlet saklayın. İlk çizim köşe nitelikleri ile nasıl çalıştığını açıklamak, VAOs ile yöntem çağrıları sayısını kısmak nasıl yapabilirsiniz açıklamaya gidiyorum:
- Bir gölgelendiricide kullanmadan önce bir öznitelik etkinleştirmeniz gerekir. Eğer köşe bir Loader örneği göndermek isterseniz, örneğin, büyük olasılıkla ilk özniteliği 0 olarak göndereceksin. İşleme başlamadan önce,
glEnableVertexAttribArray(0);
ile etkinleştirmeniz gerekir. - Bir öznitelik etkin olduğunu artık kullanmak için gidiyor veri tanımlamak gerekir. Bunu yapmak için kendi DURUMLARINI -
glBindBuffer(GL_ARRAY_BUFFER, myBuffer);
bağlamak gerekir. - Ve şimdi öznitelik -
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
tanımlayabiliriz. Sipariş parametre: 0 özniteliği sen tanımlanması, 3 boyutu her köşe,GL_FLOAT
tipi,GL_FALSE
demek için değil normale her köşe, son 2 tane sıfır demek yok adım veya ofset köşe. - Bununla bir -
glDrawArrays(GL_TRIANGLES, 0, 6);
çizin - Çizdiğiniz bir sonraki şey 0 öznitelik kullanamazlar (gerçekçi olacak, ama bu bir örnek) -
glDisableVertexAttribArray(0);
devre dışı bırakın
glUseProgram()
çağrıları bu şal ve gölgeleme düzgün çalışan bir işleme sistemi var. Ama diyelim ki 5 farklı özellikler var, köşeler, texcoords, normaller, renk ve lightmap koordinatları. Öncelikle, bu niteliklerin her biri için glVertexAttribPointer
tek bir arama yapmak olacaktır, ve tüm özellikleri önceden etkinleştirmek gerekecek. Hadi ben helva gibi nitelikler 0-4 tanımlamak demek. Yani hepsini etkinleştir:
for (int i = 0; i < 5; i )
glEnableVertexAttribArray(i);
Ve o zaman sen-cekti var bağlamak farklı VBOs için her öznitelik (sürece saklamak hepsini bir DURUMLARINI ve kullanım uzaklıklar/adım), sonra da yapman lazım 5 farklı glVertexAttribPointer
aramalar glVertexAttribPointer(0,...);
glVertexAttribPointer(4,...);
köşeler için lightmap koordinatları sırasıyla.
Umarım bu sistem yalnız mantıklı. Şimdi VAOs onları işleme bu tür yaparken yöntem çağrılarının sayısını azaltmak için nasıl kullanılacağını açıklamak için hareket edeceğim. Bir VAO kullanarak gerekli olduğunu unutmayın.
Vertex Array Object
veya bir VAO glVertexAttribPointer
tüm aramalar ve glVertexAttribPointer
çağrıları her yapıldığında hedef alınması, VBOs durumunu saklamak için kullanılır.
glGenVertexArrays
telefonla oluşturmak. Bir VAO ihtiyacınız olan her şeyi saklamak için, glBindVertexArray
ile bağlayabilirsinizglBindVertexArray(0);
ile VAO kesin
Şimdi ne zaman beraberlik nesne, hiç gerek yok yeniden arayın tüm DURUMLARINI bağlar veya glVertexAttribPointer
çağrıları, senin sadece bağlama VAO glBindVertexArray
arama glDrawArrays
glDrawElements
ve olursun çizim aynı şey sanki yapmadan tüm bu yöntemini çağırır. Muhtemelen VAO sonrasında da kesin.
Bu VAO bağlantı kesme sonra, daha önce ne kadar için tüm devlet verir VAO sana bağlı. Eğer VAO bağlı iken yaptığınız tüm değişiklikler saklanır emin değilim, ama bu kadar kolay bir test programı ile çözdüm. glBindVertexArray(0);
olarak bağlayıcı "varsayılan" VAO... . düşünebilirsiniz sanırım
Güncelleme:Birisi benim dikkatimi asıl beraberlik çağrısı için ihtiyaç getirdi. Görünüşe göre, aslında VAO, tüm bağlama olayı sadece kurarken TAM bir beraberlik çağrısı yapmaya gerek yok. Gerekli daha erken olduğunu sanıyordum neden bilmiyorum, ama şimdi düzeldi.
Büyük O düz İngilizce açıklama...
Nil özlü bir açıklama v. v. Raylar üze...
Nasıl PowerShell kod açıklama mı?...
jQuery - metin) seçin bir denetimin se...
Hangi @NotNull açıklama Java kullanmal...