Ini adalah bagian pertama dari seri “Demystifying the PVS”.

  1. Portal dan Gempa
  2. Visibilitas dasar yang kasar
  3. Visibilitas halus melalui kliping
  4. 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 🙂

Denah lantai contoh kita menunjukkan tingkat dengan tiga portal yang ditempatkan dengan tangan. Sel memiliki warna portal masuknya. Dalam hal ini juga sel tempat kamera berada terlihat.

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.

Seperti inilah tampilan tiga portal dalam game. Bukaan portal ditampilkan sebagai poligon berwarna dan kotak pembatas ruang layarnya berwarna putih. Objek memiliki kotak pembatas putus-putus. Objek bintang dimusnahkan karena tidak tumpang tindih dengan portal merah.

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!

Peta pertama Quake dilihat di editor peta TrenchBroom dengan portal berwarna merah. Seperti yang Anda lihat, bukan hanya pintu yang berfungsi sebagai 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:

Contoh peta dibagi menjadi daun cembung. Warna daun acak.

Portal muncul di antara dedaunan, seperti yang diharapkan:

Portal ditempatkan secara otomatis oleh alat bsp. Peta ini cukup banyak 2D tetapi semua yang dibahas juga berfungsi dengan baik dalam 3D. Indeks daun ditampilkan dalam warna putih.

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:

  1. Visibilitas dasar. Perkirakan visibilitas kasar dari daun ke portal.
  2. Visibilitas penuh. Sempurnakan hasil kasar melalui kliping portal.
  3. 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:

Daun (node) dihubungkan oleh portal (tepi) dalam grafik sel dan 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:

Setiap portal disimpan sebagai poligon cembung.

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:

Setiap portal masukan dibagi menjadi portal maju (merah) dan mundur (kuning) sebelum diproses. Ada celah kecil di sini untuk tujuan demonstrasi tetapi sebenarnya celah tersebut tumpang tindih. Panah menunjukkan arah portal dapat dilihat.

Oleh karena itu, grafik sekarang akan memiliki tepi berarah:

Setiap portal diwakili oleh dua sisi pada grafik. Tepi portal maju dan mundur sebelumnya masing-masing disorot dengan warna merah dan emas.

Grafik dalam kode

Sekarang saatnya menyajikan struktur data utama vis.pyitu Pintu gerbang Dan Daun kelas:

bagian selanjutnya kita akan menggunakan grafik untuk beberapa pemeriksaan cepat.


Saya juga berpikir untuk menulis buku. Daftar di sini jika Anda tertarik.

Sumber

Krystian Wiśniewski
Krystian Wiśniewski is a dedicated Sports Reporter and Editor with a degree in Sports Journalism from He graduated with a degree in Journalism from the University of Warsaw. Bringing over 14 years of international reporting experience, Krystian has covered major sports events across Europe, Asia, and the United States of America. Known for his dynamic storytelling and in-depth analysis, he is passionate about capturing the excitement of sports for global audiences and currently leads sports coverage and editorial projects at Agen BRILink dan BRI.