
Diablo Immortal adalah game role-playing game (ARPG) aksi multiplayer gratis yang dikembangkan bersama oleh Blizzard Entertainment dan NetEase. Diablo Immortal, babak baru dalam seri Diablo, diluncurkan pada tahun 2022. Game ini mengisi kesenjangan cerita antara Diablo 2 dan Diablo 3 serta membuka petualangan baru di sekitar fragmen World Stone, tempat pemain menjelajahi benua Sanctuary untuk melawan iblis dan pasukan yang rusak.
Dengan inovasi arsitektur GPU seluler dan terobosan dalam kemampuan akselerasi hardware, teknologi ray tracing secara bertahap bermigrasi dari desktop ke perangkat seluler, menjadi salah satu pendorong inti rendering grafis fidelitas tinggi. Penghitungan refleksi dinamis yang realistis secara fisik membutuhkan komputasi yang berat, tetapi unit hardware khusus memungkinkan hal ini di platform seluler yang dibatasi daya. Dengan melacak jalur propagasi cahaya melalui tampilan secara real time, teknologi ini akan menyimulasikan perilaku reflektif permukaan kompleks secara akurat seperti cermin, logam, dan cairan. Ray tracing mengatasi batasan spasial dan error perkiraan skema rasterisasi tradisional serta mendukung ekspresi global yang konsisten dari sumber cahaya dinamis, objek di luar layar, dan pantulan multi-level.
Ray tracing hardware di perangkat seluler
Teknologi ray tracing hardware terutama mencakup dua paradigma implementasi: pipeline ray tracing dan kueri ray.
Pipeline ray tracing membuat pipeline lengkap melalui tahap shader khusus (pembuatan sinar / persimpangan / shader hit terdekat). Meskipun dapat mencapai kontrol interaksi sinar yang presisi, pipeline ray tracing memerlukan konfigurasi pipeline independen, yang meningkatkan kompleksitas pengembangan.
Di sisi lain, kueri ray memungkinkan kueri ray dimulai langsung dari shader komputasi atau fragmen tradisional, sehingga menjadikannya teknologi inti untuk ray tracing seluler. Dengan menghilangkan kebutuhan akan pipeline terpisah, kueri ray tidak hanya menyederhanakan proses pengembangan secara signifikan, tetapi juga memiliki tiga keunggulan utama:
- Memberikan kompatibilitas dengan lingkungan komputasi heterogen dan hardware ray tracing yang tidak lengkap
- Mendukung pemanggilan ray tracing on demand pada tahap shading mana pun
- Dengan mengurangi penggunaan resource, memenuhi batasan bandwidth dan daya platform seluler, serta memberikan dasar yang memungkinkan untuk efek lanjutan seperti pencahayaan global dinamis dan refleksi real-time dalam game seluler
Diablo Immortal menggunakan Vulkan untuk memanfaatkan kemampuan ray tracing hardware GPU. Game menghitung jalur sinar cahaya melalui tampilan secara real time dan memperhitungkan properti material yang kompleks untuk mencapai efek refleksi real-time yang inovatif di perangkat Android.


