Pada semua tutorial yang dapat saya temukan tentang VAO (Vertex Array Objects), mereka menunjukkan cara menggunakannya dengan mengkonfigurasi atribut vertex dan mengikat VBO (Vertex Buffer Object). Tapi saya ingin membuat VAO yang akan dikonfigurasi untuk satu set VBO dalam kombinasi dengan shader tetap, di mana setiap buffer menggunakan pola data yang sama (vertex, uv, warna, dll). Jadi, saya ingin membuat satu VAO untuk beberapa VBO yang akan ditarik menggunakan satu shader.
Saya tidak dapat menemukan demo tentang ini, jadi saya memutuskan untuk mencobanya. Tetapi itu tidak berhasil dan crash pada glDrawArray
panggilan. Sepertinya VBO tidak terikat. Ini kode yang saya gunakan:
Rendering:
/* Prepare vertex attributes */
glBindVertexArrayOES(vao);
/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());
/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);
glBindVertexArrayOES(0);
Pembuatan VAO:
glBindVertexArrayOES(vao);
glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);
glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));
glBindVertexArrayOES(0);
Di mana ls
sederhana struct
yang menyimpan lokasi atribut.
Di bagian Rendering, menukar glBindBuffer
dan glBindVertexArrayOES
sekitar juga tidak berhasil.
Jadi, pertanyaannya adalah: Apakah mungkin untuk melakukannya, atau apakah saya harus membuat untuk setiap buffer sebuah VAO? Dan jika saya harus membuat VAO untuk setiap VBO, apakah mungkin untuk memperbarui data VBO menggunakan glBufferSubData
dalam kombinasi dengan VAO?
VAO menyimpan status glVertexAttribPointer. Mengubah VAO tidak memengaruhi glBindBuffer saat ini, juga tidak mengubah glBindBuffer memengaruhi VAO. Hanya panggilan glVertexAttribPointer yang memengaruhi VAO, dengan merekam buffer yang digunakan saat panggilan berlangsung.
Jadi jawaban untuk pertanyaan Anda adalah tidak.
Salah satu opsi jika Anda ingin mengurangi jumlah objek adalah dengan meletakkan semua data mesh Anda ke dalam satu VBO besar dan tentukan di mana data mesh tinggal di VBO dalam panggilan glDrawArrays menggunakan argumen 'pertama' dan 'hitung'.
sumber
glBindBuffer
negara kecualiGL_ELEMENT_ARRAY_BUFFER
diubah dengan mengikat VAO.