Ini adalah bagian pertama dari seri “Demystifying the PVS”.
- Portal dan Gempa
- Visibilitas dasar yang kasar
- Visibilitas halus melalui kliping
- Aliran portal menyatukan semuanya (untuk dipublikasikan)
Pernah ingin tahu bagaimana tepatnya cara kerja visibilitas Quake yang telah dihitung sebelumnya? Ya, jadi saya menulis vis.pyimplementasi ulang algoritma mereka dengan Python. Panduan ini memiliki semua informasi yang perlu Anda pahami berhadapanalat yang digunakan oleh game Quake, Half-Life, dan Source Engine.
Selama pengembangan Quake, penarikan berlebih menjadi sebuah kekhawatiran. Artinya piksel yang sama ditulis berkali-kali selama rendering bingkai. Hanya warna terakhir yang tetap terlihat dan tulisan sebelumnya terbuang sia-sia. Ini buruk jika game Anda dirender secara perangkat lunak dan sudah mendorong PC pertengahan 90-an hingga batas kemampuannya.
Bagaimana cara mengurangi overdraw? Mari kita mulai dengan gambaran umum tingkat tinggi mengenai lanskap solusi.
Pemusnahan portal membantu penarikan berlebihan
Dalam game 3D, merupakan ide bagus untuk mengurangi jumlah objek yang digambar.
Sepotong pemusnahan adalah salah satu metode mendasar untuk ini, di mana objek yang dipastikan berada di luar tampilan kamera virtual dilewati selama rendering. Hal ini dapat dilakukan misalnya dengan kotak pembatas objek atau bola pembatas.
Pemusnahan frustum masih menyisakan beberapa kinerja di atas meja. Banyak objek yang mungkin masih berada dalam bidang pandang kamera meskipun objek tersebut tidak menyumbangkan piksel apa pun pada gambar akhir. Ini bukan sebuah bencana kinerja jika semuanya dilakukan dari depan ke belakang. Pengujian awal-z GPU akan membantu di sini. Namun, di dunia yang besar, akan lebih cepat jika kita tidak pernah mengirimkan objek-objek ini untuk dirender.
Pemusnahan oklusi adalah proses di mana Anda membuang objek yang Anda anggap berada di belakang objek lain dalam adegan tersebut. Tujuannya adalah untuk membuang sebanyak mungkin tersumbat objek semaksimal mungkin. Ini tidak sepenuhnya diperlukan, karena Anda akan mendapatkan gambar yang benar berkat z-buffer. Ada beberapa cara untuk melakukan ini seperti z-buffer hierarki, kueri oklusi, pemusnahan portal, dan kumpulan yang berpotensi terlihat (PVS). Pada artikel ini saya berbicara tentang dua yang terakhir: portal dan PVS.
Dalam pemusnahan portal, dunia dibagi menjadi ruang-ruang tempat kamera virtual dapat bergerak dan bukaan di antara ruang-ruang tersebut. Spasi-spasi tersebut disebut sel, sel tampilan, zona, cluster atau sektordan bukaannya portal. Ini adalah pemisahan yang berguna terutama pada model arsitektur dengan ruangan-ruangan yang dipisahkan dengan rapi dan dihubungkan melalui pintu atau jendela. Ini juga berfungsi untuk sebagian besar level video game dalam ruangan 🙂
Render portal dimulai dari sel kamera. Game ini merender semua yang ada di dalam sel itu, dan kemudian secara rekursif melihat portal yang menjauhi sel pertama tersebut untuk mencari tahu apa lagi yang harus digambar. Itu merender semua objek di setiap sel dan kemudian memeriksa portal sel. Jika portal tidak sejajar dengan portal lainnya di layar, portal tersebut tidak akan dikunjungi. Setiap portal berturut-turut mengecilkan area layar yang terlihat semakin kecil hingga seluruh portal terpotong.
Cara mudah untuk menguji visibilitas portal adalah dengan memotong kotak pembatas ruang layarnya. Itu ditunjukkan dengan warna putih pada gambar di bawah. Jika dua kotak pembatas saling tumpang tindih, kita dapat melihat melalui portal masing-masing. Pengujian yang lebih akurat dapat dilakukan dengan kliping 3D atau operasi per piksel.
Mesin Quake menggunakan portal tetapi hanya selama waktu persiapan peta. Saat runtime, portal tidak terlihat. Teknik ini merupakan varian dari metode PVS Seth Teller yang disajikan dalam disertasinya tahun 1992 yang hanya bekerja dengan dinding sejajar sumbu.
Portal peta Quake menghilang
Seringkali portal ditempatkan dengan tangan oleh seorang desainer tingkat. gempa bsp alat kompilasi peta menempatkan portal secara otomatis, dan itu bagus, tapi sayangnya alat ini menghasilkan banyak portal!
Anda lihat, di Quake selnya sangat kecil. Namun tidak ada portal yang diuji saat runtime. Sebaliknya, setiap sel mendapat daftar sel lain yang telah dihitung sebelumnya yang dapat dilihat dari sel tersebut. Ini adalah Kumpulan yang Mungkin Terlihat (PVS) untuk sel itu.
Di Quake, sel adalah ruang dengan volume cembung kecil, jadi satu ruangan biasanya akan dipecah menjadi beberapa sel. Sel-sel ini sesuai dengan daun pohon pemartisi ruang biner (BSP). Pohon BSP digunakan untuk membagi peta menjadi sel dan portal. Bagi kami, metode pastinya tidak relevan. Namun BSP memudahkan untuk menemukan sel tempat kamera berada saat runtime.
Karena kita sekarang telah memasuki wilayah Gempa dalam diskusi kita, saya akan mulai memanggil sel a daun. Leaf adalah istilah yang digunakan di semua kode sumber, editor level, pesan kesalahan, dan sumber daya lainnya di Quake. Maknanya tetap sama, hanya sel cembung yang terhubung ke sel lain melalui portal. Beginilah tampilan daun pada level contoh kita:
Portal muncul di antara dedaunan, seperti yang diharapkan:
Tidak ada yang bisa menghentikan mereka untuk mengelompokkan banyak daun untuk membentuk sel yang lebih besar dengan lebih sedikit portal di antaranya. Faktanya, inilah yang mereka lakukan untuk Quake 2 dengan “kelompok” dedaunannya.
Dengan kelompok daun yang lebih besar, Anda akan mendapatkan lebih banyak penarikan berlebih. Selain itu, kumpulan daun yang cembung mungkin tidak lagi cembung. Namun meskipun demikian, Anda masih dapat bertindak seolah-olah masih ada, dan berasumsi bahwa portal di dalamnya dapat dilihat dari mana saja di dalam cluster. Ini kurang akurat tetapi berhasil.
Tinjauan tingkat tinggi tentang vis
Alat peta gempa berhadapan mengambil portal yang dihasilkan oleh alat lain, bspmenghitung terlebih dahulu matriks visibilitas daun-ke-daun, dan menulis matriks kembali ke file peta yang dikompilasi. Seri artikel ini menjelaskan caranya berhadapan fungsi.
Kita tahu bahwa dedaunan hanya dapat melihat satu sama lain melalui portal. Jadi kita bahkan tidak perlu mengetahui seperti apa sebenarnya bentuk daunnya, hanya bagaimana daun-daun tersebut saling terhubung.
Pada tingkat paling dasar, berhadapan melakukan dua traversal depth-first secara rekursif, diikuti dengan penyelesaian cepat sebelum menulis hasil visibilitas kembali ke file peta yang dikompilasi. Tiga langkah:
- Visibilitas dasar. Perkirakan visibilitas kasar dari daun ke portal.
- Visibilitas penuh. Sempurnakan hasil kasar melalui kliping portal.
- Menyelesaikan. Gabungkan hasil halus dari portal ke daun hingga visibilitas akhir dari daun ke daun.
Untuk gambaran visual singkat, saya dapat merekomendasikan Matthew Earl’s video bagus di PVS Quake.
Portal memiliki arah
Dalam sistem portal, sel dan portal disusun sebagai grafik sel dan portal. Perkakas peta Quake mengikuti pola ini dan menghubungkan dedaunan dengan portal, meskipun struktur ini tidak ada pada waktu proses. Daun dihubungkan oleh portal:
Setiap portal adalah poligon 3D. Mereka ditulis oleh bsp ke file teks biasa dengan kode versi, jumlah daun dan portal, diikuti oleh satu portal per baris. Seperti ini:
PRT1
11
12
4 0 1 (880 -224 -8 ) (880 -272 -8 ) (880 -272 72 ) (880 -224 72 )
4 1 2 (832 -224 -8 ) (832 -272 -8 ) (832 -272 72 ) (832 -224 72 )
4 2 4 (768 -272 -8 ) (768 -320 -8 ) (768 -320 72 ) (768 -272 72 )
4 2 3 (768 -112 72 ) (768 -112 -8 ) (768 -160 -8 ) (768 -160 72 )
4 3 5 (720 -112 72 ) (720 -112 -8 ) (720 -160 -8 ) (720 -160 72 )
4 4 5 (720 -272 -8 ) (720 -320 -8 ) (720 -320 72 ) (720 -272 72 )
4 5 6 (640 -224 -8 ) (640 -288 -8 ) (640 -288 72 ) (640 -224 72 )
4 6 7 (592 -224 -8 ) (592 -288 -8 ) (592 -288 72 ) (592 -224 72 )
4 7 10 (384 -304 -8 ) (384 -368 -8 ) (384 -368 72 ) (384 -304 72 )
4 7 8 (384 -112 -8 ) (384 -176 -8 ) (384 -176 72 ) (384 -112 72 )
4 8 9 (240 -176 -8 ) (336 -176 -8 ) (336 -176 72 ) (240 -176 72 )
4 9 10 (240 -304 -8 ) (336 -304 -8 ) (336 -304 72 ) (240 -304 72 )
Setiap portal adalah lingkaran titik 3D:
┌ the number of points
│
▽ x y z x y z x y z x y z
4 0 1 (880 -224 -8 ) (880 -272 -8 ) (880 -272 72 ) (880 -224 72 )
△ △
└─┴─ the two leaves the portal is in between
Karena portal adalah antarmuka antara daun cembung, poligonnya juga cembung. Dalam 3D, portal terlihat seperti ini:
Secara konseptual, setiap portal merupakan bukaan dua arah. Anda dapat melihatnya di kedua arah. Namun, akan lebih mudah untuk membuat portal diarahkan. Dengan cara ini kita dapat melacak apa yang terlihat dari berbagai arah. Kami memberi setiap portal vektor normal, arah portal dapat dilihat.
Sekarang portal masukan tunggal menjadi dua portal terarah:
Oleh karena itu, grafik sekarang akan memiliki tepi berarah:
Grafik dalam kode
Sekarang saatnya menyajikan struktur data utama vis.pyitu Pintu gerbang Dan Daun kelas:
class Portal:
list(np.ndarray) # polygon's 3D points
winding: int # the leaf this portal leads to
leaf: # plane normal points to destination leaf
plane: Plane # (other class attributes omitted)
...
class Leaf:
list(int) # indices of portals leading away from this leaf portals:
Perhatikan bahwa daun hanya menyimpan indeks portal memimpin pergi dari daun itu. Grafik disimpan dalam dua array global yang disebut portal Dan daun-daun dengan objek dari tipe masing-masing. Karena grafik diakses melalui indeks dan referensi objek langsung, saya membuat konvensi penamaan berikut:
pi
adalah indeks portal,Pi
adalah objek sebenarnyaPi = portals(pi)
Danli
adalah indeks daun,Li
adalah objek sebenarnyaLi = leaves(li)
.
Tujuan kami adalah menghitung node mana yang dapat menjangkau satu sama lain dalam grafik ini sambil tetap menghormati hubungan visibilitas 3D antar portal yang terkait dengan setiap edge. Tapi apa sebenarnya “hubungan visibilitas” itu?
Di dalam bagian selanjutnya kita akan menggunakan grafik untuk beberapa pemeriksaan cepat.
Saya juga berpikir untuk menulis buku. Daftar di sini jika Anda tertarik.