La tecnología Nanite de UE5 en WebGPU
(github.com/Scthe)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.
- WebGPU no soporta
-
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
- Simplicidad: comenzar con archivos OBJ y procesar todo dentro de la app.
- 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
- El objetivo del DAG no es usar pocos triángulos para objetos lejanos.
- Se dedica más tiempo al culling y al trabajo con meshlets que al propio Nanite.
- La jerarquía LOD de meshlets funciona con facilidad.
- 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
Comentarios en Hacker News
La implementación de terceros de Nanite es interesante
Bevy también tiene Virtual Geometry, que implementa las ideas de Nanite
No está bien que la demo determine la compatibilidad usando la cadena del user-agent
WebGPU no funciona en un iPhone 12 Pro Max
Hizo falta un compromiso para resolver la falta de atómicos de 64 bits en WebGPU
El nombre y la descripción son confusos y podrían implicar una posible infracción de marca
Comparación de sistemas LOD de otros motores
Leí una discusión interesante en el foro de three.js sobre la implementación de geometría virtual
Pregunta sobre la afirmación de que un rasterizador por software es más rápido que un rasterizador por hardware
Error de WebGPU al ejecutar la demo de jinx en un M2 Max