Analisis grafis Red Dead Redemption 2

Salah satu game favorit saya, Red Dead Redemption , kembali pada tahun 2018 dengan sebuah prequel untuk konsol. Itu dirilis untuk PC pada tahun 2019 dan akhirnya saya memainkannya; Saya langsung dikejutkan oleh gambarnya. Namun, saya kesal: Saya hampir tidak berhasil bermain di pengaturan rata-rata dengan 25 FPS pada desktop 1050Ti GPU. Saya mengerti, mesin saya tidak terlalu kuat, tetapi 25 FPS pada pengaturan sedang?



Hari ini kita akan melihat beberapa contoh frame dari game dan menganalisis teknik grafis yang digunakan dalam game.



Kata pengantar



Ini adalah analisis tidak resmi dari permainan. Saya baru saja menganalisis frame grabbing dengan RenderDoc . Jika Anda ingin mengetahui informasi dari pengembang sendiri, Anda dapat mempelajari slide dari laporan tentang SIGGRAPH Fabian Bayer's . Slide (bagian bawah halaman), video (mulai pukul 1:58:00).



Anda juga dapat membaca analisis grafik GTA5 yang dilakukan oleh Adrian Correge [ terjemahan di HabrΓ©]. Karena RDR2 dan GTA5 diciptakan oleh perusahaan yang sama dan menggunakan mesin yang sama, beberapa trik dari GTA5 juga ada di sini.



Poin penting lainnya adalah saya bukan programmer grafis yang berpengalaman dan masih pemula di bidang ini. Karena itu, banyak hal yang tidak dapat saya pahami. Jika Anda menemukan bug atau hal-hal yang dapat diperbaiki,menulis kepada saya . Ayo pergi!



Parsing bingkai



Inilah kerangka utama kami untuk analisis:





Frame ditangkap pada PC dengan pengaturan sedang.



Dalam game seperti RDR2, hampir mustahil untuk menjelajahi semua gerakan dalam satu kesempatan. Pekerjaan mereka ditransfer antara beberapa frame. Karena itu, saya menangkap beberapa frame, tetapi yang ditunjukkan di atas akan menjadi yang utama. Ini berisi banyak properti, termasuk: lampu sorot dan lampu sorot, pencahayaan terarah (sangat kecil, tetapi memang begitu), bangunan, NPC, kuda, pohon, tumbuh-tumbuhan, awan, dll. Di dalamnya, Anda dapat menunjukkan sebagian besar teknik rendering yang digunakan dalam game.


RDR2 adalah game dunia terbuka, jadi streaming data selalu dilakukan. Akibatnya, pembingkaian dimulai dengan serangkaian tugas seperti membuat dan menghapus tekstur, pemindaian sumber daya shader, pemindaian acak, memperbarui deskriptor, buffer, dll.



Peta Bumi / Lumpur



Kotoran memainkan peran besar. Selain menjadi mekanik game, kotoran membuat lingkungan lebih realistis. Gim ini membuat tekstur trek orang dan kuda menjadi peta perpindahan bersama dengan tekstur trek roda gerobak. Akumulasi tekstur ini digunakan untuk Pemetaan Parallax Occlusion saat merender medan.



MudMap


Peta Lumpur: R16_UNORM2048x2048



Langit dan awan



Setelah melalui perhitungan kotoran, game melakukan banyak pekerjaan dengan perhitungan GPU. Mereka terutama berhubungan dengan langit dan awan. Awan, kabut, dan pencahayaan volumetrik adalah beberapa efek paling menonjol dalam RDR2. Anda dapat mempelajari lebih lanjut tentang langkah ini dari slide Fabian. Dia menjelaskan semua ini dengan lebih detail daripada yang bisa saya lakukan.



Peta lingkungan



Peta lingkungan adalah sumber utama refleksi untuk RDR2 dan juga GTA5.

