Memahami VAO dan VBO
Saya membaca Learn OpenGL untuk menyegarkan konsep dasar yang belum pernah saya sentuh selama beberapa waktu.
Secara khusus saya masih berpikir saya tidak begitu memahami arti dari VAO dan VBO, buku ini terutama berproses melalui contoh-contoh yang tidak benar-benar memberikan definisi yang ketat.
Tentang VBO:
Dengan data vertex yang ditentukan, kami ingin mengirimkannya sebagai masukan ke proses pertama dari pipeline grafis: vertex shader. Ini dilakukan dengan membuat memori pada GPU tempat kami menyimpan data simpul, mengkonfigurasi bagaimana OpenGL harus menafsirkan memori dan menentukan cara mengirim data ke kartu grafis. Vertex shader kemudian memproses sebanyak mungkin simpul yang kita perintahkan dari memorinya. Kami mengelola memori ini melalui apa yang disebut objek buffer vertex (VBO) yang dapat menyimpan sejumlah besar verteks di memori GPU. Keuntungan menggunakan objek buffer tersebut adalah kita dapat mengirim sejumlah besar data sekaligus ke kartu grafis, dan menyimpannya di sana jika ada cukup memori yang tersisa, tanpa harus mengirim data satu simpul pada satu waktu. Pengiriman data ke kartu grafis dari CPU relatif lambat, jadi di mana pun kami bisa, kami mencoba mengirim data sebanyak mungkin sekaligus. Setelah data berada di memori kartu grafis, shader vertex memiliki akses instan ke simpul sehingga membuatnya sangat cepat
Jadi pemahaman saya tentang VBO pada dasarnya adalah objek Buffer (sekelompok byte untuk dikirim ke GPU) dengan perbedaan bahwa VBO secara khusus didedikasikan untuk Data Vertex. Apakah ini benar?
Tentang VAO:
Di sini saya tidak begitu mengerti.
Sebuah objek vertex array yang (juga dikenal sebagai VAO ) dapat terikat seperti benda titik penyangga dan setiap berikutnya panggilan atribut vertex dari titik itu akan disimpan dalam VAO.
Apa artinya panggilan atribut vertex berikutnya dari titik itu akan disimpan di dalam VAO , saya tidak mengerti bit "panggilan disimpan", apakah itu berarti di suatu tempat dalam konteks opengl yang dibuat, kami menyimpan seperti beberapa data yang terkait dengan atribut vertex panggilan (seperti pasangan input output dari panggilan? output dari panggilan? sesuatu yang berhubungan dengan panggilan?).
Keuntungannya adalah saat mengkonfigurasi pointer atribut vertex, Anda hanya perlu melakukan panggilan tersebut sekali dan kapan pun kita ingin menggambar objek, kita cukup mengikat VAO yang sesuai. Hal ini membuat peralihan antara data vertex yang berbeda dan konfigurasi atribut semudah mengikat VAO yang berbeda. Semua status yang baru saja kita atur disimpan di dalam VAO.
Saya tidak mengerti keuntungan di sini. Saya memahami "panggilan dilakukan sekali", karena mereka disimpan di VAO (apa pun artinya "bagian yang disimpan"). Bagian pengalihan mungkin berarti saya dapat membuat beberapa VAO masing-masing menangkap panggilan Atribut Vertex yang berbeda dan saya dapat mengikat masing-masing ini ketika saya perlu tanpa memanggil lagi atribut vertex?
Sebagai referensi, saya juga menemukan pertanyaan ini yang menurut saya memiliki jawaban yang menarik.
Jawaban
Jadi pemahaman saya tentang VBO pada dasarnya adalah objek Buffer (sekelompok byte untuk dikirim ke GPU) dengan perbedaan bahwa VBO secara khusus didedikasikan untuk Data Vertex. Apakah ini benar?
"VBO" sebenarnya bukan sesuatu, dan saya benar-benar berharap tutorial akan berhenti berpura-pura seperti itu.
Anda benar karena ada objek penyangga . Ini adalah array linier dari data yang tidak diformat yang disimpan oleh GPU dan dapat diakses untuk berbagai proses. Salah satu dari "berbagai proses" yang dapat digunakan oleh GPU adalah menyediakan data larik untuk operasi perenderan verteks.
Tetapi buffer itu sendiri tidak istimewa. Itu tidak menjadi hal yang berbeda hanya karena Anda menggunakannya untuk data vertex, dan tidak ada aturan yang mengatakan bahwa buffer yang saat ini Anda gunakan untuk data vertex tidak dapat digunakan untuk penggunaan buffer lainnya juga.
Perhatikan bahwa ini berbeda dari cara kerja tekstur. Saat Anda membuat objek tekstur dan mengikatnya sebagai tekstur 2D, objek tekstur itu selamanya menjadi tekstur 2D. Anda tidak dapat mengikatnya nanti sebagai 1D atau peta kubus atau apa pun. Objek penyangga tidak seperti itu; tempat Anda mengikatnya hanya menentukan cara Anda menggunakannya saat ini .
Apa artinya "setiap panggilan atribut vertex berikutnya dari titik itu akan disimpan di dalam VAO"
Ini adalah satu lagi kiasan tutorial yang mengganggu: bahwa objek "menyimpan panggilan" atau makro atau omong kosong semacam itu.
Objek di OpenGL tidak menyimpan panggilan; mereka menyimpan negara bagian . Mereka seperti struct; mereka memiliki anggota data. Mengikat objek ke konteks OpenGL memungkinkan operasi OpenGL yang mengakses status tertentu untuk menemukan status tersebut di dalam objek terikat. Jadi, jika Anda memanggil fungsi yang mengubah status tertentu dari objek terikat, fungsi itu akan mengubah status di dalam objek.
Saat Anda mengikat VAO, Anda mengikat objek yang menyimpan status yang digunakan untuk array vertex. Saat Anda memanggil fungsi yang mengubah status untuk array vertex, fungsi itu akan mengubah status yang disimpan dalam VAO yang saat ini terikat. Saat Anda merender, sistem rendering akan menggunakan status larik vertex yang ditemukan di VAO yang saat ini terikat.
VBO adalah buffer memori yang dapat diakses oleh GPU. Itu saja.
VAO adalah sebuah objek yang menyimpan ikatan simpul. Ini berarti bahwa ketika Anda memanggil glVertexAttribPointer dan teman-teman untuk mendeskripsikan format simpul Anda, informasi format tersebut akan disimpan ke dalam VAO yang saat ini terikat. Dan ketika Anda menggambar itu akan menggunakan ikatan simpul di VAO yang saat ini terikat.
Berpura-pura memutar ulang panggilan yang mengikat itu menyesatkan. Ini adalah peninggalan dari mengapa VAO dibuat karena sebelum VAO Anda memang perlu mengulang pengikatan simpul setiap kali Anda mengubah mesh yang Anda gambar. VAO memungkinkan Anda melakukannya dalam satu panggilan.