Apa kegunaan utama dari Vertex Buffer Objects?

8

Dari apa yang saya baca, sepertinya VBO murni untuk kinerja.

Saya sedang mengerjakan proyek pembelajaran yang sangat sederhana di lwjgl dan saya hanya mencoba untuk mencari tahu apa fitur yang lebih canggih dari perpustakaan yang harus saya selidiki, dan apa penggunaannya.

Pemahaman saya adalah bahwa VBO memungkinkan seseorang untuk menjaga vertex dalam VRAM sementara mereka saat ini tidak ditarik dalam suatu adegan. Dalam kasus saya, saya hanya menggambar paha depan dan kinerja mungkin bukan masalah sama sekali, tapi saya mencoba untuk mengumpulkan apa yang terjadi di bawah tenda. Jika saya menggambar paha depan secara langsung, saya menggambar dari memori CPU, benar? Juga, jika saya tidak melakukan pengecekan untuk visibilitas, apakah itu berarti saya menyerahkan semua yang ada di "adegan", terlepas dari apakah itu terlihat? Apakah VBO merupakan cara untuk menyimpan objek dan hanya membuat yang dibutuhkan?

sensae
sumber

Jawaban:

10

Catatan Pedantic: Tidak ada hal seperti itu di OpenGL sebagai "Objek Penyangga Vertex." Hanya ada Buffer Objects . Objek buffer hanyalah sebuah array linier dari memori GPU yang dapat Anda alokasikan, isi dengan data, baca dari, dan gunakan dalam berbagai cara. Salah satu hal yang dapat Anda lakukan dengan objek buffer adalah menyimpan data vertex di dalamnya dan menggunakannya sebagai array sumber untuk rendering. Tetapi mereka memiliki beberapa kegunaan lain juga .

Objek penyangga bukan cara untuk menghindari pemusnahan frustum atau konstruksi gaya adegan-grafik lainnya. Saat digunakan untuk data titik, objek penyangga cukup menyimpan data titik. Tanpa mereka, glDrawElements/Arrays/etcpanggilan Anda akan menarik data dari array yang tersimpan di buffer anggota CPU. Saat menggunakan objek buffer untuk rendering, array ditarik sebagai gantinya dari konten objek buffer.

Dari mana data vertex Anda berasal adalah satu - satunya perbedaan antara rendering dengan objek buffer dan rendering tanpa mereka. Jadi tidak ada frustasi pemusnahan. Tidak ada manajemen grafik adegan. Tidak ada. Ini hanya tentang tempat data verteks Anda disimpan.

Nicol Bolas
sumber
1
Saya mungkin akan mengklarifikasi sedikit dan menyebutkan bahwa optimasi nyata yang Anda lakukan dengan menggunakan VBO berkaitan dengan bus antara CPU dan GPU, yang relatif lambat (dan kontroversial). Jika kecepatan bus ini dapat diabaikan, hampir tidak ada perbedaan antara menggunakan VBO dan menggunakan array float sisi-CPU.
notlesh
1
Juga patut dicatat bahwa driver Anda bebas untuk menyimpan objek buffer di mana pun ia mau, termasuk dalam memori CPU.
Maximus Minimus
Selain itu, membangun VBO / VAO dan hanya memanggil drawarrays pada yang (imho) lebih mudah daripada harus mengulang fungsi pipa tetap untuk semua simpul / wajah. Ini seperti memberi tahu kartu grafis "jalankan kotak segitiga ini melalui shader itu" alih-alih "Ambil simpul itu, simpul itu dan itu, dan buat segitiga kecil yang menyenangkan di sana. Sekarang ambil yang berikutnya ...". Oh, tunggu, sekarang aku masuk ke shader lebih dari VBO.
Exilyth
2

Buffer array OpenGL (= apa yang kita sebut VBO) melayani satu tujuan tunggal: Simpan data geometri Anda di dalam memori GPU bukan memori klien, sehingga Anda tidak perlu mengirim ulang setiap frame.

Sesimpel itu :-)

Kos
sumber