Instance geometri dalam OpenGL ES 2.0

12

Saya berencana untuk melakukan instance geometri di OpenGL ES 2.0. Pada dasarnya saya berencana untuk membuat geometri yang sama (kursi) mungkin 1000 kali dalam adegan saya.

Apa cara terbaik untuk melakukan ini di OpenGL ES 2.0?

Saya mempertimbangkan untuk meneruskan tampilan model mat4 sebagai atribut. Karena atribut adalah per data titik saya harus melewati mat4 yang sama ini, tiga kali untuk setiap simpul dari segitiga yang sama (karena modelview tetap konstan melintasi simpul segitiga).

Itu akan berarti banyak data tambahan yang dikirim ke GPU (2 simpul tambahan * 16 float * (Jumlah segitiga) jumlah data tambahan).

Atau haruskah saya mengirim mat4 hanya sekali per segitiga? Tetapi bagaimana mungkin menggunakan atribut karena atribut didefinisikan sebagai data "per titik"?

Apa cara terbaik dan efisien untuk melakukan instancing di OpenGL ES 2.0?

kuda laut
sumber
3
Saya sangat merindukan glVertexAttribDivisor:(
Will

Jawaban:

9

ES2 tidak memiliki tekstur glVertexAttribDivisor atau floating point sehingga pilihan Anda sangat terbatas.

Pasti menempatkan model kursi Anda ke VBO jika Anda belum melakukannya. Dari sana Anda kurang lebih dibatasi untuk panggilan undian individual - satu per kursi - jadi ini adalah pertanyaan untuk mendapatkan matriks transformasi untuk setiap kursi ke GPU seefisien mungkin.

Anda bisa melakukan ini dengan panggilan glUniform biasa, atau Anda bisa menyalahgunakan beberapa slot attrib vertex tambahan dan membuat beberapa panggilan glVertexAttrib (catatan: bukan glVertexAttribPointer) sebelum menggambar setiap kursi, menentukan matriks menggunakan 4 slot tersebut, dan nilai-nilai ini akan "menempel" untuk setiap simpul berikutnya di kursi. Itu bisa menjadi jalur yang cukup cepat pada beberapa perangkat keras tetapi lebih lambat pada perangkat lain sehingga Anda harus bereksperimen.

Jika kursi Anda tidak berputar satu hal lain yang dapat Anda lakukan adalah hanya mengirim posisi ke shader Anda dan membangun matriks transformasi baru dengan cepat di sana. Kedengarannya mengerikan tetapi sebenarnya sangat cepat (hanya menetapkan 3 mengapung) dan mungkin melakukan pekerjaan.

Secara keseluruhan, dan dengan asumsi bahwa Anda bertujuan untuk platform seluler yang khas, saya berpikir bahwa apa pun yang Anda lakukan, menarik panggilan akan membunuh Anda.

Maximus Minimus
sumber
6

Taruhan terbaik Anda adalah menggunakan pendekatan instancing yang sangat mirip dengan model kulit. Buat VBO yang akan menampung banyak salinan kursi Anda, semuanya identik. Sekarang, setiap simpul harus memiliki atribut byte yang akan menahan indeks ke matriks transformasi yang akan diterapkan padanya. Kirim berbagai matriks ke shader Anda dan gunakan sebagai transformasi dunia dari setiap kursi Anda. Dengan cara ini, Anda dapat menggambar di setiap panggilan sebanyak kursi sebagai ukuran maksimum dari parameter array, tanpa harus menulis ulang data dalam VBO.

r2d2rigo
sumber
3

Wolfire Games memiliki posting blog yang sangat baik tentang pemasangan objek cepat . Apa yang mereka lakukan adalah merender model beberapa kali, tetapi mengirim matriks yang berbeda untuk setiap objek ke slot yang seragam.

Ini adalah cara yang cukup efisien untuk membuat instance sejumlah besar objek, karena Anda hanya perlu mengirim data satu kali (hambatan terbesar ketika merender sejumlah objek akan selalu menjadi bandwidth) dan kemudian mengubah model dalam shader.

knight666
sumber
+1 Pokoknya, saya masih tidak yakin bahwa merujuk teks Nvidia juga berlaku untuk chip PVR seluler. Terutama tentang penyebutan mereka tentang bagian pengemudi . http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil
1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

Ini adalah Google Talk di WebGL, yang merupakan OpenGL ES untuk JavaScript, yang berarti tidak ada geometri juga. Mungkin memberi Anda ide, meskipun sulit untuk mengatakan karena saya tidak tahu apakah kemacetan Anda ada di GPU atau CPU.

Meskipun, Anda harus belajar tentang variabel seragam, sama sekali tidak perlu mengirim mat4 dalam atribut, semua simpul kursi Anda akan diubah oleh matriks yang sama, Anda harus mengirimkannya hanya sekali per model, bukan per segitiga. Variabel seragam memungkinkan Anda melakukan itu, mereka adalah jenis variabel khusus yang dapat Anda atur di program shader itu sendiri.

dreta
sumber