Saya mencoba mempelajari tentang array verteks dan objek buffer verteks , tetapi saya tidak mengerti perbedaan dalam hal:
- case-of-use (geometri statis seperti medan, geometri yang mengubah setiap bingkai seperti sistem partikel, dll.)
- kinerja
- portabilitas (kartu grafis lama, konsol, perangkat seperti Android atau iPhone, dll.)
beberapa klarifikasi?
Jawaban:
Berikut ini adalah artikel yang layak tentang VBO.
Performa
Berikut ini adalah ikhtisar yang baik dari semantik panggilan.
Di sini di sini adalah gambaran umum yang baik dari masalah kinerja; di dalamnya kita melihat bahwa VBO lebih berkinerja daripada array.
Alasan kami lebih suka VBO adalah karena data dimuat ke kartu, sehingga Anda tidak perlu mentransfernya setiap frame. Bergantung pada jenis VBO yang dibuat, Anda dapat memberikan petunjuk driver grafis pada penggunaannya (tulis-banyak, baca-banyak vs banyak-tulis, jangan-baca, dll).
Pemakaian
VBO sangat bagus untuk geometri statis seperti medan yang tidak Anda harapkan berubah, atau untuk geometri yang dipasang.
Array Vertex baik untuk data yang sering berubah tetapi juga dibaca oleh mesin host - jadi, untuk merender data secara langsung yang sedang dimanipulasi (buffer data pengintai laser, misalnya, adalah tempat saya sering menggunakannya). Jika Anda dapat pergi dengan tidak pernah membaca data pada perangkat host (jadi, hanya mendorongnya ke kartu), VBO dalam mode tulis-saja adalah pilihan yang baik.
Portabilitas
Array Vertex Sisi Klien Ini tersedia di OpenGL sebelum 3.0, usang dalam 3.0, dan pergi dalam 3.1+. OpenGL ES mendukung mereka (OpenGL ES 2 tidak).
VBO Ini tersedia setelah OpenGL 1.5. Ini adalah satu-satunya cara untuk menyimpan data geometri di OpenGL ES 2 (dan sebagainya, WebGL).
sumber
(Saya menambahkan ini di sini karena fakta bahwa jawaban ChrisE sangat ambigu, yang sayangnya disebabkan oleh ambiguitas pertanyaan awal. Namun saya akan menganggap pertanyaan OP seharusnya berjudul "kapan harus menggunakan VAOs dan kapan harus menggunakan VBO ".)
V ertex B uffer O bjects (yang benar-benar tidak berbeda dari jenis lain dari B uffer O bjects, misalnya U niform B uffer O bjects) menyediakan sarana untuk meng-upload data vertex ke hardware grafis.
V ertex A RRay O bjects digunakan selain untuk VBO dalam rangka meningkatkan sisi klien (CPU-side) kinerja, dengan mengurangi jumlah panggilan yang diperlukan untuk rebind vertex buffer individu dan re-set vertex atribut setiap kali Anda ingin ubah menjadi render dengan cara tertentu. Alih-alih melakukan semua yang bekerja pada setiap frame, Anda melakukannya sekali (saat inisialisasi), dan kemudian cukup memutar ulang VAO yang sesuai untuk setiap (set) panggilan gambar yang menggunakan atribut vertex terkait.
Meskipun demikian, menggunakan VAO tidak membebaskan Anda dari tanggung jawab tambahan karena harus melakukan
glBindBuffer
+glBufferData
untuk data apa pun yang mengubah setiap frame, misalnya, posisi entitas permainan / rotasi / transformasi matriks. Hanya ketika Anda memiliki data yang sepenuhnya statis, Anda hanya perlu melakukanglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
render.sumber