Kesesuaian kabut tanah menggunakan alpha quads berlapis?


16

Pendekatan berlapis akan menggunakan serangkaian paha besar bertekstur alpha yang disusun sejajar dengan tanah, memotong semua geometri medan, untuk memberikan ilusi kabut tanah cukup efektif dari atas, melihat ke bawah, dan agak kurang efektif ketika di dalam kabut dan melihat ke arah cakrawala (lihat gambar di bawah).

Atau, pendekatan berbasis shader akan menghitung kerapatan sebagai fungsi jarak pandang ke substrat kabut tanah, dan mengeluarkan nilai fragmen berdasarkan itu.

Tanpa harus menguji kinerja masing-masing pendekatan sendiri , saya ingin pertama-tama mendengar pengalaman orang lain (bukan spekulasi!) Tentang dampak kinerja seperti apa yang mungkin dimiliki oleh pendekatan tekstur alfa berlapis. Saya bertanya secara khusus karena dampak overdraw yang sering dikutip (tidak yakin bagaimana tingkat pengisian mengikat sistem desktop rata-rata Anda). Daftar gim yang menggunakan pendekatan ini, khususnya gim yang lebih lama, akan sangat bermanfaat: jika ini dapat digunakan pada peranti keras DX9 / OpenGL2 sebelumnya, kemungkinan akan bekerja dengan baik untuk saya.

Satu pertanyaan besar berkaitan dengan efek semacam ini:

masukkan deskripsi gambar di sini

(Kredit gambar ke Lume of lume.com)

Perhatikan bagaimana gradasi kabut vertikal kontinu / mulus. OTOH, menggunakan lapisan quad bertekstur, saya hanya bisa berasumsi bahwa lapisan akan sangat jelas ketika berjalan melalui mereka - semakin jarang mereka, semakin jelas ini akan menjadi. Ini berbeda dengan di mana pesawat kabut disejajarkan untuk menghadapi pemain setiap frame, di mana kekasaran ini akan jauh kurang jelas.


1
Mengapa Anda ingin menggunakan lapisan alpha quad untuk ini? "Pendekatan berat shader" tidak hanya lebih akurat, tetapi juga tidak diketahui lambat .
Nicol Bolas

1
@StephanvandenHeuvel Tentu, tapi itu kabut berbasis jarak pandang. Tidak kabut tanah-aligned. Benar?
Insinyur

1
@NickWiggill Ya Anda benar.
Stephan van den Heuvel

1
IIRC, Wii memiliki kabut ground-aligned dalam pipeline tetap (semi-). Rupanya glFogCoordekstensi di OpenGL lama juga bisa digunakan . Meskipun kedengarannya terbatas: itu berbasis darat atau berbasis jarak.
Laurent Couvidou

1
Gempa 3 melakukan sesuatu yang mirip dengan ini, menggunakan pendekatan pipa tetap yang bekerja dengan GL1.1. Kekhawatiran besar yang saya miliki adalah bahwa fillrate / overdraw dapat menumpuk dengan buruk, tetapi mungkin layak mengunduh kode sumber Q3 dan meninjau implementasinya; Anda mungkin tidak melakukan hal yang persis sama, tetapi setidaknya itu dapat membantu Anda dalam mengambil keputusan.
Maximus Minimus

Jawaban:


15

Karena Anda sudah meminta pengalaman, ini milik saya.

Kembali pada hari-hari ketika saya memprogram game PS2, pendekatan "layered alpha quads" adalah cara yang sering kami terapkan kabut. Kadang-kadang sebagai kabut tanah, tetapi jauh lebih umum sebagai kabut layar penuh. Dan itu bekerja dengan baik dalam kedua kasus. Jadi ya, itu layak di masa pra-fragmen-shader.

Yah, semacam itu. Masalahnya, seperti yang telah Anda catat, adalah jika Anda ingin kabut halus seperti yang terlihat pada tangkapan layar, Anda memerlukan jumlah alpha quads yang agak tidak masuk akal.

Di PS2, kami biasanya bisa membeli antara tiga dan lima lapisan. Yang pasti memang terlihat seperti "tembok" kabut yang melayang di depan Anda. Lebih dari itu dan laju pengisian mulai membunuh frame rate kami.

Biasanya, paha depan ini akan ditarik pada jarak tetap di depan kamera, sehingga Anda tidak pernah mendapatkan situasi yang Anda sebut, "berjalan melalui" salah satunya. Di sisi lain, dengan menggunakan jarak tetap itu, semua hal lain di dunia dapat melakukannyamelewati pesawat-pesawat saat pemain bergerak, yang merupakan kesalahan grafis yang cukup jelas. Hampir semua orang melakukannya saat itu, tetapi itu tidak akan diterima sekarang (kecuali Anda melakukannya karena alasan gaya). (Pengecualian: beberapa orang menghitung nilai kabut sebagai bagian dari PS2 yang setara dengan vertex shader. Itu bekerja dan jauh lebih cepat, tetapi mengharuskan model Anda sangat di-tesselated. Misalnya, Anda tidak dapat memiliki dinding yang panjang, karena kabut hanya dihitung di sudut-sudut dinding, dan kemudian dioleskan di seluruh permukaan dinding. Dinding itu tampak berkabut penuh jika Anda berdiri tepat di sebelah tengahnya, misalnya, karena itu hanya menguji tingkat kabut pada tingkatnya. titik akhir)

