Bagaimana bingkai DOOM Ethernal ditampilkan





pengantar



Doom Eternal tidak memerlukan pengenalan terpisah: ini adalah penerus langsung Doom 2016, dikembangkan berkat iterasi ketujuh dari id Tech, mesin internal id Software. Pada suatu waktu, saya dikejutkan oleh kualitas tinggi komponen visual Doom 2016, serta kesederhanaan dan keanggunan solusi teknis. Dalam hal ini, Doom Eternal melampaui pendahulunya di banyak bidang, dan beberapa di antaranya layak untuk diuraikan secara mendetail. Pada artikel analitik ini saya akan mencoba membahas semuanya.



Analisis saya terinspirasi oleh Adrian Courrèges keras tentang Doom 2016 ( terjemahan). Menurut saya, karya-karya tersebut memberikan gambaran sekilas tentang pendekatan untuk memecahkan beberapa masalah rendering proyek AAA dan dengan demikian menjadi bahan pengajaran yang sangat baik. Dalam analisis ini, saya berencana untuk membahas fitur-fitur umum dan tidak terlalu mendalami seluk-beluk setiap metode render dan pass. Selain itu, beberapa bagian di Doom Eternal hampir identik dengan rekan-rekan mereka di Doom 2016 dan telah dibongkar dalam karya Adrian Courrèges, jadi saya bisa melewatkannya.



Saya ingin menandai dengan cara khusus pengajaran yang ketatsifat artikel saat ini. Saya sama sekali tidak mendukung rekayasa balik produk untuk tujuan pencurian kekayaan intelektual atau niat jahat lainnya. Jika Anda belum memainkan Doom Eternal, Anda tidak perlu khawatir: Saya hanya membahas permulaan game, jadi Anda tidak berada dalam bahaya spoiler.



Jadi mari kita mulai.



Dengan dirilisnya id Tech 7, transisi mesin dari OpenGL ke Vulkan API memungkinkan pengembang untuk bekerja lebih efektif dengan fitur-fitur GPU generasi saat ini, seperti sumber daya tanpa ikatan.



Satu bingkai di Doom Eternal







Di atas, kita bisa melihat bagian dari game ini mendekati permulaan: interior dengan beberapa lawan dan pencahayaan volumetrik. Dengan analogi dengan pendahulunya, proses rendering di Doom Eternal bertanggung jawab atas rendering langsung , tetapi jika Doom 2016 dipaksa untuk melakukan render bersama dengan G-buffering pada permukaan reflektif, dalam kasus kami buffer tidak digunakan dan rendering mengambil alih semua tugas.



Menjauh dari megatextures



Dengan dirilisnya game Rage, yang dibuat dengan engine id Tech 5, dunia berkenalan dengan konsep implementasi tekstur yang disebut "mega tekstur". Metode ini digunakan di Doom 2016 dan untuk setiap frame membuat apa yang disebut "tekstur virtual" dengan informasi tentang tekstur yang terlihat. Tekstur virtual dianalisis di bingkai berikutnya untuk menentukan tekstur mana yang harus dimuat dari disk. Namun, megatekstur memiliki masalah yang jelas: segera setelah tekstur memasuki bidang pandang, sudah terlambat untuk memuatnya, sehingga tekstur tampak kabur dalam beberapa bingkai pertama setelah muncul. Dengan dirilisnya id Tech 7, para pengembang meninggalkan metode ini.



Menguliti melalui GPU



Biasanya, bahkan sebelum merender tekstur dan bayangan apa pun, shader vertex mengevaluasi skinning tersebut. Skinning id Tech 7 dilakukan sebelumnya oleh shader komputasi dengan menulis simpul akhir ke buffer. Berkat pendekatan ini, shader vertex tidak lagi membutuhkan data skinning, dan karena tidak lagi dilakukan pada setiap geometry pass, akibatnya, shader swaps lebih jarang terjadi.