Struktur akselerasi
Struktur akselerasi adalah inti dari pelacakan ray hardware. Struktur akselerasi sangat meningkatkan efisiensi pengujian titik temu sinar melalui pengaturan data hierarkis.
Sistem ini biasanya memiliki dua level: struktur akselerasi level teratas (TLAS) dan struktur akselerasi level bawah (BLAS):
- TLAS berperan sebagai pengelola tampilan — Dengan merekam matriks transformasi spasial (termasuk posisi, rotasi, dan skala) dari semua instance BLAS, TLAS mewujudkan pengaturan global tampilan dinamis. Misalnya, TLAS memungkinkan developer mendistribusikan ratusan instance model hierarki yang sama dalam posisi dan pose yang berbeda dalam tampilan; sehingga, developer hanya perlu memperbarui matriks transformasi objek bergerak setiap frame, bukan merekonstruksi geometri.
- BLAS sebagai unit dasar — Bertanggung jawab untuk mengenkode detail geometris dari satu objek 3D secara efisien, BLAS menetapkan struktur indeks spasial melalui algoritma hierarki volume pembatas (BVH) sehingga area yang tidak relevan dapat dilewati dengan cepat selama deteksi sinar.
Desain hierarkis ini memungkinkan pipeline ray tracing membentuk rantai pendeteksian yang efisien dari ray ==> TLAS (instance objek saringan kasar) ==> BLAS (persimpangan tepatnya).
Memisahkan model dinamis dan statis adalah kunci untuk meminimalkan biaya konstruksi struktur akselerasi:
- Model statis — BLAS hanya perlu dibuat sekali di tahap inisialisasi dan dapat langsung digunakan kembali dalam pemuatan scene berikutnya. Untuk menghindari pemuatan yang lambat dari scene skala besar, teknologi pra-konstruksi asinkron pembingkaian dapat digunakan untuk menyebarkan tugas konstruksi BLAS ke beberapa frame.
- Model dinamis
- Didorong oleh animasi kerangka — Data vertex dengan skin perlu dikomputasi secara paralel oleh compute shader setiap frame untuk menghasilkan buffer vertex baru, lalu memicu update inkremental BLAS yang sesuai, yang menghindari rekonstruksi lengkap untuk meningkatkan performa.
- Transformasi rigid body — Jika hanya transformasi terjemahan/rotasi/zoom yang terlibat, tidak perlu mengubah BLAS, cukup perbarui matriks transformasi dunianya di TLAS, lalu picu proses pembaruan cepat TLAS.
Rekonstruksi berkala sangat penting untuk mempertahankan efisiensi struktur akselerasi dalam scene dinamis ray tracing. Saat objek dinamis mengalami perubahan signifikan dalam topologi geometris, seperti deformasi atau pergeseran vertex berskala besar, pembagian spasial asli dapat gagal, sehingga mengurangi performa deteksi tabrakan selama penelusuran sinar. Akibatnya, rekonstruksi penuh, bukan update inkremental, dari BLAS/TLAS yang sangat dinamis harus dipicu setiap frame N.
Terakhir, untuk mengoptimalkan performa rendering ray-tracing, terapkan strategi pembuatan TLAS dinamis berdasarkan wilayah yang dapat dilihat karakter: hanya model dalam batas radius aktif karakter yang disertakan dalam TLAS untuk mengurangi overhead inti penghitungan interseksi sinar.
Refleksi ray-trace
Refleksi ray-trace memiliki beberapa keunggulan dibandingkan teknik tradisional seperti refleksi ruang layar (SSR) dan refleksi planar (permukaan sederhana yang memproyeksikan tampilan dalam satu dimensi). Refleksi ray-trace menyimulasikan jalur cahaya secara fisik, menangkap objek dinamis di dalam dan di luar tampilan secara akurat, mendukung refleksi alami dari permukaan melengkung dan non-planar, serta memungkinkan beberapa efek pantulan cahaya seperti cermin. Sebaliknya, SSR terbatas pada informasi yang terlihat di layar, dan refleksi planar datar rentan terhadap error visual atau distorsi dalam tampilan yang kompleks.