Seperti GTA5 , RDR2 menghasilkan peta kubus lingkungan dari posisi kamera. Mesin permainan menghasilkan GBuffer tipis untuk peta lingkungan, mirip dengan yang digunakan dalam Far Cry 4 .



EnvironmentMapAlbedo


Wajah peta lingkungan kubus (Albedo): RGBA8_SRGB



EnvironmentMapNormal


Wajah peta lingkungan kubus (normals): RGBA8_UNORM



EnvironmentMapDepth


Tepi kubus lingkungan (kedalaman):D32S8



Membuat peta kubus lingkungan di setiap bingkai bisa menjadi tugas yang sangat rumit. Untuk mengurangi biaya komputasi, RDR2 menggunakan optimisasi. Misalnya, permainan hanya membuat objek statis dan buram, melakukan pemusnahan frustum sebelum merender setiap wajah, dan merender versi LOD yang lebih rendah dari model. Namun, saya menemukan bahwa jumlah poligon medan masih sangat tinggi untuk peta lingkungan.



Setelah lulus G-Buffer, peta kubus lingkungan langit dihasilkan menggunakan peta langit parabola dan tekstur awan. Langkah selanjutnya adalah konvolusi. Untuk Pencahayaan Berbasis Gambar, mesin RDR2 menggunakan pendekatan jumlah sum. Metode ini menggunakan peta lingkungan pra-disaring bersama dengan lingkungan LUT BRDF. Untuk memfilter, gim ini menciutkan peta kubik lingkungan dan menyimpan versi yang diminimalkan di tingkat tekstur mip peta kubik.



Sebelum melakukan izin pencahayaan untuk peta pencahayaan kubik, RDR2 menjadikan oklusi ambien skala besar yang dipanggang menjadi tekstur kubik lainnya. Gim ini menggunakan oklusi ambien ruang layar, tetapi SSAO hanya membantu pada skala kecil. Oklusi ambien ambien membantu melakukan penggelapan pada skala yang lebih besar, seperti teras yang gelap dan interior.



EnvironmentMapBakedAO


Aspek kubus lingkungan (dipanggang AO):R8_UNORM



Permainan ini menggunakan rendering ubin ditangguhkan untuk menghitung pencahayaan peta lingkungan . Pemusnahan cahaya dan pencahayaan dihitung bersama dalam satu lintasan shader komputasi untuk setiap permukaan peta lingkungan. (Terima kasih atas petunjuk @benoitvimont ini .) Juga untuk pencahayaan yang dipanggang, permainan ini menggunakan teknik "peta cahaya dunia top-down" yang serupa dengan yang digunakan dalam Assassin's Creed III .



Untuk setiap muka peta kubik, RDR2 menghasilkan warna akhir di atas tekstur lingkungan langit. Kemudian permainan menyaring peta kubik lingkungan dengan cara yang sama dengan peta kubik lingkungan langit.



EnvironmentMapFinal


Aspek peta kubus lingkungan (final):R11G11B10_FLOAT



Juga, ketika pemain berada di dekat sebuah gedung, RDR2 memuat peta lingkungan yang terletak di interior bangunan. Ada juga kartu kubik G-Buffer yang mengalir dari disk.



BakedEnvironmentMapAlbedo


Wajah yang dipanggang dari peta lingkungan kubus (Albedo): BC3_SRGB(AO yang dipanggang disimpan di saluran alpha)



BakedEnvironmentMapNormal


Wajah terpanggang dari peta lingkungan kubus (normals): BC3_UNORM



BakedEnvironmentMapDepth


Tepi kubus lingkungan (kedalaman):R16_UNORM



Permainan menghitung pencahayaan peta ini dan memfilternya seperti yang sebelumnya. Ini hanya menghitung satu peta lingkungan terpanggang pada satu waktu, dan hanya menghitung ulang ketika waktu hari berubah. Semua peta lingkungan disimpan dalam array peta tekstur kubik. Tidak ada konversi peta kubus ke peta parabola ganda yang dilakukan.



