1 points par GN⁺ 2024-09-06 | 1 commentaires | Partager sur WhatsApp

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.
  • 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

  1. Simplicité : partir d’un fichier OBJ et tout traiter dans l’application.
  2. 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

    1. L’objectif du DAG n’est pas d’utiliser peu de triangles pour les objets éloignés.
    2. Plus de temps est consacré au culling et au traitement des meshlets qu’à Nanite lui-même.
    3. La hiérarchie de LOD de meshlets fonctionne facilement.
    4. 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

 
GN⁺ 2024-09-06
Commentaires sur Hacker News
  • L’implémentation tierce de Nanite est intéressante

    • Nanite est une manière très astucieuse de représenter des maillages graphiques
    • Les répétitions sont gérées par des liens, et des sous-maillages peuvent être partagés récursivement
    • Le niveau de détail à l’intérieur du maillage est pris en charge, ce qui permet d’éliminer les petits sous-maillages
    • Il est possible de rendre rapidement de grands contenus répétitifs avec peu de données
    • Les conceptions actuelles des GPU ne sont pas adaptées à Nanite, et un nouveau travail matériel est nécessaire
    • La démo d’Unreal Engine montre une scène qui réutilise la même statue à plusieurs reprises
    • La création de maillages Nanite est complexe, et seul l’éditeur d’Unreal Engine le permet actuellement
    • Les offsets internes du format peuvent constituer une surface d’attaque
  • Bevy dispose aussi de Virtual Geometry, qui implémente les idées de Nanite

    • L’auteur de Bevy pourrait répondre directement aux questions
    • Scthe a contribué à améliorer le code de Bevy
  • Ce n’est pas une bonne chose que la démo détermine la compatibilité à partir de la chaîne user-agent

    • La compatibilité des fonctionnalités devrait être détectée et utilisée individuellement
    • J’utilise Chromium et j’utilise souvent WebGPU, mais la démo exige Chrome
  • WebGPU ne fonctionne pas sur un iPhone 12 Pro Max

    • J’ai activé WebGPU dans les fonctionnalités expérimentales, mais cela fonctionne sur d’autres sites web
    • J’aurais aimé que l’application web fournisse davantage d’informations sur la cause de l’échec
  • Il a fallu faire des compromis pour contourner l’absence d’atomiques 64 bits dans WebGPU

    • C’est pris en charge presque universellement sur du matériel de classe desktop
  • Le nom et la description sont confus et pourraient constituer une atteinte à la marque

    • Cela n’a en réalité aucun lien avec le vrai Nanite, et l’implémentation a été faite par quelqu’un sans rapport avec UE5
    • Virtual Geometry de Bevy pourrait être plus utile
  • Comparaison des systèmes de LOD d’autres moteurs

    • Godot fournit un LOD automatique
    • Unity oblige à créer manuellement des modèles LOD
    • NeoAxis a une approche intéressante, mais ses performances ne sont pas bonnes
    • Unreal a beaucoup d’avance pour afficher de nombreux objets à l’écran
  • J’ai lu une discussion intéressante sur le forum three.js à propos d’une implémentation de géométrie virtuelle

    • Les discussions sur les implémentations graphiques web et les compromis étaient intéressantes
  • Question sur l’affirmation selon laquelle un rasterizer logiciel serait plus rapide qu’un rasterizer matériel

    • Le but d’un GPU est d’accélérer la rasterization
    • C’est difficile à comprendre, sauf si le rasterizer logiciel s’exécute sur le GPU
  • Erreur WebGPU lors de l’exécution de la démo jinx sur un M2 Max

    • Message d’erreur : "Fill size (7398781) is not a multiple of 4 bytes"