Saya baru mulai mempelajari OpenGL hari ini dari tutorial ini: http://openglbook.com/the-book/
Saya sampai pada bab 2, di mana saya menggambar segitiga, dan saya memahami segalanya kecuali VAO (apakah akronim ini OK?). Tutorial memiliki kode ini:
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
Meskipun saya memahami bahwa kode itu diperlukan, saya tidak tahu apa fungsinya. Meskipun saya tidak pernah menggunakan VaoId melewati titik ini (kecuali untuk menghancurkannya), kode tidak akan berfungsi tanpanya. Saya berasumsi ini karena itu harus terikat, tapi saya tidak tahu mengapa. Apakah kode persis ini hanya perlu menjadi bagian dari setiap program OpenGL? Tutorial menjelaskan VAO sebagai:
Objek Array Vertex (atau VAO) adalah objek yang menjelaskan bagaimana atribut simpul disimpan dalam Objek Penyangga Vertex (atau VBO). Ini berarti bahwa VAO bukanlah objek sebenarnya yang menyimpan data simpul, melainkan deskriptor dari data simpul tersebut. Atribut vertex dapat dijelaskan oleh fungsi glVertexAttribPointer dan dua fungsi kembarnya glVertexAttribIPointer dan glVertexAttribLPointer, yang pertama akan kita bahas di bawah.
Saya tidak mengerti bagaimana VAO mendeskripsikan atribut vertex. Saya belum menjelaskannya dengan cara apa pun. Apakah itu mendapatkan informasi dari glVertexAttribPointer? Saya kira ini pasti itu. Apakah VAO hanyalah tujuan untuk informasi dari glVertexAttribPointer?
Di samping catatan, apakah tutorial yang saya ikuti dapat diterima? Apakah ada hal yang harus saya perhatikan atau tutorial yang lebih baik untuk diikuti?
sumber
glVertexAttribPointer
VertexArrayMacro
atau sesuatu yang serupa.Objek Array Vertex seperti makro dalam program pengolah kata dan sejenisnya. Deskripsi yang bagus ditemukan di sini .
Makro hanya mengingat tindakan yang Anda lakukan, seperti mengaktifkan atribut ini, mengikat buffer itu, dll. Saat Anda memanggil
glBindVertexArray( yourVAOId )
, itu hanya memutar ulang binding pointer atribut dan binding buffer.Jadi panggilan Anda berikutnya untuk menggambar menggunakan apa pun yang terikat oleh VAO.
VAO tidak menyimpan data titik . Tidak. Data vertex disimpan dalam buffer vertex atau dalam array memori klien.
sumber
Saya selalu berpikir tentang VAO sebagai array buffer data yang digunakan oleh OpenGL. Dengan menggunakan OpenGL modern Anda akan membuat Objek VAO dan Vertex Buffer.
Langkah selanjutnya adalah mengikat data ke buffer:
Pada titik ini OpenGL Melihat:
Sekarang kita dapat menggunakan glVertexAttribPointer untuk memberi tahu OpenGL apa yang diwakili oleh data dalam buffer:
OpenGL sekarang memiliki data di buffer dan mengetahui bagaimana data diatur ke dalam simpul. Proses yang sama dapat diterapkan ke koordinat tekstur dll, tetapi untuk koordinat tekstur akan ada dua nilai.
Selanjutnya Anda dapat mengikat tekstur dan menggambar array, Anda akan ingin membuat shader Vert dan Frag, mengkompilasi dan memasangnya ke program (tidak disertakan di sini).
sumber
VAO adalah objek yang merepresentasikan tahap pengambilan vertex dari pipeline OpenGL dan digunakan untuk menyuplai input ke vertex shader.
Anda dapat membuat objek vertex array seperti ini
Pertama mari kita lakukan contoh sederhana. Pertimbangkan parameter input seperti itu dalam kode shader
Untuk mengisi atribut ini bisa kita gunakan
Meskipun objek vertex array menyimpan nilai atribut statis ini untuk Anda, ia dapat melakukan lebih banyak lagi.
Setelah membuat objek vertex array kita bisa mulai mengisi statusnya. Kami akan meminta OpenGL untuk mengisinya secara otomatis menggunakan data yang disimpan di objek buffer yang kami suplai. Setiap atribut vertex dapat mengambil data dari buffer yang terikat ke salah satu dari beberapa ikatan buffer vertex. Untuk tujuan ini kami gunakan
glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)
. Juga kami menggunakanglVertexArrayVertexBuffer()
fungsi untuk mengikat buffer ke salah satu ikatan buffer simpul. Kami menggunakanglVertexArrayAttribFormat()
fungsi untuk mendeskripsikan tata letak dan format data, dan terakhir kami mengaktifkan pengisian otomatis atribut dengan memanggilglEnableVertexAttribArray()
.Saat atribut vertex diaktifkan, OpenGL akan memasukkan data ke shader vertex berdasarkan format dan informasi lokasi yang Anda berikan dengan
glVertexArrayVertexBuffer()
danglVertexArrayAttribFormat()
. Saat atribut dinonaktifkan, shader vertex akan diberikan informasi statis yang Anda berikan dengan panggilanglVertexAttrib*()
.Dan kode di shader
Setelah semua yang Anda butuhkan untuk menelepon
glDeleteVertexArrays(1, &vao)
.Anda dapat membaca OpenGL SuperBible untuk memahaminya dengan lebih baik.
sumber