Mengapa kita membutuhkan koordinat keempat untuk dibagi dengan z?

12

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]

?

Komunitas
sumber
Cobalah untuk mengekspresikan transformasi (atau komposisi transformasi) yang mencakup terjemahan di suatu tempat di rantai. Tanpa nilai aw, Anda tidak dapat mengekspresikannya dalam satu matriks.
DMGregory
Saya mengerti bagian terjemahan tetapi saya tidak mengerti bagaimana menambahkan koordinat keempat akan membantu atau merupakan trik untuk dibagi oleh z
Untuk apa nilainya Anda benar-benar dapat melakukan apa yang Anda katakan. Membagi x dan y oleh z adalah metode yang valid untuk mengkonversi dari koordinat 3d ke ruang layar 2d dengan proyeksi di mana objek yang jauh menjadi lebih kecil. W adalah koordinat homogen untuk membawanya ke dimensi keempat untuk dapat melakukan terjemahan.
Alan Wolfe

Jawaban:

14

Karena jika Anda hanya membagi [x, y, z]dengan zAnda [x/z, y/z, 1]dan Anda kehilangan nilai aktual z, 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:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

Setelah perspektif membagi vektor menjadi:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

Dan c + d/zbagian itu memberi kita cukup informasi untuk mengisi buffer Z.

sam hocevar
sumber
Anda hanya bisa membagi X dan Y dengan Z, menghasilkan [x / z, y / z, z]. GPU tidak harus melakukan pembagian vektor, itu bisa dirancang untuk melakukan perhitungan apa pun.
user253751
3

Secara teknis, Anda bisa melakukannya. Tapi kenapa repot-repot? Pada saat Anda memiliki final itu z, Anda dapat:

  • buat matriks 3x3 seperti yang Anda gambarkan, buang-buang 9 * sizeof(float)ruang, habiskan siklus untuk menghitung 1/z(satu divisi) dan kemudian lakukan sembilan kali lipat dan enam tambah untuk mendapatkan titik akhir Anda, atau
  • Anda dapat melakukan tiga divisi, seperti pipa modern saat ini

Salah 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 wkoordinat) 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