Kata Pengantar
Setelah game terakhir dari seri Metro dirilis, saya menghabiskan beberapa jam mempelajari pekerjaan internalnya dan memutuskan untuk berbagi sesuatu yang mungkin tampak menarik dari sudut pandang teknologi. Saya tidak akan melakukan analisis terperinci atau mempelajari kode shaders yang dibongkar, tetapi saya akan menunjukkan keputusan tingkat tinggi yang dibuat oleh pengembang dalam proses pembuatan game.
Saat ini, para pengembang belum berbicara tentang teknik rendering yang digunakan dalam game. Satu-satunya sumber informasi resmi adalah
laporan GDC , yang tidak dapat ditemukan di tempat lain di Internet. Dan ini menjengkelkan, karena gim ini berjalan pada mesin berpemilik yang sangat menarik yang telah berevolusi dari gim sebelumnya dalam seri Metro. Ini adalah salah satu game pertama yang menggunakan
DXR .
Catatan: artikel ini bukan deskripsi lengkap dan saya akan kembali ke sana jika saya menemukan sesuatu yang layak ditambahkan. Mungkin saya melewatkan sesuatu, karena beberapa aspek hanya muncul di tahap selanjutnya dalam permainan, atau saya hanya melihat detailnya.
Langkah pertama
Butuh beberapa hari untuk menemukan lingkungan yang mampu bekerja dengan game ini. Setelah menguji beberapa versi RenderDoc dan PIX, saya memutuskan untuk mempelajari hasil penelusuran ray menggunakan Nvidia NSight. Saya ingin belajar rendering tanpa raytracing, tetapi NSight mengizinkan saya untuk menjelajahi detail fitur ini juga, jadi saya memutuskan untuk membiarkannya. Untuk rendering lainnya, PIX sangat cocok. Tangkapan layar diambil menggunakan kedua aplikasi.
NSight memiliki satu kelemahan - tidak mendukung penyimpanan hasil tangkapan ke file, jadi saya tidak bisa kembali ke frame yang saya pelajari.
Pada awal pekerjaan saya, saya juga mengalami masalah lain yang tidak ada hubungannya dengan aplikasi debug bingkai: fungsi pelacakan sinar diperlukan menginstal pembaruan Windows terbaru, tetapi permainan memungkinkan mereka untuk dimasukkan dalam opsi tanpa menginstal pembaruan. Dalam hal ini, masuknya fungsi menyebabkan game mogok saat startup. Pengalaman GeForce juga tidak mengatakan apa-apa tentang perlunya versi Windows yang benar untuk mengaktifkan fitur-fitur ini. Masalah ini perlu ditangani di kedua sisi.
Demi kelengkapan, saya membuat tangkapan dari game yang berjalan dengan parameter maksimum yang mungkin, tetapi tanpa DLSS.
Analisis bingkai
Bingkai jadiAnalisis singkat rendering menunjukkan serangkaian fungsi yang cukup standar, dengan pengecualian penerangan global yang dilakukan oleh ray tracing (ray traced GI).
Sebelum menampilkan gambar, skala frame sebelumnya dikurangi dalam antrian komputasi dan kecerahan rata-rata dihitung.
Antrian grafis dimulai dengan rendering partikel distorsi (tetesan pada kamera), yang diterapkan pada tahap pasca-pemrosesan. Kemudian lintasan pendahuluan cepat dari kedalaman menciptakan bagian dari kedalaman di depan Gbuffer; sepertinya hanya membuat lega.
Pass GBuffer mengisi 4 target render sesuai dengan diagram di bawah ini, dan juga melengkapi pengisian buffer dalam.
1. Target dalam format RGBA8 dengan Albedo dan, mungkin, Ambient Occlusion di saluran alpha; Pada beberapa permukaan terlihat sangat gelap.2. Target dalam format RGB10A2 dengan normals dan, mungkin, topeng hamburan bawah permukaan di saluran alpha.3. Target dalam format RGBA8 dengan parameter material lainnya, mungkin metalness dan roughness pada alpha channel. Anehnya, saluran RGB dalam hal ini berisi data yang persis sama.4. Target dalam format RG16F dengan vektor gerakan 2D.Setelah kedalaman diisi sepenuhnya, buffer kedalaman linier dibangun dan skalanya menurun. Semua ini dilakukan dalam compute queue. Dalam antrian yang sama, buffer diisi dengan sesuatu yang mirip dengan pencahayaan terarah tanpa menggunakan bayangan.
Dalam antrian grafis, GPU melacak sinar penerangan global, tetapi saya akan berbicara lebih banyak tentang hal ini di bawah ini.
Komputasi antrian menghitung oklusi ambien, refleksi, dan sesuatu yang mirip dengan pengenalan tepi.
Dalam antrian grafis, peta bayangan empat tahap dirender ke dalam peta kedalaman 32-bit ukuran 6k * 6k. Lebih lanjut tentang ini di bawah ini. Setelah menyelesaikan peta bayangan diarahkan, resolusi kaskade ketiga untuk alasan yang tidak diketahui berkurang menjadi 768 * 768.
Di tengah proses rendering bayangan, ada momen aneh: atlas penipu dilengkapi oleh beberapa objek sebelum mengubah bayangan lokal dari pencahayaan (tentang penipu apa yang dapat ditemukan di
sini ). Baik buffer palsu dan buffer bayangan pencahayaan lokal juga memiliki tekstur 6k * 6k.
Setelah semua bayangan selesai, perhitungan pencahayaan dimulai. Bagian rendering ini agak tidak bisa dipahami, karena ada banyak rendering yang melakukan beberapa tindakan misterius, dan karenanya memerlukan studi tambahan.
Rendering adegan berakhir dengan benda-benda yang terang di depan (mata, partikel). Efek visual dirender ke dalam buffer setengah-resolusi, setelah itu mereka dikomposisi dengan objek buram menggunakan zooming.
Gambaran akhir dicapai dengan koreksi tonal dan perhitungan bloom (mengurangi dan kemudian meningkatkan resolusi frame dengan koreksi tonal). Akhirnya, UI dirender ke dalam buffer terpisah dan, bersama dengan bloom compositing, ditumpangkan di atas layar.
Saya tidak menemukan bagian di mana smoothing dilakukan, jadi saya akan meninggalkannya untuk nanti.
Pelacakan sinar cahaya global
Beberapa informasi tentang penerangan global dilakukan oleh GI yang dilacak. Struktur percepatan ini mencakup area besar dunia game, mungkin beberapa ratus meter, sambil mempertahankan detail yang sangat tinggi di mana-mana. Sepertinya mengalir entah bagaimana. Adegan struktur percepatan tidak sesuai dengan adegan raster, misalnya, bangunan pada gambar di bawah ini tidak terlihat dalam bentuk raster.
Tampilan atasDi sini kita dapat melihat empat ubin di sekitar posisi pemain. Juga jelas adalah kurangnya geometri yang diuji pada saluran alpha. Pohon memiliki batang, tetapi tidak ada dedaunan, tidak ada rumput, tidak ada semak.
Tutup tampilanDalam tampilan close-up, detail dan kepadatan objek lebih baik dilihat. Setiap objek dengan warna yang berbeda memiliki struktur akselerasi dari level yang lebih rendah. Hanya dalam gambar ini ada beberapa ratus dari mereka.
Item Pemain Di Bawah KakiMenariknya, item pemain juga merupakan bagian dari struktur akselerasi, tetapi untuk beberapa alasan terletak di bawah kakinya.
Kerusakan kulit?Rusak menguliti lagi?Beberapa objek dengan skinning terlihat rusak dalam struktur percepatan. Salah satu masalah yang diamati adalah peregangan jala (di kaki anak). Masalah lain mengarah pada fakta bahwa bagian-bagian berbeda dari karakter dengan skinning berada pada posisi yang berbeda. Tidak ada peregangan, tetapi bagian-bagiannya terpisah satu sama lain. Sepertinya tidak ada yang terlihat dalam pencahayaan ray-tracing global, atau setidaknya saya belum bisa melihat ini dalam permainan.
Sejumlah besar objekPada bidang yang lebih umum, Anda dapat melihat berapa banyak objek berbeda yang ada dalam struktur percepatan. Sebagian besar dari mereka tidak akan benar-benar berkontribusi pada hasil perhitungan penerangan global. Juga terlihat di sini bahwa tidak ada skema LOD. Semua objek ditambahkan dengan detail lengkap. Akan menarik untuk mengetahui apakah ini memiliki efek pada ray tracing (saya anggap ya).
LOD ultra-tinggi, setiap skala dan sakelar sepenuhnya dimodelkanTangkapan layar lain menunjukkan detail besar benda bahkan jauh dari pemain. Setiap saklar dan setiap skala dalam gambar ini dapat dibaca dengan jelas bahkan tanpa tekstur. Tempat di mana saya memindahkan kamera untuk mengambil tangkapan layar ini terletak puluhan meter dari pemain dan menghilangkan detail ini tidak akan memperburuk kualitas gambar. Mungkin memperbarui struktur akselerasi menggunakan LOD akan terlalu mahal, tetapi ada kemungkinan besar bahwa pembaruan ini dapat dilakukan secara tidak sinkron. Poin ini pasti perlu ditelusuri lebih detail.
Rendering Directional Shadows
Bagian utama dari rendering shadow adalah sederhana dan tidak memerlukan perhatian khusus, tetapi ada beberapa poin menarik di sini.
Jerat yang pengecoran bayangannya tidak mungkinDetail besar di peta bayanganJerat yang tampaknya menggunakan buffer indeks yang salahSepertinya seperti mempercepat struktur, rendering bayangan mencakup segalanya. Ada objek yang hampir tidak berkontribusi pada peta bayangan, tetapi mereka masih membuat. Saya ingin tahu apakah ini terjadi karena izin, atau apakah tidak ada cara mudah di mesin untuk mengecualikan mereka?
Ada objek yang sulit dilihat bahkan dengan bayangan di ruang layar. Tidak perlu banyak waktu untuk membuat mereka, tetapi akan menarik untuk melihat apakah mereka dapat dihapus untuk menghemat sedikit waktu.
Ketika memeriksa mesh, tampaknya beberapa mesh yang diberikan dalam shadow map telah merusak buffer indeks, tetapi setelah vertex shader mereka terlihat benar (hasilnya sama di PIX dan NSight). Ini adalah contoh terbaik yang berhasil saya temukan, tetapi itu jauh dari satu-satunya. Mungkin ini semacam posisi pengemasan khusus?
Jerat tampaknya memiliki skinning yang burukMenguliti tampaknya menyebabkan masalah tidak hanya dalam mempercepat struktur. Menariknya, itu tidak mengarah pada artefak yang terlihat di layar.
Bagian 2
Amandemen minor
Pada bagian sebelumnya, saya menulis bahwa target render ketiga buffer GBuffer kemungkinan besar mengandung metalness, tetapi tampaknya itu sebenarnya mengandung warna specular. Pada awalnya saya tidak melihat warna apa pun dan tidak mengerti mengapa ketiga saluran RGB berisi data yang sama, tapi itu mungkin karena tidak ada pantulan warna di tempat kejadian. Untuk senjata ini, buffer berisi lebih banyak warna berbeda.
Saya juga lupa menambahkan tekstur favorit saya, yang saya temukan dalam proses meneliti rendering game. Itu pasti layak disebutkan karena menunjukkan sifat kacau pengembangan game ketika itu tidak selalu mungkin untuk membersihkannya.
"Tingkatkan aku!"Komposisi transparansi dan anti-aliasing
Mencoba untuk mencari tahu bagaimana resolusi penyangga transparansi setengah ukuran meningkat, dan bagaimana permainan melakukan antialiasing, saya melihat sesuatu yang menarik. Saya membutuhkan adegan di mana ada lebih banyak kontras sehingga jelas terlihat apa yang terjadi. Untungnya, saya berhasil menangkap bingkai di mana senjata pemain bergerak sedikit di antara bingkai.
Sebelum memberikan transparansiTampaknya sebelum mengkomposisikan buffer transparansi, buffer sudah berisi gambar yang dirender sepenuhnya, dan karena tidak ada tepi tajam dalam bingkai ini, logis untuk menganggap bahwa ini adalah data dari frame sebelumnya.
Setelah menyusun transparansi dari frame saat iniSaat menambahkan transparansi ke bingkai saat ini, kami dapat melihat setiap tepian yang rusak. Itu terjadi karena senjata sedikit bergeser ke kanan. Beberapa awan dibuat transparan, tetapi mereka terpotong ke cakrawala (yang buram), jadi pengomposisian tidak mengubah dasar, tetapi sudah merender jala senjata dari frame sebelumnya menggunakan penyangga kedalaman dari frame saat ini.
Setelah menambahkan opacity ke frame saat iniSetelah beberapa panggilan undian, dilakukan pengomposisian dan sambungan yang tidak jelas. Tampaknya tidak ada alasan khusus untuk melakukan ini dalam urutan ini. Adalah logis untuk menyusun buffer transparansi ke dalam data objek buram dari frame saat ini, tetapi ini tidak terjadi, dan akan menarik untuk mengetahui alasannya.
Setelah TAASetelah menyelesaikan bingkai penuh, TAA (Temporal Smoothing) lulus memperhalus tepi. Saya sudah tertarik dengan ini sebelumnya, karena saya tidak melihat di mana smoothing terjadi. Tapi saya melewatkan ini karena segera setelah undian ini memanggil downsampling untuk mekar lulus dimulai dan saya melewatkan panggilan undian yang satu ini.
Lensa menyala
Biasanya saya tidak ingin menganalisis efek individual, tetapi ada banyak cara untuk menerapkan suar lensa, jadi saya ingin tahu tentang pengembang mana yang memilih.
Lensa menyala dalam pengomposisian yang sudah jadiDalam kebanyakan kasus, suar lensa hampir tidak terlihat, tetapi ini adalah efek yang indah. Sulit untuk ditampilkan di tangkapan layar, jadi saya tidak akan berusaha keras dalam hal ini.
Lensa menyala dalam buffer mekarSetelah mencari, saya menemukan panggilan draw yang menambahkan efek ini, dan ternyata itu adalah panggilan setelah tahap terakhir meningkatkan resolusi bloom. Dalam buffer ini, efeknya jauh lebih terlihat.
Suar Lensa GeometriJika Anda melihat geometri, suar lensa cukup sederhana. Setidaknya 6 quadrangles terlibat dalam menciptakan hasil akhir di layar, tetapi tidak ada serangkaian quadrangles yang lebih kecil yang mendekati posisi matahari. Kita dapat menyimpulkan bahwa ini adalah solusi yang cukup standar, meskipun beberapa pengembang membuat suar lensa langsung di adegan penargetan, sementara yang lain menghitung efeknya sebagai pasca-pemrosesan.
Penguraian medan
Di semua game dunia terbuka, salah satu kesulitan paling menarik adalah merender medan. Saya memutuskan bahwa mungkin tampak menarik untuk mempelajari aspek ini, tetapi, terus terang, sedikit kecewa.
Pada pandangan pertama, sebuah fragmen relief tampak seperti semacam penghentian yang dilakukan. Cara bantuan berubah bentuk selama gerakan membuatnya logis untuk menganggap bahwa ada beberapa perpindahan tambahan. Selain itu, pada PC, gim ini secara aktif menggunakan tessellation, jadi masuk akal jika menggunakannya.
Mungkin saya memiliki parameter yang salah yang ditetapkan, tetapi permainan membuat semua bagian dari relief tanpa tessellation. Untuk setiap fragmen relief, ia menggunakan kisi seragam 32 * 32 ini. Juga tidak ada LOD.
Melihat fragmen relief setelah vertex shader, Anda dapat melihat bahwa sebagian besar pasangan simpul bergabung untuk membentuk grid 16 * 16 yang hampir sempurna, dengan pengecualian beberapa tempat yang membutuhkan akurasi lebih (mungkin karena kelengkungan relief). Deformasi yang disebutkan di atas mungkin muncul karena membaca tekstur mip dari peta ketinggian relief ketika relief jauh dari kamera.
Trik Pelacakan Ray
Dan sekarang tentang apa yang semua orang tunggu.
Streaming data
Salah satu aspek yang paling menarik dari implementasi DXR saat ini adalah cara Anda bekerja dengan data. Yang paling penting adalah bagaimana data dimuat ke dalam struktur yang mempercepat dan bagaimana itu diperbarui. Untuk menguji ini, saya mengambil dua tangkapan dan membandingkan struktur percepatan di NSight.
Pemain ada di dalam kapalPada penangkapan pertama, saya berdiri di dalam kapal yang rusak, yang terlihat di tengah-tengah gambar ini. Hanya benda terdekat yang dimuat, kecuali batu besar di tepi peta.
Pemain telah pindah ke sudut kiri atas gambar ini.Pada tangkapan kedua, saya menjauh dari tepi peta dan lebih dekat ke tepi kiri atas gambar. Kapal dan segala sesuatu di sekitarnya masih dimuat, tetapi benda-benda baru juga dimuat. Menariknya, saya tidak bisa mendefinisikan struktur ubin apa pun. Objek dapat dimuat / dihapus dari struktur percepatan berdasarkan jarak dan visibilitas (mungkin membatasi jajaran genjang?). Selain itu, tepi kanan atas terlihat lebih detail, meskipun telah menjauh darinya. Akan menarik untuk mengetahui lebih banyak tentang ini.
Relief dan apa yang ada di bawahnya
Beberapa aspek implementasi DXR di Metro: Keluaran tentang medan dapat disebutkan.
Pertama, menarik bahwa struktur percepatan tidak mengandung jerat relief (dengan pengecualian kasus khusus). Monster-monster ini benar-benar berjalan dalam game di tanah, tetapi menilai dari data di NSight, Anda mungkin berpikir bahwa mereka terbang. Ini menimbulkan pertanyaan yang menarik bagi kita: dapatkah penerapan pencahayaan global dengan mempertimbangkan bantuan (mungkin menggunakan peta ketinggian dan bahan bantuan) atau tidak.
Saat berikutnya saya tidak akan pernah memperhatikan jika bantuan itu ada. Melihat awal level pada struktur percepatan di NSight, saya perhatikan beberapa jerat di bawah relief.
Artis cukup sering, karena berbagai alasan, menempatkan mesh debug di bawah level, tetapi mereka biasanya dihapus sebelum permainan dirilis. Dalam hal ini, jerat ini tidak hanya bertahan sampai rilis, tetapi juga menjadi bagian dari struktur percepatan.
Selain yang disebutkan di atas, saya menemukan jerat lainnya tersebar di bawah bantuan. Pada dasarnya, mereka tidak layak untuk disebutkan, tetapi yang ini sangat menarik - ini adalah karakter yang berdiri tepat di bawah titik awal level. Bahkan memiliki kolam renang sendiri.
Akhirnya, elemen penasaran terakhir dari struktur percepatan adalah jerat satu sisi yang melihat keluar dari level. Kecuali jika mereka dianggap bilateral, sangat kecil kemungkinan mereka memberikan kontribusi pada gambar permainan. Bahkan jika jerat dua sisi, mereka sangat jauh dari area yang dapat dimainkan sehingga mereka mungkin hanya meregangkan struktur percepatan. Sangat menarik untuk melihat bahwa mereka tidak disaring. Gambar ini juga menunjukkan salah satu kasus khusus "relief mesh" di sudut kanan bawah, antara kereta dan bangunan.
Tanpa kepala dengan menguliti
Saya sudah berbicara tentang masalah pengait kulit, tetapi pada tingkat ini saya memperhatikan sesuatu yang lain.
Pertama, monster ini menunjukkan kedua kesalahan dalam satu gambar, yang saya perhatikan di atas. Saya masih bertanya-tanya apa yang menyebabkan mereka.
Saya juga memperhatikan bahwa makhluk-makhluk kecil ini, seperti kelelawar, tidak memiliki kepala dalam struktur percepatan.
Contoh lain. Perhatikan lubang di mana kepala seharusnya berada. Saya belum melihat satu pun kasus di mana kepala terlihat.
Makhluk yang sama dalam mode rasterisasi.
Perhatikan bahwa kepala terlihat jelas.Dan di sini adalah kerangka gambar kepala.Kesimpulannya
Itu saja untuk hari ini. Saya harap Anda menikmati tampilan ini di bagian dalam Metro: Exodus.Saya akan terus mengeksplorasi rendering game, tetapi saya tidak akan mempublikasikan bagian-bagian baru artikel kecuali saya menemukan beberapa bagian khusus yang akan menarik bagi orang-orang atau menemukan sesuatu yang layak dibagikan.