Perbedaan utama antara skinning di compute shader dan vertex shader adalah menulis hasilnya ke buffer perantara. Seperti halnya vertex shader, untuk setiap simpul, utas shader komputasi menerima transformasi dari setiap tulang yang mempengaruhi simpul. Kemudian ia mengubah posisi puncak dengan setiap transformasi tulang dan menjumlahkan semua posisi baru sesuai dengan berat kulit yang disimpan di simpul. Hasilnya, vertex shader dapat menggunakan hasil dari buffer untuk menafsirkannya sebagai mesh statis.



Tautan ini menyediakan artikel bagus tentang Compute Shader Skinning oleh János Turánszki.



Juga berguna untuk dicatat bahwa Doom Eternal menggunakan jenis cache yang menarik - Cache Alembicsebanding dengan video yang dapat diputar mundur dengan sangat terkompresi. Cache ini menyimpan animasi yang dipanggang untuk diterbitkan dan diperluas selama eksekusi program. Mengutip analisis teknis Digital Foundry , Alembic Cache diterapkan ke berbagai animasi, dari adegan sinematik skala besar hingga tentakel kecil di lantai. Pendekatan ini sangat cocok untuk animasi dengan kompleksitas implementasi melalui animasi skin, misalnya, untuk simulasi organik dan jaringan. Jika Anda tertarik dengan teknologi ini, saya sarankan Anda melihat presentasi Axel Gneiting di Siggraph 2014 .



Peta bayangan



Langkah selanjutnya adalah rendering bayangan, dan pada pandangan pertama, id Tech 7 dan pendahulunya tidak memiliki pendekatan yang berbeda untuk menghasilkan peta mereka.



Seperti yang Anda lihat di bawah, bayangan ditampilkan menjadi tekstur besar dengan kedalaman 24 bit dan ukuran 4096 x 8196 piksel, dengan kualitas yang bervariasi di beberapa tempat. Teksturnya tidak berubah antar frame, dan menurut presentasi "Devil is in the Details" di Siggraph 2016, geometri statis di-cache dalam shadowmap untuk menghindari penggambaran ulang untuk setiap frame. Idenya sendiri sederhana: kita tidak perlu memperbarui bayangan sampai ada pergerakan di depan sumber cahaya, dan dengan demikian kita dapat mendeklarasikan peta bayangan "cache": peta biasa dengan geometri statis, karena kita berasumsi bahwa geometri tidak berubah ... Jika objek dinamis bergerak dalam view cone, peta bayangan "cache" disalin ke yang utama, dan geometri dinamis digambar ulang di atasnya. Pendekatan ini memungkinkan untuk tidak menggambar ulang seluruh pemandangan dalam kerucut tampilan setiap kali diperbarui. Biasanya, jika cahayanya bergeser, seluruh pemandangan harus digambar ulang dari awal.



Untuk memperhalus tepi bayangan saat mengambil sampel peta, pengambilan sampel PCF 3x3 digunakan. Karena sinar matahari biasanya menutupi sebagian besar lingkungan, peta bayangan berjenjang digunakan untuk mendistribusikan kualitas dengan lebih baik.



Misalnya, lihat atlas peta bayangan. Semakin besar signifikansi cahaya, semakin besar area di layar atau semakin dekat objek ke kamera, semakin besar segmen atlas yang dipilih - ini diperlukan untuk menambah detail. Heuristik seperti itu dievaluasi secara dinamis.







Kecepatan kedalaman dan pra-operan



Dimulai dengan senjata pemain, geometri buram, statis, dan dinamis dirender secara berurutan ke kedalaman target. Biasanya, agar tidak melakukan kalkulasi pixel shader yang tidak perlu pada perpotongan potensial geometri, proses awal pemrosesan kedalaman dilakukan dengan penambahan hasil ke buffer. Karena menggambar ulang piksel saat berpotongan membuat penghitungan ulang yang tidak perlu dan pada akhirnya memengaruhi kinerja secara negatif, pentingnya pendekatan ini menjadi sangat berharga. Dengan depth pre-pass, shader piksel iluminasi langsung dapat menghilangkan piksel yang tidak perlu dengan membandingkannya dengan buffer kedalaman sebelum komputasi sebenarnya, sehingga menghemat sumber daya yang berharga.





