La technologie UE5 Nanite dans WebGPU
(github.com/Scthe)Nanite WebGPU
Résumé
- Nanite WebGPU est un projet qui implémente Nanite dans le navigateur web à l’aide de WebGPU.
- Utilisable uniquement dans Chrome.
- Inclut une hiérarchie de LOD de meshlets, un rasterizer logiciel, des imposteurs billboard, etc.
- Prend en charge le frustum culling et l’occlusion culling.
- Prend en charge les textures et les normales de vertex.
- Fonctionne aussi hors ligne avec Deno.
Fonctionnalités
-
Hiérarchie de LOD de meshlets
- Prétraite les meshes dans le navigateur avec WebAssembly.
- Fournit aussi une fonction d’export de fichiers.
-
Rasterizer logiciel
- WebGPU ne prend pas en charge
atomic<u64>. - Compresse la profondeur (
u16) et les normales encodées en octaèdre (2 * u8) sur 32 bits.
- WebGPU ne prend pas en charge
-
Imposteurs billboard
- Affiche un mélange de 12 images selon la position de la caméra.
- Ne traite pas les vues depuis le haut ou le bas.
-
Culling
- Par instance : frustum culling et occlusion culling.
- Par meshlet : frustum culling et occlusion culling.
- Par triangle : backface culling matériel et z-buffer.
-
Bascule possible entre le rendu basé GPU et l’implémentation CPU.
-
Prend en charge simultanément les modèles texturés et divers objets.
-
Possibilité de modifier les paramètres à l’exécution.
-
Fournit des statistiques : mémoire, géométrie, nombre de meshlets, nombre de triangles, etc.
-
Prend en charge un format de fichier personnalisé.
-
Prend en charge la quantification des positions de vertex et les normales encodées en octaèdre.
-
Gère le redimensionnement de la fenêtre.
-
Fonctionne aussi hors ligne avec Deno.
-
Le code WebGPU et WGSL peut être copié dans le projet.
Objectifs
- Simplicité : partir d’un fichier OBJ et tout traiter dans l’application.
- Expérimentation : permettre de tester les performances en modifiant différents réglages.
Scènes de démonstration
- Jinx : 120*120 instances, 640m triangles.
- Lucy et dragon : 70*70 instances, 1.7b triangles.
- Lucy : 110*110 instances, 1.2b triangles.
- Dragon : 70*70 instances, 1.2b triangles.
- Lapin : 500*500 instances, 1.2b triangles.
- Aperçu des imposteurs : augmentation de la taille des textures d’imposteurs.
Utilisation
- Déplacement avec les touches [W, S, A, D], mouvement vertical avec [Z, SPACEBAR].
- Il est possible de corriger des bugs en activant ou désactivant les options de culling.
- Le bouton Profile permet de mesurer les performances.
FAQ
-
Principales différences avec le Nanite de UE5
- La métrique d’erreur de simplification est simple.
- La simplification des meshlets est simple.
- Pas de culling d’occlusion en 2 étapes.
- Pas de file de tâches dans les shaders.
- Pas de suppression ni de streaming en VRAM des LOD inutilisés.
- Pas de visibility buffer.
- Pas d’ombres/multivue intégrées.
- Ne peut pas gérer beaucoup d’objets différents.
- Pas de profiler GPU.
-
Ce que signifient des milliards de triangles
- Les meshes denses peuvent avoir un impact négatif sur les performances.
- Un grand nombre d’instances consomme beaucoup de VRAM.
- L’organisation de la scène influe sur les performances.
-
Ce qui est surprenant avec Nanite
- L’objectif du DAG n’est pas d’utiliser peu de triangles pour les objets éloignés.
- Plus de temps est consacré au culling et au traitement des meshlets qu’à Nanite lui-même.
- La hiérarchie de LOD de meshlets fonctionne facilement.
- Si un mesh ne se simplifie pas proprement, les performances chutent.
-
Simplification de mesh
- De nombreux problèmes peuvent survenir pendant le processus de simplification.
- UE5 utilise son propre code de simplification de mesh.
-
Métrique d’erreur
- Choisir le meshlet approprié est au cœur de Nanite.
-
Faut-il écrire soi-même une implémentation de Nanite ?
- Utiliser UE5 est la méthode la plus simple.
- À des fins d’apprentissage, cela vaut la peine de l’implémenter soi-même.
-
Intérêt du backface cone culling des meshlets
- Efficace sur les meshes denses.
- Peut faire doublon avec l’occlusion culling.
- Les appels WebAssembly peuvent entraîner une baisse des performances.
Récap GN⁺
- Nanite WebGPU est un projet intéressant qui implémente Nanite dans un navigateur web.
- Il optimise les performances grâce à diverses techniques de culling et à un rasterizer logiciel.
- Par rapport à UE5, il diffère dans la simplification et la métrique d’erreur.
- Pour apprendre, l’implémentation directe vaut le détour, mais pour un projet réel, utiliser UE5 peut être préférable.
- Un projet comparable côté fonctionnalités est le Nanite de Unreal Engine 5.
1 commentaires
Commentaires sur Hacker News
L’implémentation tierce de Nanite est intéressante
Bevy dispose aussi de Virtual Geometry, qui implémente les idées de Nanite
Ce n’est pas une bonne chose que la démo détermine la compatibilité à partir de la chaîne user-agent
WebGPU ne fonctionne pas sur un iPhone 12 Pro Max
Il a fallu faire des compromis pour contourner l’absence d’atomiques 64 bits dans WebGPU
Le nom et la description sont confus et pourraient constituer une atteinte à la marque
Comparaison des systèmes de LOD d’autres moteurs
J’ai lu une discussion intéressante sur le forum three.js à propos d’une implémentation de géométrie virtuelle
Question sur l’affirmation selon laquelle un rasterizer logiciel serait plus rapide qu’un rasterizer matériel
Erreur WebGPU lors de l’exécution de la démo jinx sur un M2 Max