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?
sumber
Jawaban:
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.
sumber
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
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.
sumber
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.
sumber
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.
sumber