Senjata Pemain





Objek Statis Objek





Dinamis



Di pre-pass, tidak hanya kedalaman yang ditampilkan, tetapi juga warna target. Dalam geometri dinamis, kecepatan dirender melalui vektor gerak, yaitu posisi posisi saat ini dikurangi dari posisi piksel pada bingkai sebelumnya. Karena gerakan disimpan dalam saluran merah dan hijau dari target render titik mengambang 16-bit, kita hanya perlu mengetahui gerakan X dan Y. Informasi ini kemudian digunakan dalam pasca-pemrosesan untuk menerapkan blur dan proyeksi ulang anti-aliasing temporal. Geometri statis tidak memerlukan vektor gerakan, karena geometri "bergerak" hanya relatif terhadap kamera dan pergerakannya dapat dihitung dari pergerakan kamera itu sendiri. Seperti yang Anda lihat pada gambar di bawah, tidak banyak pergerakan di adegan kami.







Kedalaman hierarki Z



Langkah selanjutnya adalah membuat rantai mip penyangga kedalaman hierarki: rantai ini mirip dengan mip-map, tetapi bukannya rata-rata empat piksel yang berdekatan, rantai ini mengambil nilai maksimumnya. Pendekatan ini sering digunakan dalam grafik untuk berbagai tugas, seperti mempercepat refleksi dan membuang geometri yang terhalang. Dalam kasus kami, rantai mip membuang pencahayaan dan stiker, yang akan kita bicarakan nanti. Saat ini pembuatan mip telah dilakukan dalam satu kali lintasan, dengan pencatatan dalam beberapa mip sekaligus, namun di Doom Eternal pencatatan masih dilakukan secara terpisah untuk setiap mip.







Stiker jala



Sejauh ini, kami belum sempat mengenal perbedaan besar antara proses di Doom Eternal dibandingkan dengan Doom 2016, tetapi stiker kisi cocok untuk kategori ini. Ini adalah stiker kecil (baut, kisi, tonjolan) yang, seperti stiker biasa, dapat memengaruhi sifat permukaan apa pun (normal, kekasaran, warna). Namun, stiker kisi tipikal diberikan oleh seniman selama pengembangan kisi dan, tidak seperti penempatan stiker standar di lingkungan, termasuk dalam kisi sendiri. Doom sangat bergantung pada decals di masa lalu, dan perpindahan saat ini ke stiker mesh hanya meningkatkan detail dan fleksibilitas grafis.



Untuk mendapatkan keuntungan ini, geometri pass berikutnya membuat ID dari setiap stiker menjadi tekstur 8-bit. Selanjutnya, saat menerapkan bayangan, kami mengambil sampel tekstur dan melalui pengenal kami mendapatkan matriks proyeksi yang terkait dengan setiap panggilan untuk menggambar. Matriks memproyeksikan koordinat piksel dari ruang dunia ke dalam ruang tekstur, dan kemudian koordinat ini digunakan untuk mengambil sampel stiker dan menggabungkannya dengan bahan permukaan. Teknik ini sangat cepat dalam pelaksanaannya dan membuka cakupan yang luas bagi seniman untuk bekerja dengan berbagai macam stiker. Karena ID dirender ke tekstur 8-bit, kemungkinan ada hingga 255 stiker pada satu mesh.



Satu-satunya syarat untuk semua ini adalah bahwa semua tekstur stiker terikat pada proses saat membuat jerat. Dengan proses rendering yang sama sekali tidak terkait, pengembang dapat menautkan semua tekstur stiker sekaligus dan mengindeksnya secara dinamis di shader. Karena pengembang menggunakan metode ini untuk menerapkan beberapa trik lagi dalam permainan, kita akan berbicara lebih banyak tentang proses rendering yang tidak terkait nanti.



