Jawaban yang paling benar adalah, itu tergantung pada bagaimana Anda memprogramnya, tetapi ini adalah hal yang baik untuk dikhawatirkan. Sementara GPU telah menjadi sangat cepat, bandwidth ke dan dari RAM GPU tidak, dan akan menjadi hambatan Anda yang paling membuat frustrasi.
Apakah datanya dikirim ke memori GPU hanya sekali dan duduk di sana selamanya?
Semoga saja iya. Untuk kecepatan rendering, Anda ingin sebanyak mungkin data disimpan di GPU, alih-alih mengirim ulang setiap frame. VBO melayani tujuan yang tepat ini. Ada VBO statis dan dinamis, yang pertama terbaik untuk model statis, dan yang terakhir terbaik untuk model yang simpulnya akan mengubah setiap frame (katakanlah, sistem partikel). Bahkan ketika datang ke VBO dinamis, Anda tidak ingin mengirim ulang semua simpul setiap frame; hanya yang berubah.
Dalam kasus bangunan Anda, data titik hanya akan duduk di sana, dan satu-satunya hal yang berubah adalah matriks Anda (model / dunia, proyeksi, dan tampilan).
Dalam kasus sistem partikel, saya membuat VBO dinamis yang cukup besar untuk menyimpan jumlah maksimum partikel yang pernah ada untuk sistem itu. Setiap frame saya mengirim data untuk partikel yang dipancarkan frame itu, bersama dengan beberapa seragam, dan itu saja. Ketika saya menggambar, saya bisa menentukan titik awal dan akhir di VBO itu, jadi saya tidak perlu menghapus data partikel. Saya hanya bisa mengatakan jangan menggambar itu.
Ketika model benar-benar dirender setiap frame, apakah prosesor GPU harus mengambil datanya setiap kali dari memori GPU? Yang saya maksud adalah - jika saya memiliki 2 model yang dirender beberapa kali masing-masing - apakah penting jika saya pertama kali merender yang pertama beberapa kali dan kemudian yang kedua beberapa kali atau jika saya merender yang pertama hanya sekali, yang kedua hanya sekali dan terus menyisipkannya seperti itu?
Tindakan mengirim beberapa panggilan undian alih-alih hanya satu adalah batas yang jauh lebih besar. Lihat render yang dipasang; mungkin banyak membantu Anda dan membuat jawaban untuk pertanyaan ini tidak berguna. Saya punya beberapa masalah driver dengan itu yang saya belum berhasil, tetapi jika Anda bisa membuatnya bekerja, maka masalah terpecahkan.
Jelas kartu grafis memiliki RAM terbatas - ketika itu tidak dapat menampung semua data model yang diperlukan untuk rendering 1 frame. Saya kira itu terus mengambil (sebagian) dari RAM CPU setiap frame, apakah itu benar?
Anda tidak ingin kehabisan RAM GPU. Jika Anda melakukannya, maka ubah hal-hal yang tidak Anda lakukan. Dalam skenario yang sangat hipotetis bahwa Anda benar-benar kehabisan, itu mungkin akan crash entah bagaimana, tetapi saya belum pernah melihat itu terjadi jadi saya jujur tidak tahu.
Saya lupa membuat satu perbedaan: ada yang mengirim data ke GPU dan ada pengaturan / pengikatan buffer seperti saat ini. Apakah yang terakhir menyebabkan aliran data?
Tidak ada aliran data yang signifikan, tidak. Ada beberapa biaya untuk itu, tetapi itu berlaku untuk setiap baris kode yang Anda tulis. Mencari tahu berapa biaya Anda, sekali lagi, untuk apa membuat profil.
pembuatan buffer dengan inisialisasi
Jawaban Raxvan terdengar bagus, tetapi itu tidak cukup akurat. Di OpenGL, membuat buffer tidak menyimpan ruang apa pun. Jika Anda ingin memesan ruang tanpa melewatkan data apa pun, Anda dapat memanggil glBufferData dan hanya memberikan nol. (Lihat bagian catatan di sini .)
pembaruan data buffer
Saya kira maksud Anda glBufferData, atau fungsi lain seperti itu, kan? Di sinilah transfer data nyata terjadi. (Kecuali Anda lulus nol, seperti yang saya katakan di paragraf terakhir.)
mengikat buffer sebagai aktif (apakah itu hanya cara untuk memberitahu API bahwa saya ingin buffer ini di-render dalam draw call berikutnya dan tidak melakukan apa-apa dengan sendirinya?)
Ya, tetapi bisa melakukan sedikit lebih dari itu. Sebagai contoh, jika Anda mengikat VAO (objek array verteks), kemudian mengikat VBO, VBO itu terikat ke VAO. Kemudian, jika Anda mengikat VAO itu lagi, dan memanggil glDrawArrays, ia akan tahu VBO apa yang harus digambar.
Perhatikan bahwa sementara banyak tutorial membuat Anda membuat VAO untuk setiap VBO, saya telah diberitahu bahwa ini bukan tujuan penggunaannya. Seharusnya Anda membuat satu VAO dan menggunakannya dengan setiap VBO yang memiliki atribut yang sama. Saya belum mencoba ini, jadi saya tidak bisa mengatakan dengan pasti apakah ini lebih baik atau lebih buruk.
Panggilan draw API
Apa yang terjadi di sini cukup mudah (dari sudut pandang kami). Katakanlah Anda mengikat VAO, lalu panggil glDrawArrays. Anda menentukan titik awal, dan jumlah, dan itu menjalankan vertex shader Anda untuk setiap vertex dalam rentang itu, yang pada gilirannya melewati outputnya ke bawah garis. Seluruh proses itu adalah esai lain.