เทคโนโลยี UE5 Nanite บน WebGPU
(github.com/Scthe)Nanite WebGPU
สรุป
- Nanite WebGPU เป็นโปรเจกต์ที่นำ Nanite มาทำงานบนเว็บเบราว์เซอร์ด้วย WebGPU
- ใช้งานได้เฉพาะบน Chrome
- มี ลำดับชั้น Meshlet LOD, ซอฟต์แวร์แรสเตอร์ไรเซอร์, Billboard Impostor เป็นต้น
- รองรับ frustum culling และ occlusion culling
- รองรับ texture และ vertex normal
- ทำงานแบบออฟไลน์ได้ด้วย Deno
ความสามารถ
-
ลำดับชั้น Meshlet LOD
- พรีโปรเซส mesh ในเบราว์เซอร์ด้วย WebAssembly
- มีฟังก์ชันส่งออกไฟล์ด้วย
-
ซอฟต์แวร์แรสเตอร์ไรเซอร์
- WebGPU ไม่รองรับ
atomic<u64> - บีบอัด depth (
u16) และ normal ที่เข้ารหัสแบบ octahedron (2 * u8) ให้เหลือ 32 บิต
- WebGPU ไม่รองรับ
-
Billboard Impostor
- แสดงผลด้วยการผสมภาพ 12 ภาพตามตำแหน่งกล้อง
- ไม่รองรับมุมมองจากด้านบนและด้านล่าง
-
Culling
- ต่อ instance: frustum culling และ occlusion culling
- ต่อ Meshlet: frustum culling และ occlusion culling
- ต่อสามเหลี่ยม: hardware backface culling และ z-buffer
-
สลับระหว่าง การเรนเดอร์บน GPU และ การทำงานบน CPU ได้
-
รองรับ โมเดลที่มี texture และ อ็อบเจ็กต์หลายแบบ พร้อมกัน
-
เปลี่ยนพารามิเตอร์ได้ ขณะรันไทม์
-
มี ข้อมูลสถิติ เช่น หน่วยความจำ เรขาคณิต จำนวน meshlet จำนวนสามเหลี่ยม เป็นต้น
-
รองรับ ฟอร์แมตไฟล์แบบกำหนดเอง
-
รองรับ การควอนไทซ์ตำแหน่ง vertex และ normal ที่เข้ารหัสแบบ octahedron
-
รองรับการ ปรับขนาดหน้าต่าง
-
ทำงานแบบออฟไลน์ได้ด้วย Deno
-
สามารถคัดลอก โค้ด WebGPU และ WGSL ไปใช้ในโปรเจกต์ได้
เป้าหมาย
- ความเรียบง่าย: เริ่มจากไฟล์ OBJ และจัดการทุกอย่างภายในแอป
- การทดลอง: สามารถเปลี่ยนค่าต่าง ๆ เพื่อทดสอบประสิทธิภาพได้
ฉากเดโม
- Jinx: 120*120 instances, 640m triangles
- Lucy และ Dragon: 70*70 instances, 1.7b triangles
- Lucy: 110*110 instances, 1.2b triangles
- Dragon: 70*70 instances, 1.2b triangles
- Rabbit: 500*500 instances, 1.2b triangles
- พรีวิว Impostor: เพิ่มขนาด texture ของ impostor
วิธีใช้งาน
- ใช้ปุ่ม [W, S, A, D] เพื่อเคลื่อนที่ และ [Z, SPACEBAR] เพื่อขึ้นลง
- สามารถสลับตัวเลือก culling เพื่อแก้บั๊กได้
- ใช้ปุ่ม Profile เพื่อวัดประสิทธิภาพได้
FAQ
-
ความแตกต่างหลักจาก Nanite ของ UE5
- เมตริกข้อผิดพลาดของการลดความซับซ้อนยังเรียบง่าย
- การลดความซับซ้อนของ Meshlet ยังเรียบง่าย
- ไม่มี 2-stage occlusion culling
- ไม่มี work queue ใน shader
- ไม่มีการลบ LOD ที่ไม่ได้ใช้งานออกจาก VRAM และไม่มีการสตรีม
- ไม่มี visibility buffer
- ไม่มี shadow/multiview ในตัว
- ไม่สามารถจัดการอ็อบเจ็กต์ต่างชนิดจำนวนมากได้
- ไม่มี GPU profiler
-
ความหมายของจำนวนสามเหลี่ยมระดับหลายพันล้าน
- mesh ที่หนาแน่นอาจส่งผลลบต่อประสิทธิภาพ
- จำนวน instances ที่มากใช้ VRAM สูง
- การจัดวางฉากมีผลต่อประสิทธิภาพ
-
สิ่งที่น่าประหลาดใจเกี่ยวกับ Nanite
- เป้าหมายของ DAG ไม่ใช่การใช้จำนวนสามเหลี่ยมน้อยลงสำหรับวัตถุที่อยู่ไกล
- ใช้เวลากับ culling และงานของ Meshlet มากกว่าตัว Nanite เอง
- ลำดับชั้น Meshlet LOD ทำงานได้ง่ายกว่าที่คิด
- ถ้า mesh ไม่ถูกลดความซับซ้อนอย่างสะอาด ประสิทธิภาพจะลดลง
-
การลดความซับซ้อนของ mesh
- ระหว่างกระบวนการลดความซับซ้อนอาจเกิดปัญหาได้มาก
- UE5 ใช้โค้ดลดความซับซ้อนของ mesh ของตัวเอง
-
เมตริกข้อผิดพลาด
- การเลือก Meshlet ที่เหมาะสมคือหัวใจของ Nanite
-
ควรเขียน implementation ของ Nanite เองหรือไม่?
- การใช้ UE5 เป็นวิธีที่ง่ายที่สุด
- หากเพื่อการเรียนรู้ การลองทำเองก็น่าสนใจ
-
ความคุ้มค่าของ Meshlet backface cone culling
- มีประสิทธิภาพกับ mesh ที่หนาแน่น
- อาจซ้ำซ้อนกับ occlusion culling
- อาจเกิดประสิทธิภาพตกจากการเรียกใช้ WebAssembly
สรุปโดย GN⁺
- Nanite WebGPU เป็นโปรเจกต์ที่น่าสนใจซึ่งนำ Nanite มาทำงานบนเว็บเบราว์เซอร์
- ปรับแต่งประสิทธิภาพด้วยเทคนิค culling หลายแบบและซอฟต์แวร์แรสเตอร์ไรเซอร์
- เมื่อเทียบกับ UE5 มีความต่างในด้านการลดความซับซ้อนและเมตริกข้อผิดพลาด
- หากเพื่อการเรียนรู้ การลองทำเองก็น่าสนใจ แต่ในโปรเจกต์จริงการใช้ UE5 อาจเหมาะกว่า
- โปรเจกต์ที่มีความสามารถคล้ายกันคือ Nanite ของ Unreal Engine 5
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
การนำ Nanite ไปทำใหม่โดยบุคคลที่สามน่าสนใจ
Bevy ก็มี Virtual Geometry ที่นำแนวคิดของ Nanite ไปใช้เช่นกัน
การที่เดโมใช้สตริง user agent เพื่อตัดสินความเข้ากันได้ไม่ใช่แนวทางที่ดี
WebGPU ใช้งานไม่ได้บน iPhone 12 Pro Max
ต้องมีการประนีประนอมเพื่อแก้ปัญหาการขาด 64-bit atomic ใน WebGPU
ชื่อและคำอธิบายทำให้สับสน และอาจมีความเสี่ยงเรื่องการละเมิดเครื่องหมายการค้า
การเปรียบเทียบระบบ LOD ของเอนจินอื่นๆ
ได้อ่านการสนทนาที่น่าสนใจในฟอรัม three.js เกี่ยวกับการทำ virtual geometry
มีคำถามต่อคำกล่าวอ้างที่ว่า software rasterizer เร็วกว่า hardware rasterizer
เกิดข้อผิดพลาด WebGPU ระหว่างรันเดโม jinx บน M2 Max