Di bawah ini kita bisa melihat mesh tekstur stiker. Untuk kenyamanan visualisasi, pengenal diwarnai dengan warna berbeda.







Mematikan lampu dan stiker



Cahaya di Doom Eternal sangat dinamis, dan hingga beberapa ratus sumber dapat mencapai bidang pandang pada saat yang bersamaan. Selain itu, seperti yang kami catat sebelumnya, stiker dalam game sangat penting, misalnya, di Doom 2016 yang sama, jumlah stiker melebihi ribuan. Semua ini memerlukan pendekatan khusus untuk membuang kelebihan, jika tidak, kinerja tidak akan tahan terhadap tingkat keparahan pixel shader.



Doom 2016 menggunakan versi penolakan cahaya cluster berbasis prosesor: cahaya dan stiker dikumpulkan menjadi "froxels" berbentuk kerucut, yang kemudian dibaca selama bayangan dengan menentukan indeks cluster dari posisi piksel. Setiap cluster berukuran 256 piksel dan dibagi secara logaritmik menjadi 24 segmen untuk mempertahankan bentuk persegi. Teknik ini segera diadopsi oleh banyak pengembang lain, dan metode serupa ditemukan, misalnya, di Detroit: Menjadi Manusia dan Hanya Sebab.



Mengingat semakin banyaknya sumber pencahayaan dinamis (ratusan) dan stiker (ribuan), pengelompokan CPU dari penurunan pencahayaan di Doom Eternal tidak lagi cukup, karena voxel menjadi terlalu kasar. Hasilnya, pengembang menemukan pendekatan berbeda untuk id Tech 7, dan melalui shader komputasi yang dijalankan pada berbagai tahap, mereka membuat rasterizer perangkat lunak. Pertama, decals dan cahaya dihubungkan ke hexahedron (hexagon) dan ditransfer ke sebuah computational rasterizer, dimana simpul diproyeksikan ke dalam ruang layar. Kemudian shader komputasi kedua memangkas segitiga ke tepi layar dan menyusunnya menjadi ubin 256 x 256 piksel. Pada saat yang sama, dengan analogi dengan membuang klaster, elemen individu dari sumber cahaya dan stiker direkam dalam froxels,setelah itu shader komputasi berikutnya melakukan prosedur serupa untuk ubin 32 x 32 piksel. Di setiap ubin, elemen yang lulus uji kedalaman ditandai di bidang bit. Shader komputasi terakhir menerjemahkan bitfields menjadi daftar lampu yang akhirnya digunakan dalam light pass. Menariknya, indeks elemen masih direkam dalam froxel tiga dimensi 256 x 256 piksel, mirip dengan pendekatan cluster. Di tempat-tempat dengan kedalaman interupsi yang signifikan, nilai minimum dari daftar lampu baru dan daftar sumber cluster yang lama dibandingkan untuk menentukan jumlah lampu di setiap ubin.yang akhirnya digunakan di jalur pencahayaan. Menariknya, indeks elemen masih direkam dalam froxel tiga dimensi 256 x 256 piksel, mirip dengan pendekatan cluster. Di tempat-tempat dengan kedalaman interupsi yang signifikan, nilai minimum dari daftar lampu baru dan daftar sumber cluster yang lama dibandingkan untuk menentukan jumlah lampu di setiap ubin.yang akhirnya digunakan di jalur pencahayaan. Menariknya, indeks elemen masih direkam dalam froxel tiga dimensi 256 x 256 piksel, mirip dengan pendekatan cluster. Di tempat-tempat dengan kedalaman interupsi yang signifikan, nilai minimum dari daftar lampu baru dan daftar sumber cluster yang lama dibandingkan untuk menentukan jumlah lampu di setiap ubin.