Perhatikan bahwa jika Anda menempatkan quads kabut secara statis di dunia (seperti yang Anda sebutkan sebagai kemungkinan), maka Anda tidak akan bisa mendapatkan tampilan kabut yang sangat halus, seperti pada gambar yang Anda berikan - akan ada tumpang tindih aneh antara paha depan yang berdekatan tergantung pada orientasi pemirsa. Tumpang tindih tersebut dapat muncul sebagai garis atau trapesium (jika paha depan tidak bertekstur) atau sebagai rumpun (jika mereka bertekstur).

Tetapi mari kita asumsikan bahwa kita menggunakan paha depan yang lebar dan menghadap ke layar untuk melakukan kabut tanah ini dan melakukan perhitungan untuk cara membuat kabut yang sangat halus menggunakan metode ini, di tanah datar, dengan kamera yang melihat lurus ke depan - itulah situasi ideal kita . Mari kita asumsikan resolusi HD: 1920x1080, yang menempatkan cakrawala kita di scanline 540. Mari kita juga berasumsi bahwa kita memiliki visibilitas sampai ke cakrawala (yaitu, dengan asumsi bahwa Anda tidak memiliki kabut mencapai opacity penuh sebelum mencapai cakrawala). Dengan satu awal kabut dan satu berhenti di setiap garis pemindaian (untuk mendapatkan kabut halus), kita perlu (540 * 2 ==) 1080 paha kabut. Masing-masing 1080 paha kabut akan mencakup seluruh bentangan horizontal layar,

Mari kita perkirakan rendah, dan katakan bahwa rata-rata, sebuah pesawat kabut akan mencakup sekitar 300 baris piksel. Yang terdekat akan menutupi lebih sedikit, yang terjauh akan mencakup lebih sedikit, baris tengah akan mencakup lebih banyak.

Dengan perkiraan itu, kami mendapatkan (1920x300 ==) 576.000 piksel disentuh oleh rata-rata kabut. Secara total, itu (576.000 * 1080 ==) 622.080.000 piksel telah disentuh secara total untuk keseluruhan efek "kabut halus melalui rendering banyak geometri transparan". Dan jumlah itu akan naik untuk orang yang menjalankan resolusi yang lebih tinggi. Dan terlebih lagi, kita mendapatkan jumlah tes yang sama terhadap z-buffer, dan jumlah operasi campuran pixel yang hampir sama, karena semua lapisan transparan ini saling menggambar berulang-ulang. Itu banyak piksel.

Dan itulah skenario kasus terbaik - Anda akan mendapatkan cakupan layar yang jauh lebih besar dari paha kabut jika pengguna melihat ke bawah atau berjongkok.

Perhatikan bahwa karena kita tumpang tindih 1080 quads, kita mungkin menginginkan nilai alpha sekitar (1,0 / 1080 ~ =) 0,0009 ditetapkan pada masing-masing, sehingga kabut kami mencapai opacity penuh jika Anda melihat semua 1080 quads. (Kita bisa lebih tinggi dari itu, tetapi ini adalah nilai dengan asumsi bahwa kita ingin menyebarkan kisaran sebanyak mungkin). Perhatikan bahwa nilai ini tidak dapat direpresentasikan sebagai komponen alfa dari nilai warna 32-bit (256 * 0,0009 ~ = 0,237 dan akan dibulatkan menjadi 0 jika Anda mencoba). Anda harus memberikan nilai 0,0009 untuk OpenGL sebagai nilai floating point agar ini bisa berfungsi. (Perhatikan juga bahwa Anda tidak akan benar-benar ingin menetapkan nilai yang sama pada masing-masing - sementara kami menetapkan bahwa kami ingin satu quad dimulai dan satu selesai pada setiap garis pemindaian di bawah cakrawala untuk memberi kami kabut halus,

Perhatikan juga bahwa campuran kabut tidak akan bekerja dengan benar menggunakan pendekatan ini, karena mereka akan dengan shader modern - alih-alih mendapatkan satu perhitungan "campuran antara warna objek dasar dan warna kabut menggunakan persentase ini", Anda mendapatkan 1080 perhitungan "perpaduan antara warna sejauh ini dan warna kabut dengan persentase kabut". Yang berarti bahwa kabut akan mempengaruhi benda-benda setelah jatuh logaritmik. (Yaitu, suatu objek yang dipengaruhi oleh 20 paha kabut akan tampak kurang dari dua kali kabut seperti sesuatu yang dipengaruhi oleh 10 paha kabut, karena paha kabut pertama memiliki lebih banyak dampak dalam operasi pencampuran).

Semua itu untuk mengatakan: Silakan gunakan shader fragmen.

Tidak benar-benar. Ini lebih sederhana dan lebih murah dan lebih cepat dan lebih cepat untuk diimplementasikan dan lebih sedikit rawan kesalahan dan memungkinkan Anda kembali untuk benar-benar membuat game Anda dan lebih baik dalam segala cara yang mungkin. Kami benar-benar akan melakukannya kembali di era PS2 jika itu bahkan mungkin samar-samar pada saat itu.


1
+1 untuk jawaban komprehensif berdasarkan pengalaman dunia nyata.
concept3d

3
Satu tahun dan satu bulan yang lalu ketika saya menulis pertanyaan ini, saya masih mau bermain ayam dengan harga isi. Sekarang saya akan memilih tekstur 3D kasar untuk mewakili volume kabut tanah dengan kepadatan yang terus-menerus berubah, katakanlah dengan suara 3D perlin, dan kemudian gunakan ini sebagai dasar untuk efek ruang layar, seperti yang Anda sarankan.
Insinyur
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.