o zaman bir Hedef bağlamak biz bir Tampon varHedef dolduruyoruz sonra glBufferData)esasen bu belliydi ne doldurur, " /> o zaman bir Hedef bağlamak biz bir Tampon varHedef dolduruyoruz sonra glBufferData)esasen bu belliydi ne doldurur, " />
SORU
2 Ocak 2012, PAZARTESİ


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_BUFFERbağ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
2 Ocak 2012, PAZARTESİ


Terminoloji biraz kapalı

  • Vertex Array bir köşe verileri içeren bir dizi (genellikle bir float[]). Bir şeye bağlı olmak zorunda değildir. Üzerinde daha sonra geleceğim Vertex 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 zaman Vertex Buffer Object olarak anılacaktır.
  • Hiçbir şey alır kurtardı arka tepe dizi glVertexAttribPointer tam olarak nasıl çalışır gibi glVertexPointer 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 aramalar glDrawArrays 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:

  1. 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.
  2. 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.
  3. 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.
  4. Bununla bir - glDrawArrays(GL_TRIANGLES, 0, 6); çizin
  5. Ç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ğlayabilirsinizAra . çizin , sonra bir tam ^/grev>. Tümçizinbağlama ve VAO tarafından yakalanan saklı olsun diyor. glBindVertexArray(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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MrExcite96

    MrExcite96

    17 ŞUBAT 2011
  • ravinderosahn

    ravinderosah

    20 Temmuz 2009
  • World Science Festival

    World Scienc

    1 Mayıs 2008