Secara prinsip, pantulan ray-trace mirip dengan SSR tradisional: pantulan ray-trace memancarkan sinar ke arah pantulan garis pandang berdasarkan piksel demi piksel dan menghitung persimpangan sinar dengan objek adegan. Titik persimpangan yang ditampilkan oleh ray query API berisi informasi geometris (termasuk ID instance, indeks geometri, dan indeks primitif) dan parameter rasterisasi (koordinat barysentris) di tingkat segitiga, tetapi tidak berisi data warna piksel. Solusi umum menggunakan teknologi binding resource bindless untuk mengompilasi semua parameter tekstur dan material dari tampilan ke dalam array indeks global. Dengan menggunakan ID geometris yang ditampilkan oleh kueri ray, properti fisik material yang sesuai (seperti peta normal dan kekasaran) dapat dicari, lalu digabungkan dengan interpolasi koordinat barycentric untuk menghitung informasi shading permukaan, dan nilai warna sebenarnya dari persimpangan dapat direkonstruksi melalui rasterisasi.
Namun, selama proses penerapan, tim Diablo Immortal menemukan dua masalah teknis yang signifikan:
- Model pencahayaan dipaksa untuk disatukan, yang bertentangan dengan sistem bayangan beragam yang terakumulasi dalam histori project dan akan menghasilkan ketidakcocokan antara materi spekular dan materi asli.
- Berbagai format vertex menyebabkan penurunan efisiensi pemilihan cabang petunjuk di tahap rasterisasi, yang merupakan masalah utama dalam anggaran performa yang ketat pada perangkat seluler.
Tim Diablo Immortal secara inovatif memperkenalkan buffering visibilitas untuk memisahkan pemrosesan geometri dari penghitungan bayangan:
- Fase ray tracing — Informasi hit sinar tingkat piksel diambil secara real time
melalui kueri sinar. ID spasial 3D (
InstanceID
denganPrimitiveIndex
) dari titik persimpangan dienkode menjadi ID visibilitas ringkas dan ditulis ke dalam buffering ruang layar. - Tahap pewarnaan — Serupa dengan operasi yang dilakukan oleh shader vektor dan piksel, ID geometris dalam buffering visibilitas diuraikan secara dinamis, properti vektor (seperti UV dan normal) dan peta material berbasis fisik dari model asli diambil, dan penghitungan bayangan yang terkait dengan jenis material akhirnya dilakukan.
Solusi ini memungkinkan aset gambar terhubung ke sistem refleksi ray-trace tanpa harus mengubah format vertex atau shader.
Langkah-langkah rendering tertentu
Kartu kueri ray
Sesuai dengan tahap ray tracing dan menghasilkan buffering visibilitas untuk pantulan ruang layar:
- Color0
- Format:R32G32UInt
- R = TriangleID,G = Barycentrics

- Kedalaman:
- Format:Depth32F
- D = EncodeAsFloat(InstanceIdx, GeometryIdx)
- ID material persimpangan dienkode dalam floating point 32-bit dan ditulis ke buffering kedalaman untuk tahap berikutnya dari teknik deteksi pencocokan kedalaman coding material

Dibandingkan dengan compute shader, kueri ray di pixel shader memiliki keuntungan berikut:
- Integrasi pipeline — Pipeline disematkan langsung ke dalam pipeline rendering maju/ditangguhkan yang ada, mempertahankan kontinuitas status pipeline render.
- Pengoptimalan bandwidth seluler — Untuk arsitektur berbasis kartu seluler,
kompresi lossless on-chip dapat dipicu saat data hit sinar ditulis ke
RenderTarget
, sehingga mengurangi konsumsi bandwidth memori dibandingkan dengan output shader komputasi tradisional ke buffering. - Kontrol jumlah sinar — Area non-reflektif dapat ditandai dan ditolak melalui fase pra-penghitungan yang dikombinasikan dengan pengujian stencil.
Menyelesaikan kartu
Pada tahap pewarnaan (lihat Refleksi ray-traced), tim Diablo Immortal mencapai pencocokan identifikasi yang cepat dengan menggunakan unit hardware pengujian kedalaman dan melakukan pewarnaan material dalam batch berturut-turut.
Untuk setiap materi, kartu gambar layar penuh akan dikeluarkan. Vertex shader merekonstruksi ID yang dienkode dari materi saat ini secara dinamis. Dengan menggunakan Uji Kesamaan Kedalaman, ID dibandingkan dengan nilai yang dienkode dalam buffering kedalaman, dan hanya piksel yang nilai yang dienkodenya sama persis yang dipertahankan, yaitu, piksel yang termasuk dalam Instance material saat ini. Piksel yang disimpan akan menjalankan shader material yang sesuai.
Selanjutnya, reproduksi material presisi tinggi diterapkan di shader piksel:
- Dekode data geometri — Mengekstrak ID segitiga (
MeshID
+PrimitiveID
) dan koordinat barycentric dari buffering visibilitas dan memuat atribut vertex (posisi, UV, normal, dll.) secara dinamis dari segitiga yang sesuai dari buffering vertex. Karena setiap model diarsir sebagai bahan independen, fitur lanjutan seperti binding tidak diperlukan. - Rekonstruksi parameter permukaan — Menghitung koordinat UV di persimpangan menggunakan interpolasi koordinat barysentrik. Rasterisasi software dilakukan untuk mengambil sampel peta berdasarkan UV yang diinterpolasi.
- Penggunaan kembali penghitungan bayangan — Secara langsung menggunakan kembali kode shader yang ada untuk mempertahankan logika material yang sama dengan pipeline rendering utama.