G-Buffer Pass



Tahap ini dimulai dengan umpan pendahuluan dari kedalaman medan, dan kemudian game menjadikan adegan dalam G-Buffers.



GBuffer 0 RGB GBuffer 0 A
AlbedoTarget
AlbedoTargetA




  • RGBA8_SRGB- buffer ini mengandung albedo (warna dasar) di saluran RGB. Saya tidak begitu mengerti untuk apa data saluran alpha, tetapi ini digunakan selama tahap anti-aliasing.




GBuffer 1 RGB GBuffer 1 A
Target Normal
Target NormalA


  • RGBA8_UNORM: Saluran RGB berisi normal, dan saluran alfa berisi sesuatu yang berhubungan dengan jaringan dan rambut.




GBuffer 2 RGB GBuffer 2 A
Penargetan Material
MaterialTargetA


  • RGBA8_UNORM: target ini digunakan untuk properti material.

    • R: Reflektansi (f0)
    • G: Kelancaran
    • B: Metalik
    • A: berisi bayangan (saluran ini akan digunakan sebagai topeng bayangan pada langkah selanjutnya)


GBuffer 3 R GBuffer 3 B
Material2TargetR
Material2TargetB


  • RGBA8_UNORM: saluran merah berisi rongga. Ada beberapa data misterius di saluran biru lagi. Dan saluran alfa berisi data yang terkait dengan rambut. Saya tidak dapat menemukan apa pun di saluran hijau.


GBuffer 4 RG
MotionBlurTarget


  • RG16_FLOAT: Buffer ini berisi kecepatan ruang layar untuk implementasi gerakan kabur.


GBuffer 5 Depth GBuffer 5 Stencil
DepthTarget
StencilTarget


  • D32S8: seperti GTA5, RDR2 menggunakan z terbalik untuk kedalaman , serta buffer stensil untuk menetapkan nilai ke grup jerat tertentu.


Target lain dihasilkan dari data yang dipanggang:



GBuffer 6 R GBuffer 6 G
BakedAO
Target Misteri


Buffer ini berisi oklusi ambien terpanggang yang sama di saluran merah seperti pada tahap peta lingkungan. Tetapi ada saluran lain dalam tekstur ini juga. Saluran hijau berisi data yang menyerupai data di saluran biru GBuffer 3. Sekali lagi, saya tidak mengerti untuk apa data ini digunakan. Dalam bingkai yang diambil, saya tidak dapat menemukan data di saluran biru dan alfa. Saya akan mempelajari ini secara lebih rinci.



Pembuatan Peta Shadow



Setelah tahap G-Buffer, game mulai merender peta bayangan. Ini menggunakan array tekstur 2D untuk peta bayangan sumber titik dan array tekstur kubik untuk peta bayangan sumber cahaya pencarian.



Beberapa permainan peta bayangan menggunakan tekstur atlas bayangan yang besar ( misalnya, di DOOM ). Salah satu kelebihan dari metode ini adalah ukuran peta bayangan dapat sangat bervariasi tergantung pada jarak. Dengan array tekstur, fleksibilitas ini hilang karena semua tekstur dalam array harus berukuran sama. RDR2 memiliki tiga susunan tekstur yang berbeda untuk tingkat kualitas yang berbeda. Misalnya, sumber lampu sorot memiliki:



  • 512x768 D16 untuk sumber yang jauh
  • 1024x1536 D16 ( β€” )
  • 2048x3072 D16 ( / )


Sumber titik melemparkan bayangan ke semua arah. Untuk mengatasi tugas ini, gim menggunakan teknik yang disebut Pemetaan Bayangan Omnidirectional , di mana adegan dirender menjadi peta kedalaman kubik dari posisi kamera. Dengan menggunakan teknik ini, bayangan dari api dan bayangan dari lentera Arthur ditampilkan. Seperti sumber lampu sorot, sumber titik memiliki tiga larik berbeda untuk pengaturan kualitas yang berbeda.



