Apakah masih ada keuntungan menggunakan gl_quads?


10

OK, saya mengerti bahwa gl_quads sudah usang, dan dengan demikian kita tidak 'seharusnya' menggunakannya lagi. Saya juga mengerti bahwa PC modern saat menjalankan game menggunakan gl_quads sebenarnya menggambar dua segitiga.

Sekarang, saya sudah mendengar karena itu permainan seharusnya ditulis menggunakan segitiga sebagai gantinya. Tapi saya bertanya-tanya apakah, karena secara spesifik bagaimana OpenGL membuat quad menjadi dua segitiga, apakah masih menguntungkan untuk menggunakan quads?

Secara khusus, saat ini saya sedang membuat banyak paha yang tidak terhubung dari objek buffer yang agak besar. Salah satu area yang harus saya perhatikan adalah seberapa besar vektor float yang saya gunakan untuk membuat / memperbarui objek buffer ini (saya punya beberapa nilai float tambahan per vertex, dan banyak simpul dalam buffer - the buffer terbesar sekitar 500KB).

Jadi saya tersadar bahwa jika saya mengubah objek buffer saya untuk menggambar segitiga data vertex ini akan menjadi 50% lebih besar (enam simpul untuk menggambar persegi daripada 4), dan membutuhkan waktu 50% lebih lama untuk CPU untuk menghasilkan.

Jika gl_quads masih berfungsi, apakah saya mendapatkan manfaat di sini, atau apakah 50% memori tambahan dan waktu CPU masih digunakan pada konversi otomatis OpenGL menjadi dua segitiga?


5
Saya yakin OpenGL mendukung semacam buffer vertex yang diindeks, artinya Anda hanya menyimpan 4 simpul yang sama untuk sebuah quad, dan alih-alih mengulangi seluruh simpul untuk membuat dua segitiga, Anda hanya mengulangi indeks: [0,1,2] , [

Jawaban yang bagus di sini
bobobobo

Saya percaya bahwa spesifikasi GL masih menetapkan beberapa kasus di mana menggambar sebagai masalah quad, misalnya dengan glPolygonMode (..., GL_LINE).
Maximus Minimus

Jawaban:


5

Uji permainan Anda yang sebenarnya. Jika paha depan lebih cepat, gunakan itu. Jika tidak, jangan.

Seseorang dapat beralasan bahwa mereka lebih lambat dalam beberapa kasus karena beberapa perangkat keras tidak mendukung paha depan, sehingga pengemudi harus melakukan banyak pekerjaan untuk "memperbaiki" panggilan quad draw. Beberapa perangkat keras tidak mendukung paha depan, melakukan pemisahan hingga segitiga dalam beberapa langkah perakitan input fungsi-tetap, sehingga bekerja tanpa overhead yang signifikan. Ada juga pertanyaan tentang bagaimana paha depan diajukan diindeks vs non-diindeks, saat Anda menaikkannya, dan yang membuat penggunaan bandwidth transfer bus dan waktu pembuatan CPU yang lebih baik menjadi lebih baik. Kebijaksanaan rakyat mengatakan untuk menghindari paha depan, yang merupakan nasihat yang baik jika Anda mulai dari nol, mungkin tidak terlalu banyak jika kode Anda sudah berfungsi. kebijaksanaan rakyat mengatakan bahwa banyak hal membunuh kinerja meskipun permainan nyata dan berkinerja baik melakukan hal-hal itu.

Singkatnya, tes. Jangan berasumsi, dan jangan meminta saran kinerja dari Internet. Kami mungkin benar kadang-kadang tetapi lebih sering kami akan memberi Anda data yang sudah ketinggalan zaman, data berdasarkan beberapa keadaan tertentu yang tidak Anda hadapi, atau benar-benar sampah yang kami peroleh sendiri dari Internet atau kolega (yang sendiri mungkin tidak memiliki pengalaman langsung).


3

Apa alternatifnya? Nah, salah satu alternatif adalah menggunakan Geometry Shaders , melewatkan GL_LINES_ADJACENCYprimitif (4 simpul) dan meminta GS mengubah primitif ini menjadi strip segitiga. Namun, itu akan menjadi lebih lambat untuk di-render, karena kita harus mengasumsikan geometri shader selalu lebih lambat untuk di-render.

Metode yang lebih baik adalah dengan menggunakan rendering yang diindeks. Di sini, Anda memiliki dua alternatif: GL_TRIANGLESdan GL_TRIANGLE_STRIPdengan memulai ulang primitif. Yang terakhir akan menghasilkan buffer indeks yang sedikit lebih pendek (satu indeks untuk setiap quad). Anda dapat menggunakan kembali buffer indeks yang sama untuk rendering quad apa pun, sehingga Anda tidak perlu memperbarui atau memodifikasi buffer indeks.

Saya juga menyarankan menggunakan celana pendek tanpa tanda tangan sebagai tipe indeks. Jika Anda perlu membuat lebih dari 16384 quads sekaligus, maka buat beberapa panggilan rendering, menggunakan glDrawElementsBaseVertex untuk mengimbangi indeks.


Beberapa benchmark baru-baru ini saya lakukan menunjukkan glMultiDrawArrays untuk sekarang menjadi jalur cepat pada NV dan AMD (tidak repot dengan Intel) jadi ada pilihan lain - glMultiDrawArays dengan kipas atau strip.
Maximus Minimus

@ mh01: Ini membutuhkan larik sisi klien dari perintah menggambar. Anda harus glMultiDrawArraysIndirectmelakukannya dari sisi GPU. Yang dapat Anda lakukan, tetapi membatasi perangkat keras.
Nicol Bolas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.