Terakhir, model yang benar-benar berpartisipasi dalam penghitungan refleksi hanya mempertimbangkan sebagian kecil dari tampilan. Data identifikasi model refleksi yang ditampilkan oleh GPU dapat dibaca secara asinkron untuk menghilangkan model/materi yang tidak berpartisipasi dalam refleksi, sehingga secara efektif mengurangi jumlah panggilan gambar (panggilan gambar terjadi saat materi dan mesh dikirim ke GPU untuk menggambar) di tahap shading.
Pantulan specular berbasis fisika
Untuk mencapai pantulan fidelitas tinggi, permukaan reflektif diklasifikasikan sebagai salah satu dari tiga jenis menurut kekasaran:
- Tidak ada refleksi — Penghitungan refleksi untuk platform ini dapat dilewati untuk menghemat resource. Jika permukaan sangat kasar, pantulan menjadi buram dan redup, sehingga kontribusinya tidak jelas.
- Pantulan cermin — Seperti cermin yang halus, gambar yang dipantulkan jelas dan tidak buram. Ambil gambar garis langsung ke arah pantulan dari garis pandang.
- Refleksi glossy — Refleksi dengan kekasaran permukaan tertentu disimulasikan berdasarkan sampling prioritas GGX, yang dapat mempertimbangkan efisiensi komputasi dan akurasi fisik. Pantulan menyimpang ke arah utama pantulan spekular saat memancarkan garis, yang meningkatkan efisiensi sampling area sorotan.
Untuk mendapatkan kualitas gambar yang dapat digunakan dengan konsumsi daya terbatas, tim Diablo Immortal mengadopsi solusi 1SPP+Denoiser. Artinya, tim Diablo Immortal mengambil satu sampel per piksel,lalu algoritma pengurangan derau temporal/spasial digunakan untuk menghaluskan derau dalam jumlah besar yang diperkenalkan oleh frekuensi sampling rendah.
Tim Diablo Immortal memilih Reflection Denoiser di AMD FidelityFX Denoiser, denoiser berperforma tinggi yang dioptimalkan untuk refleksi ray-trace dan refleksi ruang layar. Keunggulan inti Reflection Denoiser adalah algoritma pengurangan derau campuran spasial-temporal denoiser: dengan menggabungkan frame saat ini dan data frame historis (berdasarkan kompensasi gerakan), yang dikombinasikan dengan teknik pemfilteran spasial (seperti pemfilteran retensi tepi terpandu varians), Reflection Denoiser secara efisien menghilangkan derau dan menghasilkan efek refleksi yang halus pada sampling yang sangat rendah.
Untuk beradaptasi dengan karakteristik pipeline render yang dikembangkan sendiri dan memenuhi batasan performa seluler yang ketat, tim Diablo Immortal telah menerapkan penyederhanaan yang ditargetkan dan adaptasi arsitektur saat mengintegrasikan AMD FidelityFX Reflection Denoiser.
Ray tracing fidelitas tinggi dengan Vulkan
Diablo Immortal berjalan di berbagai perangkat Android yang mendukung Vulkan tempat tim Diablo Immortal memanfaatkan kemampuan ray-tracing hardware GPU yang inovatif. Vulkan mengurangi overhead dan hambatan pengembangan, sehingga memfasilitasi pengiriman konten dan gameplay Diablo Immortal berkualitas tinggi kepada pengguna Android.