Jika Anda belum berurusan dengan rasterisasi tradisional, deskripsi yang begitu kaya mungkin tidak jelas bagi Anda. Jika Anda ingin menyelami pertanyaan lebih detail, saya sarankan untuk menjelajahi prinsip-prinsip umum tentang bagaimana proses tersebut bekerja, misalnya, Scratchapixel memiliki analisis topik yang sangat baik .



Yang disebut "cakupan" yang digunakan untuk menanyakan visibilitas game juga dibuang oleh sistem ini. Karena rasterisasi perangkat lunak untuk utas komputasi merupakan proses yang panjang, okupansi sangat mungkin rendah, dan oleh karena itu menambahkan beberapa bingkai tambahan hampir tidak berpengaruh pada kinerja. Dengan pemikiran ini, cahaya kemungkinan besar akan dipancarkan secara tidak serempak, dan dengan demikian dampak bersihnya pada kinerja menjadi minimal.



Memblokir cahaya sekitar di ruang layar



Oklusi ambien dihitung pada resolusi setengah dengan cara yang cukup standar: pertama, 16 sinar acak berasal dari posisi setiap piksel di belahan bumi, dan kemudian sinar yang berpotongan dengan geometri ditentukan menggunakan penyangga kedalaman. Semakin banyak sinar yang melintasi geometri, semakin besar obstruksi. Teknik ini disebut Oklusi Arah Ruang Layar, atau SSDO, dan penjelasan rinci oleh Yuriy O'Donnell dapat ditemukan di sini . Alih-alih menyimpan tradisional nilai oklusi dalam tekstur saluran tunggal, oklusi terarah disimpan dalam tekstur tiga komponen, dan oklusi yang dihasilkan ditentukan melalui produk titik di atas piksel normal.



Karena penghitungan dilakukan pada resolusi setengah, hasilnya cukup berisik. Untuk meningkatkan kualitas dengan buffer kedalaman, keburaman dua sisi diterapkan. Pemblokiran cahaya sekitar biasanya terjadi pada frekuensi rendah, sehingga keburaman biasanya tidak terlihat.







Jalan lurus yang buram



Dalam perikop ini, banyak elemen akhirnya jatuh ke tempatnya. Tidak seperti Doom 2016, semua yang ada di sini ditampilkan langsung melalui beberapa mega-shader besar. Ada sekitar 500 status prosesor dan selusin tata letak deskriptor di sepanjang game. Senjata pemain diberikan terlebih dahulu, kemudian objek dinamis, dan kemudian objek statis. Harap dicatat bahwa urutan ini tidak terlalu penting, karena berkat prepass kedalaman kami telah menerima buffer kedalaman, dan dapat mengecualikan piksel yang sebelumnya tidak sesuai dengan kedalaman.





Senjata pemain





Objek dinamis





Kumpulan objek statis pertama Kumpulan objek statis





kedua



Di sebagian besar mesin game AAA, grafik shader dan fitur shader statis memungkinkan pengembang untuk berkreasi dengan semua jenis material dan permukaan, dan setiap material, setiap permukaan, mengarah ke shader uniknya sendiri. Akibatnya, kami dihadapkan pada variasi permutasi shader yang luar biasa untuk semua kemungkinan kombinasi fitur engine. Namun, id Tech sangat berbeda dari proyek AAA lainnya: ini menggabungkan hampir semua material dan fitur hanya dalam beberapa mega-shader besar. Pendekatan ini memungkinkan GPU untuk menggabungkan geometri dengan lebih erat, yang pada gilirannya memiliki efek positif pada kinerja. Kami akan membahas ini nanti.



Sumber daya tak terikat



Perlu dicatat bahwa seluruh proses pembentukan grafik mengandung gagasan tentang "sumber daya yang tidak terkait". Ini berarti bahwa alih-alih mengikat keburaman, pantulan, kekasaran tekstur sebelum setiap panggilan gambar, seluruh daftar tekstur dalam pemandangan itu terikat sekaligus. Tekstur dari daftar diakses secara dinamis di shader melalui indeks yang diteruskan ke shader oleh konstanta. Jadi, melalui panggilan apa pun untuk menggambar, Anda bisa mendapatkan tekstur apa pun, yang membuka jalan bagi banyak pengoptimalan, yang salah satunya akan kita bicarakan sekarang.







