Saya baru memulai dengan OpenGL, dan saya mencoba menggunakannya untuk membuat game 2D. Dalam permainan ini, saya memiliki kisi heksagonal yang terdiri dari berbagai macam heksagon berwarna sangat besar. Sebagai programmer OpenGL pemula, saya melihat dua cara menggambar kotak ini:
- Menggunakan vertex buffer dengan data untuk hexagon tunggal, kemudian menggunakan nilai offset yang seragam dan mengulangi pada CPU untuk menggambar program yang sama berkali-kali sampai saya memiliki grid.
- Membuat buffer vertex tunggal yang sangat besar yang dihitung sebelumnya yang menarik semua segi enam dalam satu panggilan.
Apa metode yang paling efisien? Apakah ada cara yang lebih baik untuk melakukan ini?
Jawaban:
Memang ada beberapa cara untuk membuat kotak seperti itu.
Cara yang paling efisien adalah memasang. Dengan cara ini Anda membuat segi enam Anda hanya sekali dalam VBO, dan membuat ini seratus, seribu atau sejuta kali. Anda dapat melakukannya secara manual menggunakan shader dengan seragam seperti yang Anda katakan pada poin 1, tetapi ada juga fungsionalitas OpenGL bawaan untuk itu. Untuk itu, lihatlah glDrawElementsInstanced .
Perhatikan bahwa instance hanya lebih cepat daripada metode lain jika Anda menggambar lebih dari jumlah objek instances tertentu. Misalnya menggambar 300 bisa lebih cepat menggunakan 1 VBO besar, tetapi menggambar 2 juta bisa lebih cepat jika Anda menggunakan render instan.
Jika Anda menggunakan render instan, Anda dapat mengirim data per-objek menggunakan Pembagi Atribut . Dalam kasus Anda, Anda ingin mengirim posisi dan warnanya.
Tutorial yang bagus tentang render yang dipasang: klik
Benar-benar cara terbaik adalah dengan mencoba kedua metode, dan periksa jumlah milidetik yang diperlukan untuk menggambar 1 bingkai. Dengan cara ini Anda juga mempelajari kedua cara, yang selalu baik.
Perhatikan juga bahwa rendering yang dipasang adalah fungsi OpenGL modern, dan Anda harus menggunakan shader untuk menggunakannya. Tetapi selalu terbaik untuk mempelajarinya dengan cara yang benar sejak awal.
sumber
Metode 1 lebih mudah dikodekan dan akan baik-baik saja selama Anda tidak memiliki terlalu banyak segi enam sekaligus. Anda mungkin ingin tetap menggunakan ini karena Anda baru menggunakan OpenGL, untuk menghindari terlalu banyak kerumitan pada piring Anda sekaligus.
Jika ada sejumlah besar segi enam (seperti beberapa ratus atau lebih dari seribu) yang dilihat sekaligus, metode overhead yang lebih rendah akan diperlukan untuk menghindari overhead CPU dalam melakukan begitu banyak undian individu. Metode 2 akan bekerja untuk ini, atau bahkan lebih baik, gunakan instancing. Saya berharap instancing lebih cepat daripada metode 2, atau tentu saja tidak lebih buruk, karena Anda hanya perlu memperbarui buffer data per-instance daripada buffer (jauh lebih besar) dari data vertex untuk semua instance.
sumber