Tumpukan matriks OpenGL vs Penggandaan tangan

8

Yang lebih efisien menggunakan tumpukan transformasi OpenGL atau menerapkan transformasi dengan tangan.

Saya sering mendengar bahwa Anda harus meminimalkan jumlah transisi status dalam pipa grafis Anda. Mendorong dan muncul matriks terjemahan tampak seperti perubahan besar. Namun, saya bertanya-tanya apakah kartu grafis mungkin dapat lebih dari menebus cegukan pipa dengan menggunakan perangkat keras paralelnya untuk mengalikan simpul.

Kasus spesifik saya. Saya telah mengubah font menjadi sprite sheet. Koordinat setiap karakter atau string dihitung dan ditambahkan ke vertex buffer. Sekarang saya harus memindahkan string itu. Apakah akan lebih baik untuk beralih melalui buffer vertex dan menyesuaikan masing-masing simpul dengan tangan atau sementara mendorong matriks terjemahan baru?

deft_code
sumber
Tergantung versi GL yang Anda targetkan. Mereka ditinggalkan dalam 3.x dan seterusnya.
Bebek Komunis

Jawaban:

7

Ini pemahaman saya bahwa dalam versi terbaru dari spec (3.3 dan 4.x) tumpukan matriks hilang dan Anda perlu melacak matriks transformasi Anda dengan tangan. Saya percaya ini mungkin berlaku untuk spesifikasi seluler (ES) juga.

Jika Anda mencari cara yang konsisten untuk menangani matriks Anda dengan tangan, Anda mungkin tertarik dengan GLM . Ini adalah perpustakaan matematika yang cukup rapi (yang mencakup transformasi matriks) dimodelkan setelah spesifikasi GLSL sehingga Anda hanya perlu menyimpan satu set rutin matematika di kepala Anda ketika berhadapan dengan kode OpenGL.

Bob Somers
sumber
Adakah yang bisa mengkonfirmasi ini? Saya belajar pemrograman grafik dengan OpenGL 1.5 dan berpikir saya sudah maju karena saya sedang bereksperimen dengan beberapa fitur 2.0. Anda mungkin mengatakan saya sedikit keluar dari lingkaran. Kehilangan dukungan untuk matrik terjemahan tampaknya sangat merugikan.
deft_code
1
Baru diperiksa dua kali. Ya, tumpukan matriks sudah usang dalam 3.0 - 3.2, dan dihapus dalam 3.3 dan 4.x. Idenya adalah bahwa karena seluruh pipa telah terprogram Anda hanya akan melewati matriks akhir Anda ke shader Anda dan pergi dari sana. Tidak ada yang menghentikan Anda untuk tetap menggunakan OpenGL 2.0. Semua fungsi tumpukan matriks yang Anda gunakan akan tetap ada.
Bob Somers
Perhatikan bahwa itu tidak berarti "dukungan untuk matriks terjemahan" dijatuhkan, @deft_code. Matriks terjemahan hanyalah sekumpulan nilai floating point tertentu, Anda dapat membuatnya sendiri secara sepele. Ini lebih di bidang "aljabar linier" daripada akses ke pipa grafis, sungguh - perhatikan bahwa D3D tidak memiliki fungsi analog juga (mereka berada di perpustakaan utilitas terpisah, D3DX).
1
Tambahan sedikit: GLES 1.x adalah analog fungsi tetap dari OpenGL 1.5 (ish) dan termasuk tekstur, modelview dan tumpukan proyeksi. GLES 2.x adalah tertanam OpenGL sepenuhnya diprogram dan tidak termasuk operasi matriks sama sekali, atau salah satu dari sisa pipa fungsi tetap. Jadi di GLSL juga tidak ada gl_Vertex / Normal / Color / etc. Bagaimana Anda mengirimkan informasi ke program shader sepenuhnya terserah Anda.
Tommy
3

Tumpukan adalah pilihan yang kurang optimal di sini - bukan karena mendorong dan mengeluarkannya mahal, karena seharusnya tidak pernah menyebabkan perubahan tingkat tingkat driver yang kompleks (matriks tidak boleh dikirim ke kartu sampai perintah render dikeluarkan , jadi itu semua manipulasi sisi-CPU di API, biasanya).

Masalah dengan stack adalah ia memiliki batas seberapa jauh Anda bisa mendorongnya - ini adalah salah satu parameter yang bisa Anda dapatkan melalui glGet * Saya pikir. Tidak ada keuntungan besar untuk menggunakan stack kecuali Anda tidak memiliki atau tidak mampu / tidak ingin menulis matematika matriks. Saya akan merekomendasikan melakukannya sendiri.

Saya tidak tahu bagaimana fungsi stack di GL modern. Saya percaya mereka sudah usang / dihapus juga, tapi saya belum punya kebutuhan untuk benar-benar menggunakan GL sementara jadi saya belum menyimpan informasi terbaru.


sumber
3

Seperti orang lain telah mencatat, tumpukan matriks sedang keluar, yang merupakan alasan bagus untuk menyelidiki alternatif.

Pada salah satu proyek saya, saya menggunakan ops matriks OpenGL untuk menghitung matriks saya, tetapi akhirnya harus menggunakan fungsi glGet untuk mengambil kembali matriks sehingga saya dapat melakukan beberapa operasi pada matriks yang fungsi OpenGL sendiri tidak mendukung. Performanya sangat buruk, dan saya melacak hilangnya fungsi glGet tunggal. Ada kemungkinan bahwa operasi matriks sebenarnya dilakukan pada GPU entah bagaimana, dan menggunakan glGet menyebabkan flush pipeline, atau sesuatu.

Apa pun alasannya, saya mengganti operasi matriks dengan CML , perpustakaan matematika yang dapat dikonfigurasi, dan kinerjanya meningkat secara dramatis. Tidak hanya saya tidak lagi terikat pada metrik kinerja operasi matriks OpenGL, CML juga menyertakan banyak operasi yang tidak didukung OpenGL.

Dan menerapkan tumpukan matriks cukup mudah menggunakan vektor STL atau semacamnya.

Jari Komppa
sumber
2

Saya tidak yakin dengan tingkat pengalaman Anda, tetapi saya akan merekomendasikan melakukannya dengan tangan. Mungkin perlu upaya lebih untuk mempelajari cara melakukan ini, tetapi sangat bermanfaat untuk mengetahui apa yang dilakukan matriks Anda dan untuk dapat memanipulasinya sendiri. Ini juga akan membuat Anda lebih sadar akan masalah yang mungkin muncul saat menerapkan matriks dalam pesanan yang berbeda (mis. Penskalaan kemudian memutar). Saya tahu saya menghabiskan banyak waktu untuk mencari tahu "bug" yang aneh sebelum memutuskan waktu saya akan lebih baik dihabiskan untuk mempelajari apa yang sedang dilakukan setiap operasi. Ini layak investasi.

Mengatasi masalah spesifik Anda, menerapkan transformasi pada simpul tampaknya merupakan cara termudah, cukup perhatikan urutan operasi matriks.

kaunartist
sumber
1

Masalah utama yang saya lihat adalah bahwa Anda perlu mengakses hasil untuk tugas-tugas gim lain dan mengakses hasilnya bisa rumit dan lambat.

Itulah mengapa saya lebih suka melakukan operasi matriks itu sendiri.

bcsanches
sumber