Jika Anda melakukan gambar perspektif dan model Anda memiliki persimpangan implisit maka, jika Anda menggunakan "linear Z", persimpangan tersebut akan muncul di tempat yang salah.
Sebagai contoh, pertimbangkan pesawat darat sederhana dengan garis kutub telepon, mundur ke kejauhan, yang menembus tanah (dan terus di bawah). Persimpangan implisit akan ditentukan oleh nilai kedalaman interpolasi. Jika itu tidak diinterpolasi dengan 1/Z
, maka ketika simpul yang diproyeksikan telah dihitung dengan perspektif, gambar akan terlihat salah.
Saya minta maaf untuk kualitas non-estetika dari ilustrasi berikut tetapi saya melakukannya pada tahun '97.
Gambar pertama menunjukkan efek rendering yang diperlukan. (Perhatikan bahwa "tiang" biru pergi cukup jauh di bawah bidang tanah sehingga terpotong di bagian bawah gambar)
Gambar kedua ini menunjukkan hasil menggunakan buffer kedalaman non-resiprokal: (Permintaan maaf untuk perubahan skala - ini disalin dari dokumen MS Word lama dan saya tidak tahu apa yang terjadi dengan penskalaan.)
Seperti yang Anda lihat, hasilnya salah.
Pada catatan lain, apakah Anda benar - benar menginginkan representasi Z linier? Jika Anda memberikan perspektif, tentu seseorang ingin lebih presisi lebih dekat ke kamera daripada di kejauhan?
Re komentar Anda nanti:
"Jika itu tidak diinterpolasi dengan 1 / Z" itu saya tidak mengerti. Interpolasi apa itu?
Hal pertama yang perlu diperhatikan adalah bahwa, dengan proyeksi perspektif standar, garis lurus di ruang dunia tetap garis lurus di ruang perspektif. Jarak / panjang, bagaimanapun, tidak dipertahankan.
Untuk kesederhanaan, mari kita asumsikan transformasi perspektif sepele digunakan untuk memproyeksikan simpul, yaitu
XSc r e e n=XWo r l dZWo r l d
YSc r e e n=YWo r l dZWo r l d
Kita juga harus menghitung kedalaman ruang-layar timbal balik, misalnyaZSc r e e n=1ZWo r l d
tetapi linear Z di buffer kedalaman akan, bagi saya, memerlukan sesuatu seperti: ZSc re e n= s c a l e ∗ZWo r l d
(Kita dapat mengasumsikan di sini bahwa skala = 1)
Mari kita asumsikan kita memiliki garis dengan titik akhir ruang angkasa dunia⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢200010⎤⎦⎥
Dengan perspektif memetakan peta ini untuk menyaring koordinat ruang
⎡⎣⎢001⎤⎦⎥a n d⎡⎣⎢2000,1⎤⎦⎥
Sistem render / perangkat keras akan menginterpolasi ruang layar z secara linier, jadi pada titik 1/2 arah garis, seperti yang muncul di layar, yaitu pada piksel (10, 0), kita akan mendapatkan proyeksi (terbalik) Z nilai 0,55, yang sesuai dengan nilai ruang dunia Z nilai ~ 1,818. Mengingat nilai Z awal dan akhir, ini adalah sekitar 20% sepanjang garis.
Jika sebaliknya, kami mencoba interpolasi menggunakan nilai Z asli, kami akan berakhir dengan Z yang sesuai dengan nilai ruang dunia 5.5. Selama tidak ada yang berpotongan, Anda mungkin baik-baik saja (saya belum memikirkannya dengan saksama) tetapi apa pun dengan persimpangan implisit akan salah.
Apa yang saya tidak sebutkan adalah bahwa sekali Anda memperkenalkan perspektif benar texturing (atau bahkan perspektif benar shading), Anda harus melakukan interpolasi pixel per 1 / w dan, selain itu, juga menghitung, per pixel, kebalikan dari nilai interpolasi tersebut.
far / z
, yang merupakan standar, tidak masuk akal. Ini menghasilkan buffer kedalaman yang menjadi lebih linier semakin dekat dua pesawat klip satu sama lain. Tampaknya seperti penggabungan dua konsep: layar ruang-linier Z, dan pemetaan buffer kedalaman yang tidak konstan untuk peretasan kinerja.(x, y, z) / w
per-fragmen, tetapi tampaknya, alih-alih, kita harus berurusan dengan versi interpolasi linear dari(x/w, y/w, z/w)
? Itu tampaknya tidak masuk akal bagi saya pada tahun 2018, tetapi akan lebih baik untuk mengetahui jika itu adalah hack yang harus kita jalani sekarang juga!Menggunakan Z / W untuk buffer kedalaman berjalan lebih dalam daripada hanya menempel pada pesawat dekat dan jauh. Seperti Simon singgung, ini ada hubungannya dengan interpolasi antara simpul-simpul segitiga, selama rasterisasi.
Z / W adalah opsi unik yang memungkinkan nilai kedalaman NDC dihitung dengan benar untuk titik-titik di bagian dalam segitiga, dengan secara sederhana menginterpolasi nilai kedalaman NDC dari simpul, di ruang layar . Pada prinsipnya, kita bisa menggunakan fungsi apa pun yang kita suka untuk memetakan ruang kamera Z ke nilai buffer kedalaman — tetapi pilihan lain selain Z / W akan membutuhkan matematika yang lebih rumit untuk dilakukan per piksel, yang akan lebih lambat, dan lebih sulit untuk membangun perangkat keras.
Perhatikan bahwa jika Anda menggunakan buffer kedalaman linier, maka tentu saja nilai kedalaman interpolasi linier akan benar di ruang dunia ... tetapi tidak, secara umum, di ruang layar! Dan itu adalah ruang layar yang penting untuk rasterisasi, karena kita harus dapat menghasilkan nilai kedalaman perspektif-benar (dan nilai atribut lainnya, seperti UV) untuk setiap pusat piksel, atau titik sampel lainnya, dalam batas-batas ruang layar dari suatu segitiga dirasterisasi.
sumber