Menggabungkan panggilan draw secara dinamis



Selain arsitektur resource yang sepenuhnya dipisahkan, semua data geometri dialokasikan dari satu buffer yang besar . Buffer ini hanya menyimpan offset dari seluruh geometri.



Di sinilah teknologi idTech 7 yang paling menarik berperan: penggabungan panggilan draw secara dinamis.... Ini bergantung pada arsitektur resource yang dipisahkan dan memori vertex umum, dan sebagai hasilnya, secara signifikan mengurangi jumlah panggilan draw dan waktu prosesor. Sebelum rendering dimulai, compute shader secara dinamis membuat buffer indeks "tidak langsung" untuk secara efisien menggabungkan geometri dari mesh yang tidak terkait menjadi satu panggilan draw tidak langsung. Penggabungan panggilan tidak akan berfungsi tanpa resource yang tidak terkait, karena berfungsi dengan geometri dengan properti material yang tidak cocok. Di masa depan, dimungkinkan untuk menggunakan buffer indeks dinamis lagi, baik untuk prepass kedalaman maupun untuk prepass pencahayaan.



Refleksi



Shader komputasi yang paling umum menggunakan algoritma raymarching untuk membuat refleksi ruang layar. Algoritma tersebut memancarkan sinar dari piksel ke ruang dunia menuju pantulan, yang bergantung pada kekasaran permukaan pantulan. Hal yang sama terjadi di Doom 2016, di mana buffer G kecil dicatat sebagai bagian dari forward pass. Namun, di Doom Eternal tidak ada lagi buffer G, dan bahkan refleksi ruang layar dihitung tidak di shader komputasi secara terpisah, tetapi langsung di shader langsung . Sangat menarik untuk mengetahui bagaimana deviasi pada pixel shader mempengaruhi kinerja, karena tampaknya dengan meningkatnya beban pada register, para pengembang mencoba untuk mengurangi jumlah target render dan, sebagai hasilnya, mengurangi beban pada bandwidth memori.



Seringkali, ketika informasi yang diperlukan tidak tersedia dalam tekstur ruang layar, artefak rendering muncul dalam efek yang sesuai. Ini paling sering terlihat dalam refleksi ruang-layar dalam kasus di mana objek reflektif yang tidak terlihat tidak dapat dipantulkan. Masalahnya biasanya diselesaikan dengan pendekatan tradisional, menggunakan peta kubus refleksi statis sebagai cadangan.







Tapi karena mega-tekstur tidak lagi digunakan di Doom Eternal, tidak perlu tekstur fallback juga.



Partikel



Simulasi



Dalam Doom Eternal, bagian dari simulasi prosesor partikel berada di pundak shader komputasi, karena beberapa sistem partikel memiliki ketergantungan pada informasi ruang layar, seperti buffer kedalaman untuk mensimulasikan tabrakan. Sedangkan sistem partikel lain dapat dijalankan dalam bingkai sekaligus dan dihitung secara tidak sinkron, simulasi semacam itu memerlukan data prepass kedalaman awal. Karakteristiknya, tidak seperti simulasi shader partikel tradisional, di sini simulasi dilakukan melalui eksekusi urutan "perintah" dari buffer yang disimpan dalam shader komputasi. Setiap utas shader menjalankan semua perintah, di antaranya mungkin ada beberapa modifikasi parameter kill, emit, atau partikel. Semua ini terlihat seperti mesin virtual yang ditulis dalam shader. Saya tidak mengerti banyak tentang seluk-beluk simulasi seperti itu, tetapi pendekatannya didasarkanpada presentasi "The Destiny Particle Architecture" Brandon Whitney di Siggraph 2017 . Metode presentasi sangat mirip dengan yang saya jelaskan di atas dan digunakan di banyak game lainnya. Misalnya, saya cukup yakin bahwa sistem simulasi partikel Niagara bekerja dengan cara yang sama di Unreal Engine 4.