Sebagian besar sumber titik statis dalam permainan memiliki peta bayangan kubus yang dipanggang.

Oleh karena itu, permainan menggunakan bayangan yang dipanggang kapan saja memungkinkan dan menghasilkan peta bayangan hanya ketika pemain berada di dekat volume cahaya. Tetapi sebenarnya ini bahkan lebih menarik.



Sebagian besar lampu dinding adalah lampu sorot, tetapi permainan tidak menghasilkan peta bayangan omnidirectional untuk mereka. Sebagai gantinya, ia menghasilkan shadowmap dan menyalin memori shadowmap itu ke dalam array kubus dari shadowmap sumber titik.





Di sebelah kiri adalah peta bayangan sorotan 1024x1536, di sebelah kanan adalah data gambar yang sama dalam format tekstur kubus 512x512



Perhatikan bahwa peta z linier menyimpan linier z.


Ini menjelaskan mengapa pengembang tidak menggunakan peta bayangan persegi untuk lampu sorot. Jumlah piksel dalam peta bayangan sorotan dan peta kubus sumber titik harus sama. Anda dapat melihat bahwa gambar yang tepat dipotong menjadi beberapa bagian. Itu terjadi karena lebar bayangan peta sorotan dan sumber titik berbeda.



Perhatikan juga bahwa tekstur ini tidak mencakup 360 derajat. Namun, untungnya, sumber pada bangunan biasanya memiliki dinding di sisi belakang, dan kartu bayangan panggang menutupinya.



Poin menarik lainnya adalah prosesnya terbalik. Ambil Saint Denis, misalnya, salah satu kota terbesar dalam permainan. Gim ini menghasilkan peta bayangan omnidirectional untuk sumber lampu sorot dan menyalin data ini ke dalam array peta bayangan sumber lampu sorot. Saya tidak tahu mengapa RDR2 melakukan pemetaan bayangan dengan cara ini. Saya tidak dapat menemukan trik seperti itu di Internet.



Hamparan pencahayaan arah bayangan di RDR2 diimplementasikan hampir sama dengan di GTA5 . Ini adalah Cascaded Shadow Mapping dengan empat kaskade. Setiap ubin 1024x1024 dari tekstur 1024x4096 (dengan pengaturan grafis sedang) digunakan sebagai kaskade.



Bayangan bayangan


Spotlight Shadow Atlas: R16_UNORM



Pencahayaan panggung



Akhirnya saatnya untuk menggabungkan semua peta lingkungan ini, gbuffer, peta bayangan dan buffer ao.



Tahap ini terdiri dari dua lintasan: yang pertama untuk penerangan global (matahari / bulan), yang kedua untuk sumber-sumber lokal.



Global Illumination Pass



Gim ini membuat quad layar penuh untuk menghitung pencahayaan terarah, yang merupakan cahaya bulan di bingkai kami. Ini juga menggunakan pencahayaan yang dipanggang dari "top-down world lightmap" yang disebutkan di atas.



LightPass1


Bagian cahaya lokal



Dalam lintasan ini, gim membuat bentuk bola poli rendah untuk volume sumber titik dan oktagon untuk volume sorotan. Pencahayaan diberikan kembali ke depan menggunakan campuran aditif.



Untuk menghindari panggilan shader yang tidak perlu, penggunaan permainan kedalaman dibatasi pengujian, opsional OpenGL / D3D11 fitur yang telah menjadi penduduk asli untuk Vulkan / D3D12. Ini juga menggunakan pengujian stensil untuk membuang piksel yang diserap oleh objek yang tembus cahaya, seperti jendela kaca. Objek-objek ini akan diberikan selama forward pass.



Lightpass2


Air rendering dan refleksi



