1 puntos por GN⁺ 2024-09-06 | 1 comentarios | Compartir por WhatsApp

Nanite WebGPU

Resumen

  • Nanite WebGPU es un proyecto que implementa Nanite en el navegador web usando WebGPU.
  • Solo se puede usar en Chrome.
  • Incluye jerarquía LOD de meshlets, rasterizador por software, billboard impostors, entre otros.
  • Soporta frustum culling y occlusion culling.
  • Soporta texturas y normales de vértices.
  • Funciona también sin conexión usando Deno.

Funciones

  • Jerarquía LOD de meshlets

    • Preprocesa las mallas en el navegador usando WebAssembly.
    • También ofrece función de exportación de archivos.
  • Rasterizador por software

    • WebGPU no soporta atomic<u64>.
    • Comprime la profundidad (u16) y las normales codificadas en octaedro (2 * u8) en 32 bits.
  • Billboard impostors

    • Muestra una mezcla de 12 imágenes según la posición de la cámara.
    • No maneja vistas desde arriba y abajo.
  • Culling

    • Por instancia: frustum culling y occlusion culling.
    • Por meshlet: frustum culling y occlusion culling.
    • Por triángulo: backface culling por hardware y z-buffer.
  • Se puede alternar entre renderizado basado en GPU e implementación en CPU.

  • Soporta modelos con texturas y varios objetos al mismo tiempo.

  • Permite cambiar parámetros en tiempo de ejecución.

  • Proporciona estadísticas: memoria, geometría, número de meshlets, número de triángulos, etc.

  • Soporta formato de archivo personalizado.

  • Soporta cuantización de posiciones de vértices y normales codificadas en octaedro.

  • Maneja el cambio de tamaño de la ventana.

  • Funciona también sin conexión usando Deno.

  • El código de WebGPU y WGSL se puede copiar al proyecto.

Objetivos

  1. Simplicidad: comenzar con archivos OBJ y procesar todo dentro de la app.
  2. Experimentación: poder cambiar distintas configuraciones para probar el rendimiento.

Escenas de demostración

  • Jinx: 120*120 instancias, 640m triángulos.
  • Lucy y dragón: 70*70 instancias, 1.7b triángulos.
  • Lucy: 110*110 instancias, 1.2b triángulos.
  • Dragón: 70*70 instancias, 1.2b triángulos.
  • Conejo: 500*500 instancias, 1.2b triángulos.
  • Vista previa de impostors: aumento del tamaño de las texturas de impostors.

Uso

  • Muévete con las teclas [W, S, A, D] y sube o baja con [Z, SPACEBAR].
  • Puedes corregir errores alternando las opciones de culling.
  • Puedes medir el rendimiento usando el botón Profile.

FAQ

  • Diferencias principales con Nanite de UE5

    • La métrica de error de simplificación es simple.
    • La simplificación de meshlets es simple.
    • No hay occlusion culling en dos etapas.
    • No hay cola de trabajo en los shaders.
    • No hay eliminación ni streaming de LOD no usados desde la VRAM.
    • No hay visibility buffer.
    • No hay sombras/multivista integradas.
    • No puede manejar muchos objetos distintos.
    • No hay perfilador de GPU.
  • Qué significa tener miles de millones de triángulos

    • Las mallas densas pueden afectar negativamente el rendimiento.
    • Una gran cantidad de instancias consume mucha VRAM.
    • La disposición de la escena afecta el rendimiento.
  • Aspectos sorprendentes de Nanite

    1. El objetivo del DAG no es usar pocos triángulos para objetos lejanos.
    2. Se dedica más tiempo al culling y al trabajo con meshlets que al propio Nanite.
    3. La jerarquía LOD de meshlets funciona con facilidad.
    4. Si la malla no se simplifica limpiamente, el rendimiento baja.
  • Simplificación de mallas

    • Pueden surgir muchos problemas durante el proceso de simplificación.
    • UE5 usa su propio código de simplificación de mallas.
  • Métrica de error

    • Elegir el meshlet adecuado es la clave de Nanite.
  • ¿Conviene escribir tu propia implementación de Nanite?

    • Usar UE5 es la forma más sencilla.
    • Para fines de aprendizaje, vale la pena implementarlo por cuenta propia.
  • Valor del backface cone culling de meshlets

    • Es efectivo en mallas densas.
    • Puede solaparse con el occlusion culling.
    • Puede haber pérdida de rendimiento por las llamadas a WebAssembly.

