Saya ingin menggambar sejumlah besar (ribuan) jerat sederhana (masing-masing mungkin ... maksimal 50 segitiga, tetapi bahkan itu adalah batas atas yang sangat besar), yang semuanya persis sama.
Sebagai cara brute force yang sederhana, saat ini saya hanya melakukan ribuan panggilan draw, di mana saya hanya mengubah matriks transformasi yang dibutuhkan oleh shader dan kemudian menggambar objek yang sama lagi.
Tentu saja ini sangat lambat, karena (saya menduga) ada terlalu banyak panggilan untuk pengemudi dan PC saya untuk menangani secara efisien.
Apa yang bisa saya lakukan untuk membuatnya lebih cepat?
Jawaban:
Solusi untuk ini adalah pemasangan. Tutorial ini menjelaskan beberapa metode pemasangan. Jika sudah
ARB_draw_instanced
danARB_instanced_arrays
, gunakan.Gagasan umum adalah untuk menyimpan semua transformasi jerat Anda dalam objek buffer terpisah dan mengikatnya ke array atribut yang menggunakan satu "titik" per instance via
glVertexAttribDivisor
.Jika, setelah itu, Anda masih tidak berlari secepat yang Anda inginkan, Anda mungkin terikat prosesor vertex. Lakukan pemusnahan frustasi pada jerat, dan lebih baik buat BVH untuk dilintasi daripada melakukan pemusnahan pada semua jerat secara independen.
sumber
glVertexAttribDivisor
(yang tidak usang atau ketinggalan zaman dengan cara apa pun) memiliki manfaat tidak memiliki batas atas pada jumlah instance. Kinerja secara historis lebih baik daripada buffer seragam, tetapi mungkin sama atau sangat mirip sekarang, dan kedua cara menyelesaikan pekerjaan.