Dalam posting ini saya tidak akan berbicara tentang rendering air, karena itu layak mendapat posting terpisah, tetapi saya akan mengatakan sedikit tentang refleksi:



  • Seperti disebutkan di atas, peta lingkungan adalah sumber utama refleksi. Untuk refleksi standar. misalnya, untuk refleksi di windows, game menggunakannya.
  • Cermin diberikan dengan refleksi planar, yang mengubah pemandangan dari arah refleksi. Proses ini juga dilakukan oleh rendering yang ditangguhkan.
  • Refleksi air menggunakan refleksi ruang layar dalam kombinasi dengan peta refleksi yang dihasilkan di awal bingkai.


Tahap naungan langsung



Salah satu kelemahan dari pipa render yang ditangguhkan adalah bahwa tidak mungkin untuk membuat material yang bening dengan GBuffer dengan benar. Untuk mengatasi masalah ini, game merender materi yang tembus pandang dari belakang ke depan menggunakan naungan langsung, seperti kebanyakan menggunakan rendering yang tertunda.



Tetapi akses langsung bisa mahal:



  • , .


, , , . ( ), .


  • .


, . - . - (, ) .


  • , .


Status konveyor harus diubah untuk dapat beralih antara pemangkasan tepi depan dan belakang. Dan perubahan seperti itu bisa mahal.


Pada titik ini, ada target render lain yang dihasilkan untuk efek bloom. Target ini menyimpan kecerahan mekar. Seperti yang dapat Anda lihat pada gambar, objek transparan lebih terang.



BloomMask


Target luminance bloom: R8_UNORM



Perhatikan bahwa kecerahan mekar meningkat pada jarak yang jauh sehingga area berkabut lebih bersinar.


Pengolahan pasca



Pada tahap ini, temporal anti-aliasing, bloom, motion blur, kedalaman efek penglihatan dan efek lainnya dilakukan. Pasca pemrosesan, saya berencana untuk mengabdikan pos terpisah. Karena itu, kami tidak akan membahasnya terlalu banyak di sini, tetapi saya ingin mengatakan beberapa kata tentang mekar. Berkat pencahayaan volumetrik, pada dasarnya render target sudah memiliki cahaya sumber cahaya.



Implementasi bloom di RDR2 sangat mirip dengan implementasi yang dijelaskan dalam Next Generation Post Processing dalam Call of Duty: Advanced Warfare .



  • Target tanpa nilai ambang diambil sebagai input,
  • Berikan target R11G11B10_FLOATlevel 7-mip,
  • Filter bilinear urutan ke-13 untuk downsampling, filter tenda 3x3 untuk upscaling.


Gim kemudian menggabungkan target yang disaring ini dari efek bloom dengan target utama serta target luminance dari bloom.



kesimpulan



Ada banyak lagi yang ingin dikatakan, tetapi saya tidak ingin posting ini terlalu panjang. Saya ingin membagikan temuan saya tentang semua ini, serta beberapa keanehan yang saya temukan selama analisis.



  • , β€” . , . ( , .) bloom: - , , - , . GPU? ?
  • , RDR2 . , (, GBuffers). ? ?
  • : ( ) . SSAO, SSR, . target SSAO ?


Jangan salah, saya tidak menyalahkan siapa pun (walaupun ... Saya kecewa dengan frame rate yang rendah), saya hanya mencoba memahami bagaimana keputusan itu dibuat. Pada akhirnya, banyak orang yang mengerjakan game ini dengan penuh keringat . Mereka mungkin tidak punya cukup waktu untuk lebih mengoptimalkan permainan.



Kata penutup



Itu saja! RDR2 adalah permainan yang tampak hebat, tidak hanya karena grafis yang digunakan, tetapi juga karena seni dan pencahayaan; semuanya terlihat sangat fenomenal. Saya jatuh cinta dengan palet warna game ini. Terutama di malam hari, itu mengingatkan saya pada "Bagaimana seorang pengecut Robert Ford membunuh Jesse James," "Orang Tua Tidak Peduli Di Sini," dan orang Barat lainnya yang difilmkan dengan kamera 35 mm.



All Articles