Re-glBufferData () ', glVertexAttribPointer ile nasıl etkileşim kurar?
Temel sırayı anlıyorum: glGenBuffers () bir "tampon nesne adı" oluşturur, glBindBuffer () gerçek arabellek nesnesini oluşturur (aynı zamanda adı bağlar), glBufferData () "bir arabellek nesnesinin veri deposunu oluşturur ve başlatır" ve glVertexAttribPointer () arabellek verisinin biçimini ayarlar ve tampon nesne bağlamasını köşe öznitelik dizisi durumunun bir parçası olarak kaydeder.
Emin olamadığım zor olan şey, glVertexAttribPointer () öğesinin, "arabellek nesnesi veri deposu" (ancak tampon nesnesinin kendisi değil) yeni bir glBufferData () çağrısıyla uçup gitmesi durumunda geçerli kalmasıdır. Bunun genellikle iyi bir fikir olmadığının farkındayım - sadece tamponları yeniden yazarken glBufferSubData () kullanın - ancak yeniden boyutlandırılması gerekiyorsa glBufferData () tek seçenek gibi görünüyor. Artı, merak ediyorum.
Referans sayfaları, her iki şekilde de gidebileceğini gösteriyor - özellikle (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml):
Eğer işaretçi NULL değil, sıfır olmayan bir adlandırılan tampon nesne GL_ARRAY_BUFFER hedef (bkz bağlı olmalıdır glBindBuffer aksi takdirde bir hata oluşturulur). işaretçi , arabellek nesnesinin veri deposuna bir bayt uzaklığı olarak kabul edilir. Tampon nesne bağlaması (GL_ARRAY_BUFFER_BINDING), indeks indeksi için genel köşe öznitelik dizisi durumu (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) olarak kaydedilir .
Genel bir köşe öznitelik dizisi belirtildiğinde, geçerli köşe dizisi tampon nesnesi bağlamasına ek olarak , boyut , tür , normalleştirilmiş , adım ve işaretçi köşe dizisi durumu olarak kaydedilir.
Veri deposu farklı bir şeyle değiştirilse bile, hem bayt uzaklığı hem de arabellek nesnesi bağlama geçerli kalabilir gibi görünüyor. Ancak, çağrı sırasında bağlanmanın veri deposuna belirli bir işaretçiyi yakalayacağı ve veri deposu değiştirilirse geçersiz hale geleceği şekilde uygulandığını da görebiliyordum . Her iki yol da ifade tarafından engellenmiş görünmüyor.
Yanıtlar
GlVertexAttribPointer () bağlamalarının, sonraki glBufferData () çağrılarından sonra bile geçerli kaldığı görülmektedir. Bunu deneyerek belirledim, ki bu% 100 kanıt değil - sadece bu uygulamada çalışıyor olabilir (benim durumumda NVidia sürücüleri).
Bununla birlikte, bir hata mesajı geri çağırma ve hata ayıklama modu açıkken, ikinci glBufferData () çağrısında aşağıdaki mesajı alıyorum, bu da bu durumun beklendiğini / tasarlandığını kuvvetle gösteriyor:
[LWJGL] OpenGL hata ayıklama mesajı
Kimlik: 0x20071
Kaynak: API
Tür: DİĞER
Önem: NOTIFICATION
Mesaj: Tampon ayrıntılı bilgi: Tampon nesnesi 1 (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (0) 'a bağlı, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (1) ve GL_ARRAY_BUFFER_ARB tampon işlemleri için GL_ARRAY_BUFFER_ARB nesnesi olarak kullanım ipucu is_DRAW_STATIC kullanılır.
İlk iki bağlama, iki glVertexAttribPointer () çağrımı temsil eder ve glBufferData () 'yı ilk kez çağırdığımda günlüğe kaydedilen mesajda mevcut değildir.