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.