Kapan menggunakan array vertex dan kapan menggunakan VBO?


14

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?


3
Untuk siapa pun yang tiba di sini, lihat jawaban yang paling banyak dipilih di sini .... stackoverflow.com/questions/430555/…
afuzzyllama

Jawaban:


14

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).


2
Dalam PerformanceTuning.pdf itu, dikatakan bahwa VBO "Dapat merusak kinerja dalam kasus-kasus yang tidak optimal" ... tetapi tidak menguraikan. Adakah yang tahu kasus-kasus itu? Saya punya kasus di mana saya perlu memperbarui geometri setiap frame, jadi saya bertanya-tanya apakah array vertex akan lebih baik atau lebih buruk daripada VBO dalam kasus itu. Terima kasih.
sidewinderguy

1
baca opengl.org/sdk/docs/man/xhtml/glDrawElements.xml dan opengl.org/wiki/GlDrawElements - Array Vertex TIDAK ditinggalkan atau dihapus, mereka masih didukung pada OpenGL 4.x; luruskan fakta Anda, sobat, karena apa yang Anda sebarkan hanyalah informasi yang salah

1
@vaxquis Array sudut sisi klien sudah tidak digunakan lagi. Array sisi server tidak. VAO adalah hal yang berbeda dan dimaksudkan untuk menyelamatkan negara. Tidak ada yang salah di pos, meskipun bisa lebih akurat jika menyatakan sisi klien. Tapi saya kira itu tersirat.
concept3d

1
"Array vertex sisi klien sudah tidak digunakan lagi. Array vertex sisi server tidak." "Array Vertex Ini tersedia di OpenGL sebelum 3.0, ditinggalkan dalam 3.0, dan pergi dalam 3.1+." "Anda dapat menentukan sebelumnya array simpul (...) dan menggunakannya untuk membangun urutan primitif dengan satu panggilan ke glDrawElements. Inti dalam versi 4.4" - Saya melihat kontradiksi dalam pernyataan ini.

2
Plus, sebelum mengatakan sesuatu "sudah usang", tentukan sumber pernyataan seperti itu, sebaiknya dalam dokumen resmi. Menunjuk dari StackExchange ke StackOverflow sebagai bukti BUKAN cara sains bekerja, dan bertahan dengan "Saya kira itu tersirat" bukanlah argumen. Tidak ada yang bertanya tentang array klien / server, pertanyaannya adalah tentang array vertex dalam arti luas, dibandingkan dengan VBO. Btw, saya belum mengatakan apa-apa tentang VAO, dari mana ide itu?

11

(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+ glBufferDatauntuk 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 melakukan glBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)render.


+1 VAO adalah nama yang mengerikan dan membingungkan, dan selalu mengingatkan saya tentang apa yang telah menjadi kekacauan OpenGL.
concept3d

1
Saya juga ingat pergi dengan diskusi tentang pertanyaan ini (sebagian besar telah dihapus). Sekali lagi masalahnya adalah dengan terminologi mengerikan OpenGL. Saya juga mengedit jawaban Chris agar lebih akurat.
concept3d
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.