Teknologi UE5 Nanite di WebGPU
(github.com/Scthe)- Nanite WebGPU adalah proyek yang mengimplementasikan rendering bergaya Nanite milik UE5 di dalam browser dengan WebGPU, mencakup hierarki LOD meshlet, software rasterizer, billboard impostor, serta culling per instance/meshlet
- Implementasi ini menjadikan kesederhanaan prapemrosesan input OBJ di browser dan eksperimen perubahan performa dengan mengubah pengaturan melalui checkbox dan slider sebagai tujuan utama
- Demo menyediakan scene Jinx 640M triangles, Lucy/Dragons, dan scene hingga 1.7B triangles; segitiga putih pada Jinx adalah hasil software rasterization yang diproses dengan kompresi 32-bit karena keterbatasan WebGPU
- Karena WebGPU tidak memiliki
atomic<u64>, software rasterizer efisien berbasis visibility buffer sulit diimplementasikan secara langsung; implementasi saat ini memasukkan depthu16dan octahedron normal2*u8ke dalam 32-bit dengan konsekuensi artefak presisi - Dalam implementasi bergaya Nanite yang sesungguhnya, tantangan utama bukan sekadar jumlah segitiga melainkan mesh simplification dan error metric; penulis menegaskan implementasinya, tidak seperti UE5, tidak memiliki simplification, streaming, compression, visibility buffer, atau 2-pass occlusion culling
Gambaran proyek
- Nanite WebGPU adalah proyek yang mengimplementasikan rendering bergaya Nanite di browser web menggunakan WebGPU
- Elemen utama yang disertakan adalah meshlet LOD hierarchy, software rasterizer, billboard impostor, serta culling per instance dan per meshlet
- Mendukung model bertekstur dan per-vertex normal, serta menyediakan slider atau checkbox untuk tiap pengaturan
- WebGPU hanya dapat digunakan di Chrome
- Seluruh aplikasi dapat dijalankan secara offline dengan Deno, dan unit test shader juga ditulis dengan cara ini
Scene demo dan skalanya
- Demo Jinx memiliki 120×120 instance dengan skala 640M triangles
- Model Jinx tunggal disederhanakan dari 44k triangles menjadi 3k triangles, dengan 59 root meshlets
- Segitiga putih adalah segitiga hasil software rasterization yang berada di antara area hardware rasterization dan impostor pada latar belakang yang jauh
- Lucy and dragons menempatkan masing-masing dua objek sebagai 70×70 instance untuk membentuk 1.7B triangles
- Pada scene sampel, hampir 98% segitiga dirasterisasi lewat software, dan disebutkan bahwa jalur ini jauh lebih cepat daripada hardware
- Lucy adalah scene 110×110 instance dengan 1.2B triangles
- Satu patung Lucy disederhanakan dari 100k triangles menjadi satu root meshlet berisi 86 triangles
- Dragons adalah scene 70×70 instance dengan 1.2B triangles
- Satu dragon disederhanakan dari 250k triangles menjadi satu root meshlet berisi 102 triangles
- Bunnies adalah scene 500×500 instance dengan 1.2B triangles
- Satu bunny disederhanakan dari 5k triangles menjadi satu root meshlet berisi 96 triangles
- Karena ukurannya kecil, sebagian besar bunny terkena frustum culling
Fitur yang diimplementasikan
-
Meshlet LOD hierarchy
- mesh preprocessing dijalankan di browser
- meshoptimizer dan METIS digunakan melalui WebAssembly
- File exporter juga disediakan agar tidak perlu menunggu prapemrosesan di antara refresh halaman
-
Software rasterizer
- WebGPU tidak memiliki
atomic<u64>yang dibutuhkan untuk implementasi efisien - Implementasi saat ini mengemas depth
u16dan normal berkode octahedron2*u8ke dalam 32-bit - Karena batasan 32-bit, presisi banyak dikorbankan, dan tujuannya adalah menunjukkan bahwa rasterizer ini berfungsi
- Batasan ini juga memengaruhi depth pyramid yang digunakan untuk occlusion culling
- WebGPU tidak memiliki
-
Billboard impostors
- Menggunakan 12 gambar di sekitar sumbu UP, lalu melakukan blend dengan dithering sesuai posisi kamera
- Sudut pandang dari atas/bawah tidak ditangani
- Mencakup diffuse dan normal untuk melakukan shading saat runtime
- Impostors preview adalah demo dengan ukuran tekstur impostor yang diperbesar
Culling dan jalur rendering
- Culling terdiri dari beberapa tahap
- Per-instance: frustum culling dan occlusion culling
- Per-meshlet: frustum culling dan occlusion culling
- Per-triangle: hardware backface culling dan z-buffer
- WebGPU tidak memiliki early-z
- occlusion culling hanya menggunakan depth pyramid yang dibuat dari depth buffer frame sebelumnya
- Tidak ada reprojection maupun pendekatan two-pass
- Implementasi saat ini dianggap sudah cukup untuk melakukan culling pada banyak segitiga dan menilai peningkatan performa
- Dapat beralih antara GPU-driven rendering dan implementasi CPU yang sederhana
- Versi CPU tidak memiliki banyak optimasi, tetapi dapat dijalankan langkah demi langkah dengan debugger
- Fitur “Freeze culling” memungkinkan pemeriksaan hanya pada apa yang dirender di frame terakhir sambil menggerakkan kamera
Kemudahan penggunaan dan debugging
- Pergerakan menggunakan
[W, S, A, D], naik/turun menggunakan[Z, SPACEBAR], dan gerak cepat menggunakan[Shift] - Jika hasil terlihat aneh, dapat diperiksa dengan menyalakan dan mematikan opsi culling
- Ada beberapa bug kecil dalam implementasi
- Segitiga putih adalah segitiga yang dirasterisasi lewat software
- Karena WebGPU tidak memiliki
atomic<u64>, depth dan normal dikompresi ke 32-bit - depth 16-bit dapat menimbulkan banyak artefak seperti z-fighting atau leak
- Jika software rasterizer dimatikan, raw Nanite meshlets akan lebih mudah dilihat, tetapi performa bisa turun drastis
- Karena WebGPU tidak memiliki
- FPS dapat berfluktuasi karena VSync paksa dari browser, dan tombol “Profile” digunakan untuk memeriksa timing
Tujuan desain
- Tujuan pertama proyek ini adalah kesederhanaan
- Dimulai dari file OBJ dan seluruh pemrosesan dilakukan di dalam aplikasi
- Tidak memerlukan tahap pra-pemrosesan terpisah seperti export Blender
- Mengarah pada alur yang memungkinkan memasang breakpoint di
loadObjFile()dan mengikutinya sampai frame pertama selesai
- Tujuan kedua adalah eksperimental
- Karena dibuat sebagai halaman web alih-alih dengan Rust dan Vulkan, Anda bisa mengeklik tautan serta mengubah checkbox atau slider untuk melihat perubahan performa
- Anda bisa langsung memeriksa opsi mana yang penting, misalnya saat hanya mengubah satu pengaturan lalu FPS turun drastis
- Banyak kode masih bisa dioptimalkan, tetapi sebelum masalah simplification terselesaikan, optimasi itu dianggap tidak terlalu penting
Perbedaan dari UE5 Nanite
- Error metric menggunakan projected simplification error yang sederhana
- Meshlet simplification menggunakan pendekatan sederhana
- Tidak ada two-pass occlusion culling
- Menambahkannya tidak sulit, tetapi merepotkan untuk di-debug dan menimbulkan interaksi dengan pengaturan GUI
- Karena merusak keterbacaan kode, hal itu tidak sesuai dengan tujuan proyek
- Tidak ada visibility buffer
- Tidak dapat diimplementasikan karena batasan
atomic<u64>
- Tidak dapat diimplementasikan karena batasan
- Tidak ada built-in shadows dan multiview
- Tidak ada work queue di dalam shader
- Untuk meshlet culling dan LOD selection, thread di-dispatch per meshlet
- Tidak ada eviction dan streaming VRAM untuk LOD yang tidak digunakan
- Tidak ada compression
- Skalabilitasnya rendah untuk banyak objek yang berbeda
- Fokusnya pada penggunaan memori yang dapat diprediksi dalam kasus demo
- Perlu mengetahui sebelumnya batas atas drawn meshlets untuk buffer yang menyimpan data antar stage
- Tidak ada implementasi BVH atau hierarki untuk instance
- Frustum dan occlusion culling dilakukan terhadap semua instance
Kondisi yang diwakili oleh jumlah segitiga
- Sulit menilai performa hanya dari angka “puluhan miliar triangles”, dan performa dipengaruhi banyak faktor
-
Dense meshes
- Jika ada banyak dense mesh di dekat kamera, hal itu bisa berdampak buruk pada performa
- Namun, jika cukup dekat hingga menutupi banyak area layar, occlusion culling akan bekerja
- Dense geometry memiliki meshlet kecil, sehingga area yang ditempati di layar kecil dan lebih mudah terkena occlusion/cone culling
-
Instance count
- Setiap instance memiliki transform matrix
mat4x3, sehingga mengonsumsi VRAM - Selama frame, daftar item yang akan dirender juga harus disimpan
- Dalam kasus terburuk, setiap instance merender meshlet yang paling dense
- Dalam implementasi ini dialokasikan
instanceCount * bottomLevelMeshletsCount * sizeof(vec2u)byte - Batas default storage buffer WebGPU di Chrome adalah 128MB, dan scene demo disesuaikan dengan batas ini
- Setiap instance memiliki transform matrix
-
Scene arrangement
- Scene dalam aplikasi menata objek dalam bentuk persegi
- Objek yang jauh hanya terlihat sebagian, tetapi coarse meshlet LOD mencakup area yang lebih luas sehingga menimbulkan overdraw
- Penempatan grid yang rapat merender lebih banyak segitiga dekat, tetapi karena perbedaan kedalamannya kecil, ini menguntungkan bagi occlusion culling
- Objek yang berjauhan dapat menyebabkan piksel jauh acak mencemari depth pyramid
Mengapa scene Jinx sulit
- Karakter Jinx bertubuh ramping dan memiliki ruang kosong antara lengan dan badan, sehingga menyulitkan occlusion culling
- Modelnya tidak tersederhanakan dengan baik, sehingga LOD paling coarse sekalipun masih memiliki 3k triangles
- Muncul situasi di mana banyak segitiga berukuran 1 piksel menumpuk
- Software rasterizer sangat membantu, tetapi karena penataan scene, sebagian besar instance dirender sebagai impostor
- Untuk area dekat, hardware rasterizer yang menangani, dan hardware rasterizer, software rasterizer, serta impostor masing-masing punya keunggulan berbeda
Hal yang mengejutkan dalam implementasi Nanite
- Tujuan DAG bukan sekadar memakai lebih sedikit segitiga untuk objek jauh, melainkan menjaga konsistensi mendekati 1 pixel == 1 triangle di seluruh layar
- Discrete LOD mesh memiliki geometry terpisah untuk tiap LOD, sehingga sulit menangani saat diperlukan tahap perantara; yang dibutuhkan adalah continuous LOD
- Hierarki meshlet memungkinkan geometry di-sampling pada tingkat detail yang dipilih
- Lebih banyak waktu dihabiskan untuk culling dan pekerjaan meshlet daripada untuk Nanite itu sendiri
- Hierarki LOD meshlet mudah dibuat agar berjalan, tetapi sulit dibuat efisien
- Jika mesh tidak tersederhanakan dengan rapi, bisa muncul situasi seperti Jinx, dengan sekitar 3.000 triangles yang menutupi satu piksel saja
- Jika menginginkan pixel-sized triangles, software rasterizer diperlukan, dan billboard impostor juga berguna sebagai fallback yang berfokus pada stabilitas
Masalah mesh simplification
- Simplification bukan masalah “menerima mesh lalu menguranginya menjadi X% triangles”, melainkan masalah yang dilakukan dalam konteks meshlet dan METIS
- UE5 menggunakan mesh simplification code miliknya sendiri sebagai tahap pertama dalam asset pipeline
- Pengurangan biaya di sini memberi manfaat berantai ke seluruh sistem setelahnya
- Dalam materi SIGGRAPH Brian Karis, disebutkan bahwa graph LOD berakhir pada satu root cluster, dan model apa pun dapat disederhanakan hingga 128 triangles
- Model Jinx mengalami masalah karena simplification berhenti pada titik tertentu
- Bahkan jika memasukkan X triangles sebagai input, hasilnya bisa kembali menjadi X triangles yang sama
- Algoritme crash karena assertion
- Setelah itu, bagian mesh yang tidak cukup berkurang diubah agar DAG mengizinkan beberapa root
- Model bunny awalnya disederhanakan menjadi satu meshlet 128 tris, tetapi setelah kondisinya diubah, muncul masalah bahwa ia tidak menuju single root
- Banyak meshlet tidak berhasil cukup mengurangi triangle, dan juga banyak meshlet “tidak penuh” dengan kurang dari 128 triangles
- Diskusi terkait:
Error metric
- Saat merender mesh 20.000.000 triangle sebagai hierarki meshlet, perlu dipilih meshlet mana yang “benar”
- Masalah pemilihan ini adalah inti Nanite, dan simplification, meshlet DAG, serta software rasterizer lebih merupakan prasyarat untuk menanganinya
- Implementasinya menggunakan projected simplification error yang disediakan oleh meshoptimizer
- Penulis menilai metrik ini bukan metrik yang baik untuk Nanite, dan atribut vertex lain juga seharusnya dimasukkan ke dalam fungsi
- Harus bisa memberikan bobot untuk tiap atribut
- Normal pada wajah Jinx menjadi masalah besar
- Referensi yang digunakan:
Mengapa software rasterizer tidak menghasilkan tekstur
- Pada hardware rasterizer, depth texture, color, dan normal dapat ditulis bersama sesuai hasil depth test
- Jika beberapa thread menulis ke piksel yang sama pada software rasterizer, akan terjadi race condition
- Solusi umum untuk ini adalah visibility buffer
- Menghasilkan
sceneUniqueTriangleIddari triangle terdekat untuk tiap pixel - Menggabungkannya dengan depth 32-bit menjadi nilai 64-bit dan menggunakan 64-bit atomic operation
- Pada pass terpisah, triangle dirasterisasi ulang dan barycentric coordinates dihitung untuk shading
- Menghasilkan
- WebGPU tidak memiliki 64-bit atomics sehingga pendekatan ini tidak bisa digunakan
- Tujuan proyek ini adalah menunjukkan bahwa software rasterize dapat bekerja, sehingga model software-rasterize di latar belakang dibuat berwarna putih dan hanya menyediakan shading yang masuk akal
Penilaian terhadap implementasi Nanite sendiri
- Jawaban paling sederhana adalah menggunakan UE5
- Untuk memasukkan teknologi ini ke engine yang sudah ada, penulis menilai perlu lebih dulu mengimplementasikan compute-based graphics pipeline dan GPU-driven rendering pipeline
- Masalah seperti multi-step culling, scene/world chunk management, dan animated meshes akan muncul lebih dulu
- Setelah tahap-tahap ini stabil, urutan yang disarankan adalah mencoba software rasterizer, lalu menambahkan teknologi mirip Nanite
- Pada toy renderer, hierarki meshlet dasar bisa menjadi proyek akhir pekan, tetapi implementasi nyata harus menangani masalah simplification dan error metric
Alat dan referensi yang digunakan
- meshoptimizer adalah fondasi inti implementasi proyek
- Pada versi meshoptimizer yang lebih baru, ada
meshopt_SimplifySparseuntuk membuat clone Nanite - Proyek ini tidak diperbarui ke versi tersebut agar tetap mempertahankan status yang diuji selama pengembangan
- Pada versi meshoptimizer yang lebih baru, ada
- Menggunakan METIS
- Emscripten digunakan untuk menjalankan meshoptimizer dan METIS di browser
- Model Jinx menggunakan Arcane - Jinx dari Sketchfab, dengan penggabungan tekstur, penyesuaian UV, dan penghapusan senjata
1 komentar
Komentar Hacker News
Oh, bagus. Ini bisa dibilang implementasi pihak ketiga untuk pemutaran Nanite
Nanite merepresentasikan mesh grafis dengan sangat cerdas. Ia bukan tree, melainkan directed acyclic graph, sehingga pengulangan menjadi link, bukan salinan; sebuah mesh berbagi sub-mesh, dan sub-mesh itu juga bisa dibagikan lagi. Level of Detail (LOD) internal mesh juga didukung, sehingga sub-mesh akan dikeluarkan ketika sudah cukup kecil
Karena itu, konten berulang yang sangat besar bisa ditangani dengan data terbatas dan waktu rendering yang cepat. Wawasannya adalah bahwa jumlah piksel di layar terbatas, jadi jumlah pekerjaan rendering yang benar-benar diperlukan pun memiliki batas atas
Video SIGGRAPH yang dijelaskan oleh orang dari Epic sangat bagus. Desain GPU saat ini kurang cocok dengan Nanite, sehingga diperlukan operasi hardware baru jika ingin memindahkan lebih banyak pemrosesan ke GPU. Dengan Nvidia yang sedang tersita perhatiannya oleh pasar AI, saya ragu perubahan seperti itu akan terjadi
Agar pendekatan ini efektif, scene perlu memiliki banyak instancing. Ini cocok untuk game AAA yang membuat konten luas dengan memakai ulang sejumlah objek terbatas, seperti aula dengan patung-patung identik dalam demo Unreal Engine. Jika menonton video Cyberpunk 2077 sambil mencari pagar pembatas dan tumpukan sampah, Anda bisa melihat hal-hal yang sama terus berulang dalam konteks yang benar-benar berbeda
Pembuatan mesh Nanite rumit karena banyak offset link internal, dan sejauh ini hanya editor Unreal Engine yang menanganinya. Karena sisi playback sudah menjadi open source, besar kemungkinan seseorang akan membuat tool authoring-nya juga
Namun offset internal dalam format ini bisa menjadi attack surface, dan tampaknya dapat disalahgunakan melalui konten yang dimanipulasi, seperti file Microsoft Word .doc berbahaya
DAG dibuat secara dinamis berdasarkan data vertex, dan tidak berkaitan dengan bagaimana artist menyusun sub-mesh. Ini juga bukan seperti “pengulangan menjadi link”
Selain itu, hasil graph cut berbeda untuk tiap instance objek sehingga instancing tradisional tidak bisa dipakai, jadi saya tidak mengerti mengapa scene harus punya banyak instancing agar efektif
Saat itu saya cukup jauh mengerjakan sesuatu yang mirip Nanite, yang kami sebut compressed mesh. Itu adalah contoh klasik arogansi engineering yang meleset
Pekerjaan awal tampak menjanjikan, tetapi semakin dalam kami menggali masalahnya, semuanya menjadi semakin kompleks. Kami harus membuat seluruh pipeline pembuatan asset, dan lingkupnya terlalu besar untuk diselesaikan tepat waktu dengan hasil yang terlihat bagus tanpa membuat memori meledak
Kami sempat sampai pada tahap yang terlihat seperti merender mesh skala besar dengan Level of Detail bertingkat, tetapi sangat lambat dan harus memaksa GPU bekerja keras untuk mencapai akurasi subpiksel; kalau tidak, hasilnya tampak buruk. Itu eksperimen yang menarik, tetapi terlalu berat untuk hardware, dan tugasnya terlalu besar untuk ditangani sendirian
Ketika Epic memperkenalkan Nanite, saya benar-benar terkejut. Mereka berhasil melakukan hal yang tidak bisa saya lakukan, dengan cara yang jauh lebih baik daripada bayangan terbaik saya. Ini salah satu teknologi yang saat muncul bukan sekadar hype, melainkan benar-benar solusi, dan merupakan permata teknis dalam dunia grafis modern. Seandainya Epic adalah perusahaan publik, saya bahkan akan mempertimbangkan menaruh uang cukup besar hanya karena teknologi Nanite
Video pengantar singkat tingkat tinggi juga cukup bagus. Judulnya "What is virtualized micropolygon geometry? An explainer on Nanite": https://www.youtube.com/watch?v=-50MJf7hyOw
Ada juga tulisan teknis mendalam dari salah satu penulis fitur ini: https://jms55.github.io/posts/2024-06-09-virtual-geometry-be...
Logika Nanite yang saya pahami adalah mempertahankan akurasi mesh kira-kira pada presisi 1 piksel. Misalnya, jika setelah proyeksi perspektif error hanya sekitar setengah piksel, kita bisa memakai mesh detail rendah dengan koordinat yang dibulatkan kira-kira ke 10 bit
Saya samar-samar ingat kuantisasi punya dua peran. Selain mengurangi ukuran penyimpanan data, ia juga membantu pembuatan Level of Detail dengan men-snap vertex ke posisi yang sama di ruang, sehingga duplikasi bisa dihapus setelahnya
Sudah disebut beberapa kali di thread ini, tetapi Bevy juga memiliki implementasi ide Nanite. Kadang ini disebut virtual geometry. Saya adalah penulisnya, jadi bisa menjawab pertanyaan :)
Scthe melakukan pekerjaan yang sangat bagus pada proyek ini. Kami berdiskusi tentang berbagai bagian proses pengerjaannya, dan berdasarkan pengalaman itu kode Bevy juga diperbaiki: https://github.com/bevyengine/bevy/pull/15023
Selalu menyenangkan melihat lebih banyak orang masuk ke bidang ini. Nanite punya begitu banyak ide keren
Apakah demo ini memakai string user agent untuk menentukan kompatibilitas? Itu tidak bagus. Kompatibilitas fitur seharusnya dinilai per kasus dengan mendeteksi atau mencoba fitur tertentu secara langsung
Saya memakai Chromium, bukan Chrome, dan selalu memakai WebGPU, tetapi demo ini menyuruh saya memakai Chrome. Secara etis saya tidak bisa begitu. Saya benar-benar ingin mencoba demo ini, dan proyeknya tampak digarap dengan banyak usaha
Saat membuat framework komponen untuk browser sendiri, deteksi sering kali tidak memungkinkan sehingga saya harus bergantung pada browser sniffing. Kode Modernizr berisi banyak peretasan yang sangat cerdas untuk deteksi fitur, dan kadang peretasan yang sangat kotor. Ada pekerjaan luar biasa besar untuk membuat kode deteksi yang dapat dipercaya, dan deteksi pun biasanya dilakukan lewat efek samping
Dugaan saya, deteksi fitur Web3D tidak sederhana. Dari pencarian cepat pun saya tidak melihat pustaka deteksi fitur Web3D yang jelas
Sebagian kode Modernizr untuk mendeteksi dukungan
:checkedseperti ini:Modernizr.addTest('checked', function(){
return Modernizr.testStyles('#modernizr input {width:100px} #modernizr :checked {width:200px;display:block}', function(elem, rule){
Apakah Anda sudah mengaktifkan izin WebGL untuk situs itu di pengaturan situs? Seingat saya, di tempat saya default-nya mati
WebGPU error [frame][validation]: Fill size (7160950) is not a multiple of 4 bytes.
Ini disertasi doktoral tahun 2009 yang agak tenggelam dari Federico Ponchio, penemu algoritma penyederhanaan mesh dinamis yang menjadi dasar Nanite. Gambarnya juga banyak
https://vcg.isti.cnr.it/~ponchio/download/ponchio_phd.pdf halaman 107
Keren bahwa ini berjalan sampai taraf tertentu, tetapi karena WebGPU tidak memiliki operasi atomik 64-bit, harus ada kompromi yang cukup kasar
Semoga suatu saat ditambahkan sebagai ekstensi opsional. Setidaknya di hardware kelas desktop, dukungan hardware-nya hampir universal. AMD dan Nvidia sudah memilikinya sejak lama, dan Apple mendukungnya mulai M3
Di iPhone 12 Pro Max tertulis tidak ada WebGPU, tetapi setelah saya mengaktifkannya di fitur eksperimental, situs demo WebGPU lain[1] berjalan. Ada yang berhasil menjalankan ini di iPhone? Akan bagus kalau aplikasi web-nya memberi tahu lebih detail apa yang gagal
[1] https://webgpu.github.io/webgpu-samples/?sample=texturedCube
WebGPU error [init][validation]: 6 errors generated while compiling the shader: 50:22: unresolved call target 'pack4x8snorm' 50:9: cannot bitcast from 'â¥' to 'f32' 54:10: unresolved call target 'unpack4x8snorm' 59:22: unresolved call target 'pack4x8unorm' 59:9: cannot bitcast from 'â¥' to 'f32' 63:9: unresolved call target 'unpack4x8unorm'
Nama dan deskripsinya sangat membingungkan dan tampaknya juga berpotensi melanggar merek dagang. Berbeda dari klaimnya, ini sama sekali tidak terkait dengan Nanite asli di UE5, dan tampaknya merupakan implementasi serupa oleh seseorang yang tidak terkait dengan UE5
Ada juga Virtual Geometry milik Bevy yang menyediakan fungsi serupa. Ditulis dalam Rust dan terintegrasi ke game engine, jadi kemungkinan jauh lebih berguna: https://jms55.github.io/posts/2024-06-09-virtual-geometry-be...
Kalau saya mengatakan “mengimplementasikan GPT-3 milik OpenAI dalam JS”, orang akan memahami bahwa saya mengambil arsitektur dari whitepaper lalu mengimplementasikannya ulang
Ini sebenarnya bukan UE5 Nanite yang berjalan di WebGPU. Ini adalah implementasi independen dari ide yang sama seperti Nanite
Teknik ini mulai muncul di beberapa tempat. Memang benar Nanite membuat ide itu terkenal, tetapi Nanite bukan nama tekniknya, melainkan nama implementasi tertentu
Saya penasaran sejauh mana engine lain dalam hal level of detail dan sistem serupa
Godot memiliki fitur level of detail otomatis, dan kelihatannya cukup bagus: https://docs.godotengine.org/en/stable/tutorials/3d/mesh_lod...
Unity juga memiliki sistem level of detail, tetapi meski engine ini populer, model level of detail harus dibuat secara manual: https://docs.unity3d.com/Manual/LevelOfDetail.html kecuali jika mencari plugin di Asset Store
Saya juga melihat pendekatan menarik di engine yang kurang dikenal bernama NeoAxis: https://www.neoaxis.com/docs/html/NeoAxis_Levels.htm Namun performanya sangat buruk di RX580 lama saya, dan saya belum mencobanya di A580 saya sekarang
Menurut saya, dalam kemampuan menampilkan banyak hal di layar, Unreal cukup jauh di depan para pesaingnya. Kekurangannya adalah para artist jadi ingin memasukkan aset berkualitas lebih tinggi ke dalam game, sehingga ukuran instalasi bisa membengkak besar
Biaya performanya juga besar. Nanite atau virtual geometry tidak terlalu cocok dengan GPU modern. Seingat saya, fill rate maksimumnya sekitar 1/4. Ini karena rasterisasi GPU bekerja dalam unit quad 2x2, bukan per piksel seperti shader
Setiap kali melihat scene rendering dengan begitu banyak geometri statis berulang seperti ini, saya teringat suara orang menyebalkan dari video vaporware lama yang menggembar-gemborkan “detail tak terbatas”
Berbeda dengan sesuatu yang lama itu, Nanite tampaknya benar-benar menyelesaikan masalah tersebut. Seingat saya, pihak sana pernah disebut menggunakan sesuatu seperti octree
Menurut rumor online, mereka menggunakan octree, tetapi video-video Euclidean berikutnya dengan tegas membantahnya