Petir



Dengan analogi dengan Doom 2016 dan metode yang dijelaskan dalam Siggraph 2016, resolusi partikel pencahayaan dipisahkan dari resolusi layar sebenarnya , yang memberi pengembang kendali atas resolusi setiap sistem partikel berdasarkan kualitas, ukuran layar, dan kontrol langsung. Untuk efek frekuensi rendah, pencahayaan dapat disediakan pada resolusi yang jauh lebih rendah dengan hampir tidak ada penurunan kualitas dibandingkan dengan, misalnya, percikan api yang memerlukan resolusi tinggi. Pencahayaan dan arah dominan cahaya disimpan dalam dua atlas 2048 x 2048 piksel, keduanya tersedia untuk setiap lintasan melalui sumber daya tak terikat, sama seperti tekstur lainnya. Selanjutnya, untuk merender partikel, geometri sederhana diambil melalui pengambilan sampel atlas ini.





Fragmen atlas pencahayaan yang diperbesar.



Langit dan hamburan



Sekarang kita akan berbicara tentang pencahayaan volumetrik . Pembuatannya terdiri dari empat lintasan dan dimulai dengan membuat tekstur LUT 3D untuk atmosfer langit melalui raymarching melalui langit itu sendiri menuju sumber cahaya.







Pertama kali Anda mungkin tidak memahami apa sebenarnya tekstur yang ditampilkan dalam gambar, tetapi jika kita memutarnya 90 derajat dan merentangkannya secara horizontal, semuanya menjadi jelas: atmosfer kita tersebar. Karena lebih bervariasi secara vertikal daripada horizontal, resolusi vertikal lebih besar. Atmosfer diwakili oleh sebuah bola, sehingga rotasi horizontal biasa disebut bujur dan rotasi vertikal biasa disebut lintang. Sebaran atmosfer dihitung oleh belahan bumi dan mencakup garis bujur 360 derajat dan garis lintang 180 derajat untuk bagian atas bola. Untuk mencakup jarak yang berbeda ke pengamat, tekstur LUT berisi 32 segmen kedalaman, dan alih-alih menghitung ulang data langit di setiap bingkai, prosesnya tersebar di 32 bingkai.







Berkat tekstur LUT, lintasan berikutnya menghitung hamburan cahaya oleh "froxel" yang diamati dengan analogi dengan obstruksi cluster pada skala yang lebih kecil. Anda dapat mengamati beberapa segmen, dari dekat hingga jauh, di bawah.







Pada tahap ketiga, data hamburan untuk setiap sel dikalikan ke dalam setiap sel berikutnya menuju tampilan dan ditulis ke dalam tekstur 3D baru.



Hasilnya, pencahayaan volumetrik ditempatkan di atas gambar yang dirender melalui pengambilan sampel tekstur 3D yang baru dibuat berdasarkan kedalaman piksel.





Sebelum





Sesudah



Langit "yang terlihat" terakhir dibuat di belahan bumi jika ada dalam tampilan. Dalam pemandangan ini, langit tidak termasuk dalam ulasan, tetapi di bawah ini Anda dapat melihat contoh rendering langit dalam pemandangan luar ruangan.







Transparansi



Mirip dengan Doom 2016, transparansi ditampilkan dengan forward pass setelah geometri buram saat ada data hamburan cahaya. Tekstur pemandangan dalam hal ini kehilangan resolusi (downsample), dan untuk "mensimulasikan" transparansi berdasarkan kehalusan permukaan, tingkat mip yang sesuai dipilih. Data hamburan cahaya membantu menciptakan hamburan yang baik secara visual dari dalam permukaan.



Di bawah ini Anda dapat melihat contoh tekstur mip-chain dari pemandangan, di mana permukaan yang lebih transparan jatuh ke area pandang.





