Bagaimana re-glBufferData () berinteraksi dengan glVertexAttribPointer?
Saya memahami urutan dasarnya: glGenBuffers () membuat "nama objek buffer", glBindBuffer () membuat objek buffer aktual (serta mengikat nama), glBufferData () "membuat dan menginisialisasi penyimpanan data objek buffer," dan glVertexAttribPointer () menetapkan format data buffer, serta menyimpan objek buffer yang mengikat sebagai bagian dari status array attrib vertex.
Hal rumit yang saya tidak yakin adalah jika hal-hal glVertexAttribPointer () tetap valid jika "penyimpanan data objek penyangga" (tetapi bukan objek penyangga itu sendiri) terpesona oleh panggilan baru ke glBufferData (). Saya sadar bahwa ini biasanya bukan ide yang baik - gunakan glBufferSubData () saat hanya menulis ulang buffer - tetapi glBufferData () sepertinya satu-satunya pilihan jika perlu diubah ukurannya. Ditambah lagi, saya hanya penasaran.
Halaman referensi membuatnya terdengar seperti itu bisa berjalan baik - khususnya (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml):
Jika pointer bukan NULL, objek buffer bernama bukan-nol harus terikat ke target GL_ARRAY_BUFFER (lihat glBindBuffer ), jika tidak kesalahan akan dihasilkan. pointer diperlakukan sebagai offset byte ke penyimpanan data objek buffer. Pengikatan objek buffer (GL_ARRAY_BUFFER_BINDING) disimpan sebagai status larik atribut vertex generik (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) untuk indeks indeks .
Ketika array atribut vertex generik ditentukan, ukuran , jenis , dinormalisasi , langkah , dan pointer disimpan sebagai status array vertex, sebagai tambahan dari pengikatan objek buffer array vertex saat ini.
Sepertinya offset byte dan pengikatan objek buffer dapat tetap valid, meskipun penyimpanan data diganti dengan sesuatu yang berbeda. Tapi saya juga bisa melihatnya diimplementasikan sedemikian rupa sehingga pada saat panggilan, binding menangkap pointer tertentu ke dalam penyimpanan data, yang menjadi tidak valid jika penyimpanan data diganti. Tidak ada cara yang tampaknya terhalang oleh kata-kata.
Jawaban
Tampaknya binding glVertexAttribPointer () tetap valid, bahkan setelah panggilan berikutnya ke glBufferData (). Saya menentukan ini dengan mencobanya, yang tidak 100% bukti - itu hanya bisa berfungsi hanya dalam implementasi ini (driver NVidia, dalam kasus saya).
Namun, dengan pesan kesalahan callback dan mode debug aktif, saya mendapatkan pesan berikut pada panggilan kedua ke glBufferData (), yang sangat menyarankan bahwa situasi ini diharapkan / dirancang untuk:
[LWJGL] Pesan debug OpenGL ID: 0x20071 Sumber: API Jenis: LAINNYA Keparahan: PEMBERITAHUAN Pesan: Info detail buffer: Objek buffer 1 (terikat ke GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (0), GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (1), dan GL_ARRAY_BUFFER_ARB, petunjuk penggunaan adalah GL_STATIC_DRAW) akan menggunakan memori objek VIDEO sebagai sumber untuk operasi objek buffer VIDEO.
Dua binding pertama mewakili dua panggilan saya ke glVertexAttribPointer (), dan tidak ada dalam pesan yang dicatat saat pertama kali saya memanggil glBufferData ().