Di OpenGL, bagaimana saya bisa menemukan kisaran kedalaman buffer kedalaman?


11

Saya sedang melakukan aplikasi rendering multi-pass GL untuk iOS. Lulus pertama diterjemahkan ke tekstur buffer kedalaman. Lulus kedua menggunakan nilai dalam buffer kedalaman untuk mengontrol penerapan fragmen shader. Saya ingin mengubah skala nilai dalam buffer kedalaman ke sesuatu yang berguna tetapi sebelum saya bisa melakukannya saya perlu mengetahui kisaran nilai kedalaman dari nilai buffer kedalaman. Bagaimana saya melakukan ini?

Jawaban:


10

Kisaran nilai yang ditulis ke buffer kedalaman adalah apa pun yang Anda inginkan. Biasanya mereka berada dalam kisaran 0-ke-1. Nilai aktual yang ditulis ke dalam buffer kedalaman dihitung selama transformasi viewport, berdasarkan pada nilai Z vertex dalam ruang NDC (setelah perspektif dibagi dengan w dalam ruang klip).

Nilai kedalaman NDC (Z, setelah pembagian perspektif oleh W) diskalakan oleh bagian kedalaman dari transformasi viewport (yang membawa koordinat X dan Y Anda ke ruang koordinat yang akan Anda kaitkan dengan piksel di jendela), dan kemudian diskalakan dengan (2^n-1)- Itu dimaksudkan untuk dibaca sebagai "dua pangkat n" - nadalah ketepatan bit buffer kedalaman. Nilai yang dihasilkan ditulis ke buffer kedalaman.

OpenGL membagi definisi transformasi viewport matriks ke glViewport dan glDepthRange panggilan. glDepthRange adalah apa yang mengontrol faktor skala yang bertanggung jawab untuk menentukan rentang kedalaman yang Anda tanyakan. Anda dapat memanggil glGetFloatv dengan GL_DEPTH_RANGEpemilih untuk memulihkan kisaran saat ini. Ini akan memungkinkan Anda untuk menggunakan rentang tanpa mengasumsikan 0-1 (meskipun 99,9% dari waktu, dalam praktiknya, tidak ada yang pernah mengubahnya).

Bacaan lebih lanjut, jika Anda ingin wawasan tentang bagaimana merekonstruksi matematika untuk mengikuti nilai Z sepanjang jalan dari ruang mata ke penyangga kedalaman.


Saya akan memberikan yang ini kepada Josh untuk semua bahan referensi tambahan dan tips tentang planar-ness segitiga. Saya cenderung melakukan peretasan di mana posisi klip dekat / jauh pesawat persis sesuai dengan z-sejauh geometri saya rendering sehingga depthmap memiliki nilai bagus. Apa yang saya rencanakan? Saya ingin membuat efek blur khusus lokasi yang menarik selama pass # 2 berdasarkan apa yang ada di peta kedalaman pass # 1.
dugla

7

Nilai dalam buffer kedalaman selalu berkisar antara 0-1. Nol adalah fragmen yang diberikan berada di kedalaman bidang dekat dan 1 adalah fragmen itu di kedalaman bidang jauh. Dan semuanya di antaranya.

Jika Anda ingin mengetahui kedalaman sebenarnya di ruang dunia, mudah untuk menghitungnya dari buffer kedalaman.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

Dan itulah mengapa Anda menentukan pesawat dekat dan jauh di matri proyeksi Anda, untuk mendapatkan lebih akurat dari buffer kedalaman.

Waspadai perbedaan antara kedalaman dan jarak saat menggunakan nilai buffer kedalaman.


@ notebene. Hampir sampai. Saya ingin menskala ulang kisaran nilai dalam depthbuffer menjadi tepat 0 -> 1. Jadi jika nilai kedalaman min / max yang diberikan adalah 0,25 / .75 yang saya inginkan (depthvalue - .25) / (. 75 - .25). Jadi, apakah ada cara untuk menemukan min / maks dari deepbuffer setelah pass 1 dan menggunakannya untuk skala ulang selama pass 2.
dugla

1
@dugla: karena Anda merender segitiga, yang planar, maka paksa nilai kedalaman minimum dan maksimum akan dikaitkan dengan simpul minimum dan maksimum dalam adegan. Jika Anda tahu keduanya, Anda bisa mentransformasikannya secara manual melalui pipa dan Anda akan tahu nilai minimum dan maksimum yang akan Anda tulis ke buffer kedalaman. Ini mungkin lebih mudah daripada rendering, kemudian membaca kembali seluruh buffer kedalaman dan iterasi.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.