Resumen de GN⁺

  • Nanite WebGPU es un proyecto interesante que implementa Nanite en el navegador web.
  • Optimiza el rendimiento mediante varias técnicas de culling y un rasterizador por software.
  • Frente a UE5, hay diferencias en la simplificación y en la métrica de error.
  • Para aprender, implementarlo por cuenta propia puede valer la pena, pero en proyectos reales quizá sea mejor usar UE5.
  • Un proyecto similar en funcionalidades es Nanite de Unreal Engine 5.

1 comentarios

 
GN⁺ 2024-09-06
Comentarios en Hacker News
  • La implementación de terceros de Nanite es interesante

    • Nanite es una forma muy ingeniosa de representar mallas gráficas
    • Las repeticiones se manejan con enlaces y se pueden compartir submallas de forma recursiva
    • Soporta niveles de detalle dentro de la malla, por lo que se eliminan las submallas pequeñas
    • Puede renderizar rápidamente contenido repetido a gran escala con pocos datos
    • El diseño actual de las GPU no encaja con Nanite y se necesita trabajo en nuevo hardware
    • La demo de Unreal Engine muestra una escena que reutiliza repetidamente la misma estatua
    • Crear mallas Nanite es complejo y actualmente solo es posible desde el editor de Unreal Engine
    • Los offsets internos del formato podrían ofrecer una superficie de ataque
  • Bevy también tiene Virtual Geometry, que implementa las ideas de Nanite

    • El autor de Bevy puede responder preguntas directamente
    • Scthe contribuye a mejorar el código de Bevy
  • No está bien que la demo determine la compatibilidad usando la cadena del user-agent

    • La compatibilidad de funciones debería detectarse y usarse de forma individual
    • Estoy usando Chromium y uso WebGPU con frecuencia, pero la demo exige Chrome
  • WebGPU no funciona en un iPhone 12 Pro Max

    • Activé WebGPU en las funciones experimentales, pero en otros sitios sí funciona
    • Ojalá la web app diera más información sobre la causa del fallo
  • Hizo falta un compromiso para resolver la falta de atómicos de 64 bits en WebGPU

    • En hardware de nivel escritorio, el soporte es casi universal
  • El nombre y la descripción son confusos y podrían implicar una posible infracción de marca

    • No tiene relación con el Nanite real y fue implementado por alguien ajeno a UE5
    • Virtual Geometry de Bevy podría ser más útil
  • Comparación de sistemas LOD de otros motores

    • Godot ofrece LOD automático
    • Unity requiere crear manualmente los modelos LOD
    • NeoAxis tiene un enfoque interesante, pero su rendimiento no es bueno
    • Unreal está muy por delante para mostrar muchos objetos en pantalla
  • Leí una discusión interesante en el foro de three.js sobre la implementación de geometría virtual

    • Fueron interesantes las discusiones y los trade-offs sobre la implementación de gráficos web
  • Pregunta sobre la afirmación de que un rasterizador por software es más rápido que un rasterizador por hardware

    • El propósito de la GPU es acelerar la rasterización
    • Es difícil de entender, salvo que el rasterizador por software se ejecute en la GPU
  • Error de WebGPU al ejecutar la demo de jinx en un M2 Max

    • Aparece el mensaje de error "Fill size (7398781) is not a multiple of 4 bytes"