Untuk transparansi, hanya piksel yang terkait dengannya yang hilang dalam resolusi.



Antarmuka pengguna



Biasanya, lintasan terakhir dalam bingkai adalah antarmuka pengguna. Seperti biasanya, antarmuka dirender menjadi target render LDR (delapan-bit) resolusi penuh sekunder, dan warnanya dikalikan sebelumnya dengan saluran alfa. Selama pemetaan nada, antarmuka ditumpangkan pada tekstur HDR. Membuat antarmuka berfungsi dengan konten HDR lainnya dalam bingkai biasanya rumit, tetapi di Doom Eternal, pemetaan nada mengubah antarmuka secara ajaib dan terlihat alami dibandingkan konten 3D lainnya.







Pengolahan pasca



Hal pertama dalam pasca-pemrosesan adalah blur : efek dua langkah ini membaca data dari tekstur warna dan buffer kecepatan yang disesuaikan. Lintasan pertama mengumpulkan empat sampel pada sumbu vertikal, yang kedua - empat di sepanjang sumbu horizontal. Kemudian contoh warna dicampur sesuai dengan pergerakan piksel. Untuk menghindari blur, buffer kecepatan kustom harus memastikan bahwa tidak ada ghosting dan senjata pemain dikecualikan dari proses tersebut.



Berikutnya adalah dampak yang ditargetkan: Tekstur RG (bi-color) 1 kali 1 ini berisi iluminasi rata-rata dari keseluruhan pemandangan dan dihitung dengan menurunkan sampel tekstur warna secara berturut-turut dan mendapatkan iluminasi rata-rata dari sekelompok piksel. Paling sering, teknik ini digunakan untuk mensimulasikan pembiasaan mata manusia terhadap perubahan tajam dalam kecerahan sekitar. Selain itu, iluminasi rata-rata digunakan saat menghitung dampak selama pemetaan nada.







Setelah semua ini, Bloom dihitung . Efek ini tidak cukup dalam contoh kita dan tidak mungkin merendernya secara luas, tetapi cukup untuk mengetahui bahwa kalkulasi dilakukan dengan memperoleh data warna di atas batas tertentu dan secara bertahap mengurangi resolusi tekstur untuk memburamkannya.



Kemudian pemetaan nadamenggabungkan semua efek. Shader komputasi tunggal melakukan hal berikut:



  • Menerapkan distorsi
  • Merender tekstur Bloom
  • Menghitung vignetting, kotoran pada kamera, chromatic aberration, lens flare dan banyak efek lainnya
  • Mendapat nilai eksposur berdasarkan iluminasi rata-rata
  • Memungkinkan pemetaan ton mendistribusikan warna HDR pada rentang yang benar untuk LDR dan HDR melalui operator pemetaan ton khusus.


Terakhir, antarmuka ditumpangkan di atas.



Tekstur distorsi ditampilkan bahkan sebelum pascapemrosesan: geometri seperti kabut api dari efek partikel dirender menjadi target render baru dalam format dengan seperempat resolusi asli. Dalam render ini, data distorsi disimpan di saluran merah dan hijau, dan oklusi di warna biru. Data yang diperoleh diterapkan saat gambar terdistorsi pada langkah pemetaan nada.







Kesimpulan



Rincian sepintas kami tentang satu tembakan Doom Eternal telah berakhir, meskipun saya yakin saya belum menyentuh beberapa hal yang memengaruhi tampilan permainan. Menurut pendapat saya, Doom Eternal adalah kesuksesan teknis yang luar biasa, dan Software id akan mampu meningkatkan standar lebih jauh di masa depan. Tim pengembang telah berhasil mendemonstrasikan kepada kami bagaimana pemikiran cerdas dan perencanaan yang efektif telah membantu menciptakan game berkualitas tinggi, dan saya yakin ini adalah panutan yang hebat, serta materi pendidikan. Saya menantikan perkembangan masa depan oleh id Software.



Robek dan robek, sampai selesai.



Bahan referensi






All Articles