Quaternions (ekstensi bilangan kompleks empat dimensi) dapat digunakan untuk merepresentasikan rotasi dan penskalaan vektor 3D, dan penerapan angka empat pada vektor 3D melibatkan dua perkalian angka empat, sehingga membutuhkan operasi yang lebih sedikit daripada perkalian dengan matriks transformasi yang sesuai. Namun, matriks transformasi linear dan affine sering digunakan sebagai gantinya, terutama dalam kode shader.
Kapan tepat dan disukai (karena kecepatan, stabilitas, dll.) Untuk menggunakan angka empat untuk mewakili penskalaan dan rotasi dalam tiga dimensi, alih-alih matriks transformasi yang sesuai?
transformations
es1024
sumber
sumber
Jawaban:
Saya ingin memulai dengan kesalahpahaman:
GPU modern (NVIDIA cukup lama, dan AMD sejak Southern Islands) tidak mendukung operasi vektor / matriks secara native dalam perangkat keras. Mereka adalah arsitektur vektor dalam arah yang berbeda: setiap komponen vektor (x, y, z) umumnya bernilai 32- atau 64, berisi nilai untuk setiap elemen dalam jalur. Jadi produk 3D dot biasanya bukan instruksi, itu adalah gandakan dan dua gandakan.
Selain itu, menghitung operasi primitif seperti multiply-add, mengubah vektor dengan angka empat lebih mahal daripada mengubah vektor dengan matriks. Mengubah vektor dengan matriks 3x3 adalah 3 kali lipat dan 6 kali lipat, dan mentransformasikan vektor dengan angka empat adalah dua kali lipat angka empat, yang masing-masing terdiri dari 4 kali lipat dan 12 kali lipat menambahkan. (Anda bisa mendapatkan lebih sedikit naif dari ini — ini adalah penulisan pada cara yang lebih cepat — tapi itu masih tidak semurah mengalikan vektor dengan matriks.)
Namun, kinerja tidak selalu ditentukan hanya dengan menghitung jumlah operasi ALU yang dilakukannya. Kuasi membutuhkan lebih sedikit ruang daripada matriks yang setara (dengan asumsi Anda hanya melakukan rotasi / skala murni), dan itu berarti lebih sedikit ruang penyimpanan dan lalu lintas memori yang lebih sedikit. Ini sering penting dalam animasi (yang juga nyaman sering di mana sifat interpolasi yang bagus dari angka empat muncul).
Selain itu:
sumber
DP3
instruksi GPU ARBfp tampaknya diimplementasikan sebagai 3 kali lipat dan 2 tambahan, lihatINTEL_DEBUG=fs
output dari driver Intel Linux: paste.ubuntu.com/23150494 . Tidak yakin apakah itu hanya driver yang buruk atau HW benar-benar tidak memiliki petunjuk mul vektor khusus.(Banyak informasi di sini aku tanpa malu meminjam dari jawaban joojaa dan ratchet freak, dengan beberapa catatan milikku sendiri.)
Keuntungan Matriks
Keuntungan Quaternion
Jika Anda tahu Anda hanya akan melakukan transformasi tubuh kaku yang seragam, pasangan vektor / quat biasanya merupakan kemenangan solid pada matriks 3x4 dalam hal ruang penyimpanan (vektor / quat: 7 atau 8 float vs mat3x4: 12 floats) dan kecepatan pemrosesan. Jika Quaternions masih voodoo mistis bagimu, coba seri web ini pada mereka .
sumber
Matriks menawarkan lebih banyak kemungkinan transformasi daripada angka empat, dimungkinkan untuk memiringkan, membuat cermin, dan tidak menskalakan matriks secara seragam. Tidak ada yang menyatakan Anda tidak dapat membuat mesin Anda melakukan hanya transformasi berbasis angka empat, jika Anda tidak memerlukan fitur transformasi tambahan.
Matriks hanya sangat nyaman ketika Anda perlu membangun ruang di mana Anda tahu vektor basis. Seperti ketika melakukan proyeksi ke dalam ortografi. Melakukan transformasi perspektif dalam ruang matriks juga mudah. Matriks lebih unggul dalam hal memproyeksikan barang.
Matriks biasanya digunakan karena mereka mewakili denominasi yang paling umum dan tidak terlalu rumit untuk dikuasai dan dipahami. Manfaat standardisasi jauh melebihi manfaat yang Anda peroleh dari alur kerja kustom. Sudah terkenal bagaimana melakukan operasi matriks. Padahal quats bukan sesuatu yang paling bisa langsung diperkenalkan di uni. Tanyakan saja berapa banyak yang tahu bagaimana membalik angka empat, sedangkan Anda tidak menemukan banyak siswa di pendidikan tinggi yang tidak tahu bagaimana membalikkan matriks.
Perhatikan bahwa kartu grafis juga memiliki pipa khusus untuk operasi matriks.
sumber
Angka empat hanya dapat mewakili penskalaan dan rotasi yang seragam sehingga jika Anda membutuhkan hal lain, Anda perlu menambahkan sesuatu untuk mewakili hal itu.
Penerjemahan dapat dilakukan dengan vec3 tambahan tunggal (atau menggunakan angka empat ganda ). Namun scaling dan sheering yang tidak seragam diwakili lebih baik oleh mat4. Transformasi proyeksi (pada dasarnya penskalaan dan swapping yang tidak seragam z dan w) tidak dapat diwakili oleh angka empat.
Kuota memiliki keuntungan besar saat menginterpolasi. Slerp paling mudah dihitung menggunakan angka empat.
Menerapkan angka empat (atau angka empat ganda) tidak dibangun ke dalam GPU sehingga Anda perlu mengimplementasikannya menggunakan operasi vektor. Sebagian besar pustaka angka empat berasumsi bahwa Anda tidak akan menggunakan angka empat untuk mewakili skala sehingga itu sesuatu yang harus diwaspadai.
sumber