Saya membaca jawabannya di sini:
Apa yang dilakukan kartu grafis dengan elemen keempat vektor sebagai posisi akhir?
"Komponen keempat adalah trik untuk melacak proyeksi perspektif. Ketika Anda melakukan proyeksi perspektif, Anda ingin membaginya dengan z: x '= x / z, y' = y / z, tetapi ini bukan operasi yang dapat diimplementasikan oleh matriks 3x3 yang beroperasi pada vektor x, y, z. Trik yang telah menjadi standar untuk melakukan ini adalah menambahkan koordinat keempat, w, dan menyatakan bahwa x, y, z akan selalu dibagi dengan w setelah semua transformasi diterapkan dan sebelum rasterisasi. "
tapi saya tidak mengerti mengapa kita tidak bisa membaginya dengan z menggunakan matriks 3x3?
tidak bisakah kita gandakan saja
1/z 0 0
0 1/z 0
0 0 1/z
mendapatkan [x/z y/z 1]
?
matrix
transformation
projection-matrix
Komunitas
sumber
sumber
Jawaban:
Karena jika Anda hanya membagi
[x, y, z]
denganz
Anda[x/z, y/z, 1]
dan Anda kehilangan nilai aktualz
, yang sebenarnya berguna jika Anda ingin melakukan dekat / jauh pesawat kliping atau mengisi Z-buffer.Cara terbaik untuk menyimpan beberapa informasi
z
, setidaknya pada GPU, adalah dengan menggunakan 4 komponen, bukan 3. Dalam praktiknya, apa yang sebenarnya ada dalam dua komponen vektor terakhir sebelum pembagian perspektif tergantung pada jenis proyeksi dan efek yang Anda miliki. ingin.Misalnya, dalam kasus proyeksi perspektif, ini adalah vektor 4-komponen yang dihasilkan:
Setelah perspektif membagi vektor menjadi:
Dan
c + d/z
bagian itu memberi kita cukup informasi untuk mengisi buffer Z.sumber
Secara teknis, Anda bisa melakukannya. Tapi kenapa repot-repot? Pada saat Anda memiliki final itu
z
, Anda dapat:9 * sizeof(float)
ruang, habiskan siklus untuk menghitung1/z
(satu divisi) dan kemudian lakukan sembilan kali lipat dan enam tambah untuk mendapatkan titik akhir Anda, atauSalah satunya tampaknya jauh lebih optimal bagi saya, dan itu bukan yang pertama. Bahkan jika perangkat keras yang dioptimalkan ada untuk perkalian matriks, seperti yang pasti terjadi, itu masih secara konsep lebih kompleks daripada divisi sederhana.
Plus, matriks 3x3 tidak bisa mengkodekan terjemahan, dan matriks 4x4 (dan dengan demikian keempat
w
koordinat) digunakan sebelumnya dalam pipa pula . Ini berarti Anda sudah memiliki komponen keempat yang duduk di sana sehingga Anda dapat menggunakannya untuk mengangkut nilai yang berguna dan melakukan pembagian Anda dengannya.sumber