Nanite es el sistema de geometría virtualizada de Unreal Engine que emplea un nuevo formato de malla interna y tecnología de renderizado que permite obtener detalles a escala de píxel y una gran cantidad de objetos. Trabaja de forma inteligente únicamente en los detalles que se pueden percibir y nada más. El formato de datos de Nanite también está muy comprimido y permite la retransmisión detallada con un nivel de detalle automático.
Ventajas de Nanite
Aumento de múltiples órdenes de magnitud en la complejidad geométrica, mayor número de triángulos y objetos de lo que ha sido posible hasta ahora en tiempo real.
Los límites de fotogramas ya no están condicionados por el conteo de polígonos, las llamadas de trazado y el uso de la memoria de malla.
Ahora se pueden importar directamente fuentes artísticas de calidad cinematográfica, como esculturas ZBrush y fotogrametría.
Utiliza detalles formados por muchos polígonos en vez de hacer un baking de los detalles en las texturas de los mapas de normales.
El nivel de detalle (LOD) se gestiona de forma automática de modo que ya no es necesario configurar manualmente los LOD de cada malla.
Las pérdidas de calidad son poco frecuentes o inexistentes, especialmente con las transiciones de LOD.
Aunque las ventajas pueden ser revolucionarias, siguen existiendo límites prácticos. Por ejemplo, el recuento de instancias, los triángulos por malla, la complejidad de los materiales, la resolución de salida y el rendimiento se deberían medir minuciosamente para cada combinación de contenido y hardware. Nanite no dejará de ampliar sus posibilidades y mejorar su rendimiento en las futuras versiones de Unreal Engine.
Diferencias entre una malla de Nanite y una malla estática
Una malla de Nanite es una malla estática con la opción Nanite activada. Una malla de Nanite en el fondo sigue siendo una malla de triángulos con mucho nivel de detalle y compresión aplicada a sus datos. Además, Nanite utiliza un sistema completamente nuevo para el renderizado de ese formato de datos de una forma extremadamente eficiente.
Todo lo necesario para que una malla estática aproveche las ventajas de Nanite es un indicador que lo active. La creación de contenido para Nanite no es muy diferente a la de las mallas tradicionales, salvo que Nanite puede manejar órdenes de magnitud de más triángulos e instancias de lo que es posible para la geometría renderizada tradicionalmente. Acerca la cámara lo suficiente y Nanite trazará los triángulos fuente originales importados.
Las mallas de Nanite admiten múltiples UV y colores de vértices. Los materiales se asignan a secciones de la malla de tal forma que esos materiales pueden utilizar diferentes modelos de sombreado y efectos dinámicos que se pueden hacer en los sombreadores. La asignación de materiales se puede intercambiar dinámicamente, al igual que con cualquier otra malla estática, y Nanite no requiere ningún proceso de bake de materiales.
Las texturas virtuales no son obligatorias para Nanite, pero son muy recomendables. Las texturas virtuales son una característica ortogonal de Unreal Engine cuyos objetivos para los datos de textura son similares a los que Nanite consigue con los datos de malla.
El funcionamiento de Nanite debería resultar muy parecido al de los procesos de trabajo de las mallas estáticas, pero hay muchas cosas que aún no son compatibles. Consulta la sección Características compatibles de esta página para obtener más información.
¿Cómo funciona Nanite?
Nanite se integra sin problemas en los procesos de trabajo de los motores existentes, a la vez que utiliza un enfoque innovador para guardar y renderizar los datos de las mallas.
Durante la importación: las mallas se analizan y se descomponen en clústeres jerárquicos de grupos de triángulos.
Durante el renderizado: los clústeres se intercambian sobre la marcha con distintos niveles de detalle según la vista de la cámara, y se conectan perfectamente y sin fisuras con los clústeres vecinos dentro del mismo objeto. Los datos se transmiten bajo demanda, de modo que solo los detalles visibles permanecen en la memoria. Nanite se ejecuta en su propia pasada de renderizado, prescindiendo por completo de las llamadas de trazado tradicionales. Se pueden utilizar modos de visualización para inspeccionar el proceso de Nanite.
Puesto que Nanite se basa en la capacidad de retransmitir rápidamente datos de malla desde el disco a la carta, se recomiendan las unidades de estado sólido (o SSD) para el almacenamiento en tiempo de ejecución.
¿Para qué tipos de mallas se debería utilizar Nanite?
Por norma general, Nanite debería activarse siempre que sea posible. Lo normal es que cualquier malla estática que lo tenga activado se renderice más rápido y ocupe menos espacio en memoria y en disco.
Más concretamente, una malla es una candidata especialmente buena para Nanite si:
Contiene muchos triángulos, o tiene triángulos que aparecerán muy pequeños en pantalla.
Tiene muchas instancias en la escena.
Actúa como un oclusor importante de otra geometría Nanite.
Proyecta sombras mediante mapas de sombras virtuales.
Una excepción a estas reglas es, por ejemplo, una esfera celeste: sus triángulos serán grandes en pantalla, no ocluye nada y solo hay una en la escena. Normalmente, estas excepciones son raras y la pérdida de rendimiento al utilizar Nanite con ellas es mínima, así que recomendamos no preocuparse demasiado por los casos en los que Nanite no debería estar activado si Nanite es compatible con el caso de uso.
Actualmente, Nanite no es compatible con algunos casos de uso. Consulta la sección Características compatibles de esta página para obtener más información.
Cómo activar la compatibilidad de Nanite con las mallas
Nanite se puede activar en la geometría compatible de las siguientes formas:
La conversión de la geometría a Nanite necesita cierto tiempo de procesamiento para cada malla. En proyectos grandes, el uso de una caché de datos derivados (DDC) compartida resulta especialmente útil si hay muchos recursos de Nanite. Consulta la documentación de la DDC compartida si quieres más información.
Cómo importar una malla
Al importar una malla destinada a ser utilizada con Nanite, activa la casilla Compilar Nanite.
Recomendamos desactivar la propiedad Generar mapas UV de iluminación cuando no se utilice la iluminación precalculada con Lightmass.
Cuando esta propiedad está activada, la geometría con muchos detalles añade un tiempo considerable a la importación y compilación de datos de la malla estática. La propiedad también añade un canal de UV adicional, el cual incluye una cantidad importante de datos para mallas muy densas. En caso de que tu proyecto no requiera iluminación baked, no hace falta que asumas ninguno de los dos costes.
Cómo activar Nanite en los recursos
En los casos en los que ya tengas el proyecto rellenado con contenido en el que quieras activar Nanite, dispones de dos opciones: activar recursos por lotes utilizando el explorador de contenido, o activar recursos individuales a través de sus propios editores.
Activar Nanite en mallas por lotes
Para los lotes de recursos de malla estática o esquelética en los que quieras activar Nanite, usa el explorador de contenido para seleccionarlos todos. Haz clic con el botón derecho y selecciona Nanite > Activar en el menú contextual.
Cómo activar Nanite en mallas individuales
Abre el editor de cualquier malla compatible con Nanite, como las mallas estáticas y las colecciones geométricas (mallas de fractura basadas en la física de Chaos), y activa Nanite en el panel Detalles.
En el Editor de mallas estáticas, busca la opción Configuración de Nanite y marca la casilla Activar compatibilidad con Nanite.
En el Editor de colecciones geométricas, localiza la sección Nanite y marca la casilla Activar Nanite.
Funciones compatibles de Nanite
Esta sección detalla la mejor forma de utilizar Nanite en un proyecto de Unreal Engine, con información sobre lo que es y lo que no es compatible y las posibles limitaciones.
Geometría
Nanite se puede habilitar en mallas estáticas y colecciones geométricas.
Una malla con Nanite se puede utilizar con los siguientes tipos de componentes:
Malla estática
Malla esquelética
Malla estática con instanciado
Malla de spline
Malla estática con instanciado jerárquico
Colección geométrica
Pintor de follaje
Césped de paisaje
Nanite ofrece una capacidad limitada para la deformación de mallas rígidas. Nanite es compatible con la traslación dinámica, la rotación y el escalado no uniforme de estas mallas, tanto si es dinámica como estática. Esto implica mover cualquier posición de una malla de Nanite de un modo más complejo de lo que se puede expresar en una sola multiplicación de matriz 4x3, aplicada uniformemente a toda la malla.
La deformación está limitada con:
(Beta) Compensación de la posición global (WPO) en materiales.
Las mallas de Nanite que usan el desplazamiento de la WPO se dividen en conjuntos más pequeños, cada uno de los cuales tiene sus propios límites individuales y se seleccionan individualmente en la GPU. Fija el WPO para gestionar cuántos clústeres de la malla de Nanite se criban.
El follaje que utiliza la WPO es menos problemático porque el follaje está lleno de huecos y realmente no puede ocluirse.
La deformación no es compatible con:
Objetivos de transformación
La cantidad máxima de instancias que pueden estar presentes en la escena está bloqueada a 16 millones de instancias, incluyendo todas las instancias que se transmiten, no solo las activadas para su uso con Nanite. Solo las instancias retransmitidas se contabilizan en el total.
Las tangentes por vértice no se almacenan desde la malla estática cuando se activa para Nanite. En cambio, el espacio tangente se deriva implícitamente en el sombreador de píxeles. Los datos de tangentes no se guardan para reducir el tamaño de los datos. Esta diferencia en el espacio tangente al utilizar este enfoque podría causar discontinuidades en los bordes. No obstante, este problema en particular no ha demostrado ser significativo, y hay planes para ofrecer compatibilidad con las tangentes de vértice en una futura versión.
Materiales
Nanite es compatible con materiales cuyo modo de mezcla esté definido como Opaco y Con máscara. Cuando se detecta un tipo de material que no es compatible, se asigna un material por defecto a la malla habilitada para Nanite y aparece una advertencia en el registro de salida con información adicional.
Notas adicionales sobre las características de los materiales:
Las mallas habilitadas para Nanite pueden recibir pegatinas proyectadas sobre sus superficies, pero no son compatibles con pegatinas de malla, que requieren que los materiales utilicen un modo de mezcla traslúcido.
La casilla de verificación Estructura alámbrica no es compatible.
El nodo Interpolador de vértices y las UV personalizadas son compatibles, pero se evaluarán tres veces por píxel.
Los nodos de expresión personalizados o cualquier nodo que los utilice (como la función de material
ParallaxOcclusionMapping) pueden provocar artefactos con Nanite. Esto es de esperar, ya que Nanite aún no es compatible con las derivadas analíticas.
Renderizado
Las siguientes funciones de renderizado no son compatibles en estos momentos:
Filtrado de objetos específico de la vista con:
Radio mínimo de pantalla
Cribado de distancia
Renderizado directo
Renderizado estéreo para realidad virtual
Pantalla dividida
Antialiasing de muestreo múltiple (MSAA)
Canales de iluminación
Trazado de rayos contra mallas de Nanite
La malla imprecisa se utiliza por defecto en las mallas habilitadas para Nanite. Disminuye el parámetro Error relativo alternativo en el Editor de mallas estáticas para utilizar más triángulos de la malla de origen.
(Experimental) la compatibilidad inicial con el trazado de rayos nativo de mallas de Nanite se activa con la variable de consola
r.RayTracing.Nanite.Mode 1. De esta forma, se conservan todos los detalles y se utiliza mucha menos memoria de la GPU que con las mallas imprecisas sin errores.
Algunos modos de visualización aún no son compatibles con los modos de visualización de mallas de Nanite.
Ten cuidado con algunos modos de visualización en el Editor de mallas estáticas al visualizar geometría muy detallada. La visualización de normales y UV puede causar problemas con el rendimiento del editor.
Plataformas compatibles
Actualmente, Nanite es compatible con PlayStation 5, Xbox Series S|X y PC con tarjetas gráficas que cumplan estas especificaciones, utilizando los controladores más recientes con DirectX 12 con Shader Model 6 (SM6):
NVIDIA: tarjeta de la generación Maxwell o posteriores.
AMD: tarjeta de la generación GCN o posteriores.
Compatible con todas las versiones más recientes de Windows 10 (anteriores a la versión 1909.1350) y Windows 11 compatibles con SDK DirectX 12 Agility.
Windows 10, versión 1909: el número de revisión debe ser igual o superior a 1350.
Windows 10, versión 2004 y 20H2. El número de revisión debe ser superior o igual a .789.
DirectX 12 (con atómicos de Shader Model 6.6) o Vulkan (VK_KHR_shader_atomic_int64).
Chip de Apple M2 o modelos posteriores.
Linux con NVIDIA GeForce 2080 o modelos posteriores.
Controladores gráficos más recientes
PlayStation 4 y Xbox One también son compatibles con Nanite, pero actualmente la compatibilidad en estas plataformas se considera experimental. Cabe esperar que el rendimiento de Nanite en estas plataformas con contenidos de muy alta fidelidad no cumpla los requisitos de un juego comercializable.
Para obtener más información sobre las especificaciones de hardware y software recomendadas por Epic Games, consulta la sección Especificaciones de hardware y software.
Malla imprecisa de Nanite y ajustes de precisión
Las mallas estáticas y esqueléticas incluyen propiedades adicionales que controlan la precisión de la representación de Nanite y la malla alternativa generada a partir de la malla a todo detalle.
Estos ajustes se encuentran en el panel Detalles del editor de mallas en la sección Configuración de Nanite.
La configuración de Nanite incluye las siguientes propiedades:
| Propiedad | Descripción |
|---|---|
Habilitar la compatibilidad con Nanite | Permite utilizar esta malla con Nanite y generar una malla imprecisa en situaciones donde no se pueda utilizar Nanite. |
Conservar superficie | Permite que las mallas de Nanite que perderían superficie debido a la simplificación redistribuyan esa superficie perdida entre los triángulos restantes dilatando los bordes límite abiertos. Esto es muy útil para el follaje, en el que las hojas tienden a convertirse en triángulos y cuadriláteros independientes debido a la simplificación. El efecto de esta configuración es aumentar la escala de cada hoja. Para las cintas de geometría, como las briznas de hierba, tiene el efecto de hacerlas más gruesas. Esta configuración debe habilitarse en todas las mallas de follaje y nada más. |
Tangentes explícitas | Si se activa, las tangentes del modelo original se almacenan y utilizan por recurso. Este ajuste significa que las tangentes se almacenan explícitamente en el disco en lugar de derivarse implícitamente en tiempo de ejecución. El ajuste Precisión de tangente pasa a estar disponible para un control adicional de las tangentes de los vértices. Activar esta opción aumenta el almacenamiento en aproximadamente un 10 %, pero puede ser preferible cuando las tangentes implícitas no son lo suficientemente precisas. |
UV de interpolación lineal | Determina si se interpolan los UV al simplificar. Si es posible, debería estar habilitado. En el caso de coordenadas UV reales, esta opción permite calcular los UV óptimos de menor error para nuevos vértices al simplificar. Lo que hace es adoptar los UV como coordenadas normales de textura e interpolarlas a través de la cara de los triángulos. Debe deshabilitarse si los datos almacenados de los UV no son válidos para interpolar; por ejemplo, si los índices se almacenan en los UV. No tendría sentido hacer una interpolación lineal de un índice, y se estropearía el sombreador. Si está deshabilitado, no se tendrán en cuenta los errores de los UV cuando Nanite seleccione el LOD de renderizado, ya que por lo general es imposible razonar los errores de atributos arbitrarios de vértices no interpolables. |
Precisión de posición | Elige la precisión que debería utilizar esta malla al generar las posiciones de vértice de una malla de Nanite. Auto determina la precisión adecuada según el tamaño de la malla. La precisión se puede anular para mejorar la precisión u optimizar el espacio en disco. |
Precisión normal | Elige la precisión que debería utilizar esta malla al generar las normales de vértice de una malla de Nanite. Auto determina la precisión adecuada según el tamaño de la malla. La precisión se puede anular para mejorar la precisión u optimizar el espacio en disco. |
Residencia mínima (geometría raíz) | Establece el tamaño de byte de memoria que esta malla debería mantener siempre en memoria, y hace que el resto se transmita. Los valores superiores requieren más memoria, pero para algunas mallas, esto puede reducir los problemas de saltos durante la transmisión. |
Mantener porcentaje de triángulos | El porcentaje de triángulos a mantener de la malla de origen. Disminuye este porcentaje para optimizar el tamaño en disco. |
Reducir error relativo | Establece la cantidad máxima de error relativo que se permite eliminar para la malla de Nanite. Se eliminan todos los detalles de la malla de origen cuyo impacto visual sea inferior a esta cantidad de error relativo. El error relativo no tiene un tamaño unitario y es relativo al tamaño de la malla. De forma predeterminada, Nanite almacena todos los triángulos de la malla de origen. |
Objetivo alternativo | Determina qué sistema de marcado utilizar al generar una malla alternativa. Auto: crea automáticamente una malla imprecisa en función de la configuración del proyecto. Porcentaje de triángulos imprecisos: establece el porcentaje de triángulos que permanecen al reducir la malla de origen para Nanite. Error relativo alternativo: se reducirá hasta alcanzar el error especificado en relación con el tamaño de la malla. Se eliminan todos los detalles de la malla alternativa generada cuyo impacto visual sea inferior a esta cantidad de error relativo. |
Nombre del archivo de importación de origen | La ruta del archivo utilizada para importar una malla de alta resolución que se utilizará con Nanite. La versión de alta resolución de la malla se utiliza en lugar de LOD0 por los sistemas que pueden beneficiarse de una geometría más detallada, como Nanite y Modelado geométrico en Unreal Engine. |
Canal UV de desplazamiento | Canal UV que se debe utilizar al muestrear mapas de desplazamiento. |
Mapas de desplazamiento | Añade y edita mapas de desplazamiento. |
Factor de longitud máxima de borde | Controla la distancia máxima permitida entre cada vértice de la malla en pantalla. Se puede utilizar para evitar la simplificación excesiva de mallas que están destinadas a deformarse (por ejemplo, animación mediante desfase de la posición en el mundo y mallas de spline). Debe dejarse en 0 por defecto a no ser que sea explícitamente necesario para solucionar problemas de simplificación excesiva. |
Precisión de vértice
Nanite cuantiza las posiciones de los vértices de la malla para maximizar la densidad de memoria y minimizar el espacio en disco. El tamaño de paso de cuantización es una potencia de dos que se puede seleccionar para que coincida con los requisitos de mallas individuales mediante la propiedad Precisión de posición. Por defecto, Auto elige la precisión adecuada según el tamaño de la malla y su densidad de triángulos. Puedes anularlo manualmente seleccionando un tamaño de precisión para mejorar la precisión u optimizar el espacio en disco.
La cuantización es una forma de compresión con pérdidas. La compresión con pérdidas resulta especialmente complicada cuando se trabaja con piezas de malla modulares u otras mallas que comparten límites. Sobre todo cuando esos límites tienen que alinearse perfectamente para no introducir agujeros o grietas en la geometría.
A fin de garantizar la coherencia, la cuantización se realiza en coordenadas de objeto sin normalizar centradas en el origen de la malla. De este modo se garantiza que la cuantización nunca cause fisuras cuando la malla utiliza los mismos ajustes de precisión y la traslación entre el centro de la malla es un múltiplo de esa precisión.
Reducción de datos
En ocasiones es necesario reducir la cantidad de datos que almacena Nanite para optimizar el tamaño del disco. Nanite incluye configuraciones que te permiten reducir los datos detallados de una malla de Nanite almacenada en cualquier momento de la producción, lo que implica que puedes sobrepasar la calidad de forma segura desde el principio y ajustarla en consecuencia más adelante.
Para reducir los datos detallados, tendrás que utilizar las propiedades Mantener porcentaje de triángulos y Reducir error relativo. Esto equivale a una opción de eliminación antes de almacenarse como una malla de Nanite. En el caso de Nanite, el detalle no tiene por qué ser uniforme en toda la malla. Se eliminan primero los datos menos significativos y es más parecida a la compresión con pérdidas.
Utiliza Mantener porcentaje de triángulos para establecer el porcentaje de triángulos de la malla de origen a mantener.
Utiliza Reducir error relativo para establecer la cantidad máxima de error relativo que se permite al reducir los datos de la malla de origen. Cualquier triángulo que, de eliminarse, incurriría en un error relativo inferior a esta cantidad se elimina. Dicho de otro modo, todos los detalles con un impacto visual inferior a este valor se recortan. El error relativo no tiene un tamaño unitario y es relativo al tamaño de la malla.
Por defecto, no se recorta nada y Nanite almacena todos los triángulos de la malla original.
Es importante recortar los datos para reducir el tamaño en disco (es decir, el tamaño de la descarga), y no para mejorar el rendimiento. Si quieres más información, consulta la sección Tamaño de datos.
Malla imprecisa
Muchas partes de Unreal Engine necesitan acceder al búfer de vértices tradicional facilitado por las mallas renderizadas tradicionalmente. Cuando se activa Nanite para una malla estática, se genera una representación aproximada (denominada malla alternativa) de la malla detallada. La malla alternativa es la malla generada que se utiliza cuando el renderizado de Nanite no es compatible. También se utiliza en situaciones donde no sería ideal utilizar la malla detallada, por ejemplo, cuando se necesita una colisión compleja, utilizar mapas de luz para la iluminación baked, y para los reflejos con trazado de rayos por hardware con Lumen.
La propiedad Porcentaje de triángulos imprecisos representa el porcentaje de triángulos de la malla de origen que se utiliza para generar la malla imprecisa. Puedes especificar el porcentaje de triángulos a conservar entre 0 y 100 por ciento, en el que los porcentajes más grandes conservan más detalles de la malla original.
La opción Error relativo alternativo establece la cantidad máxima de error relativo que se permite al eliminar detalles de la malla de origen. Cualquier triángulo que, de eliminarse, incurriría en un error relativo inferior a esta cantidad se elimina, siendo los detalles de menor impacto visual los primeros en desaparecer. El error relativo no tiene un tamaño unitario y es relativo al tamaño de la malla.
Por ejemplo, si quisieras que la malla no tuviera ningún tipo de diezmamiento, tendrías que utilizar un porcentaje de triángulos imprecisos de 100 y un error relativo alternativo de 0.
En la comparación que se muestra a continuación, está la malla de Nanite muy detallada creada a partir de la malla de origen original que se compara con los ajustes por defecto de una malla imprecisa de Nanite generada.
Utiliza el error relativo alternativo para especificar cuánto detalle original se conserva de la malla de origen, y el porcentaje impreciso para establecer cuánto detalle se utiliza.
En la comparación que se muestra a continuación, la malla imprecisa mantiene el 100% del porcentaje de triángulos imprecisos, pero ajusta el error relativo alternativo para utilizar más triángulos de la malla de origen. Al ajustar estos valores, puedes utilizar los detalles de Nanite para los triángulos de Nanite en el visor como un indicador al cambiar sus valores.
Visualización de la malla imprecisa
En el Editor de mallas estáticas, puedes alternar entre la malla de Nanite completamente detallada y la malla imprecisa de Nanite utilizando la opción Nanite imprecisa de los visores en el menú desplegable Mostrar. También puedes utilizar el atajo de teclado Ctrl + N para alternar rápidamente entre las dos opciones de visualización.
Cómo utilizar los LOD de malla imprecisa personalizados para mallas de Nanite
La malla alternativa se utiliza para las funciones del motor, como colisiones complejas por polígono, trazado de rayos, baking de luz, etc. También se utiliza para plataformas que no son compatibles con Nanite. Al generar la malla imprecisa, una malla habilitada para Nanite siempre usa la ranura LOD0 de la malla de origen para generar automáticamente la malla alternativa. No obstante, a veces conviene utilizar una malla alternativa especificada manualmente, o una serie de LOD tradicionales, en vez de una generada automáticamente.
Este nivel de control te permitiría utilizar Nanite en un proyecto pero también controlar directamente la geometría presente en reflejos con trazado de rayos, o en plataformas que no son compatibles con Nanite.
Para especificar una malla imprecisa personalizada o utilizar una serie de LOD, sigue los pasos que se indican a continuación:
Establece el Porcentaje de triángulo impreciso en 0 para que la malla imprecisa sea lo más pequeña posible, ya que será ignorada cuando se utilice este planteamiento.
Añade uno o más niveles de detalle (LOD) a la malla utilizando este procedimiento tradicional de configuración de los LOD.
Utiliza el menú desplegable Importar LOD para importar LOD de nivel 1 desde la sección Configuración de LOD.
Establece el LOD mínimo en 1 en la sección Configuración de LOD. De este modo, se ignora la malla alternativa generada por Nanite.
La colisión compleja es un caso especial. Utiliza la propiedad LOD para colisión en Ajustes generales para especificar qué LOD se debería utilizar para la colisión. Se puede usar cualquier LOD para la colisión, incluido el LOD0.
Es posible que este método en particular no sea viable para hacer que los proyectos de Nanite sean compatibles de forma automática con plataformas que no son compatibles con Nanite, y debe probarse y evaluarse para tu proyecto.
Nanite maneja de forma eficiente una gran cantidad de instancias, pero si Nanite está desactivado, podría haber una cantidad abrumadora de llamadas de trazado para el proceso de renderizado tradicional. Puedes comprobar la viabilidad de esto en tu proyecto mediante r.Nanite 0 para activar y desactivar la compatibilidad con Nanite.
Consulta la sección Variables y comandos de consola de esta página si quieres más información.
Cómo trabajar con contenido activado para Nanite
En la mayoría de los casos, Nanite se adapta muy bien a la resolución de la pantalla. Para conseguirlo, se basa en dos técnicas: el nivel de detalle preciso y la eliminación de obstrucciones. Normalmente, esto significa que, independientemente de la complejidad geométrica de los datos de origen en la escena, el número de triángulos que Nanite intenta trazar realmente en la pantalla es coherente y proporcional al número de píxeles.
Nanite se basa en el principio de diseño de que no tiene sentido dibujar muchos más triángulos que píxeles.
No obstante, existen algunos casos de contenido que rompen las técnicas que Nanite utiliza para escalar, pero esto no significa que no se deba utilizar en absoluto para este contenido, o que no se renderice más rápido que el proceso de renderizado tradicional. Solo significa que, para este tipo de contenido, ya no se les aplica el escalado con píxeles (y no la complejidad de la escena). Utiliza las funciones de generación de perfiles que ofrece Unreal Engine para controlar este tipo de situaciones cuando se producen.
Geometría de agregados
La geometría de agregados es aquella que tiene muchas partes inconexas que se convierten en un volumen en la distancia, como el pelo, las hojas de los árboles y el césped. Este tipo de geometría rompe el nivel de detalle y las técnicas de eliminación de obstrucciones de Nanite. Nanite es intrínsecamente una estructura de nivel de detalle jerárquico que se basa en la capacidad de simplificar triángulos pequeños en triángulos más grandes y elegir el más grueso cuando determina que la diferencia es menor de lo que se puede percibir. Para superficies continuas, esto funciona bien, pero no para geometrías de agregados que desde lejos parecen más una nube parcialmente opaca que una superficie sólida. Por ello, es más probable que Nanite determine que no puede reducir la geometría de agregados de forma tan agresiva como lo haría con las superficies sólidas convencionales, o que resulta en el trazado de más triángulos para el mismo número de píxeles cubiertos.
Otra optimización que rompe la geometría de agregados es la eliminación de obstrucciones. Aunque es muy precisa, su granularidad no es por píxel. La geometría llena de huecos ―y lo que es peor, capas y capas de geometría llena de huecos― provoca una superposición excesiva, ya que es necesario acumular muchas capas de profundidad antes de que esa zona de la pantalla bloquee todo lo que haya detrás. Una forma de verlo es considerar una región de 8 x 8 píxeles en la pantalla y la cantidad de capas de profundidad que hay que dibujar antes de rellenar cada píxel. Una superposición excesiva significa que para el mismo número de píxeles cubiertos, Nanite intenta dibujar más triángulos ocasionando un renderizado más lento.
El follaje es el caso más obvio que causa problemas con la eliminación de obstrucciones, pero aún así, esto no significa que Nanite no se debería utilizar en mallas con follaje. Consulta la sección Follaje con Nanite que aparece más adelante si quieres más información. Es conveniente experimentar con diferentes casos de uso y ver qué funciona bien para tus proyectos. Utiliza herramientas de creación de perfiles para confirmar el buen rendimiento de Nanite con este tipo de mallas.
Superficies estrechamente apiladas
La eliminación de obstrucciones con mallas tradicionales hace que los procesos de trabajo de kitbashing sean casi imposibles a gran escala por sus limitaciones prácticas. La naturaleza detallada de la eliminación de obstrucciones con Nanite permite utilizar este tipo de procesos de trabajo durante el desarrollo con menos preocupaciones. Tal y como se explica en la sección anterior, Geometría de agregados, la superposición de píxeles puede deberse a que las superficies ocultas estén muy cerca de las superficies visibles situadas debajo de ellas. Si una geometría está enterrada muy por debajo de la superficie visible, Nanite la detecta y la elimina de forma casi sin coste, hasta el punto de que en la mayoría de los casos puede considerarse sin coste alguno. Sin embargo, cuando existe geometría apilada que está muy próxima entre sí cerca de la superficie superior, Nanite no puede determinar cuál está arriba o abajo, provocando que ambas se dibujen a la vez.
Este problema concreto con el cribado es el peor escenario posible, en el que Nanite no distingue qué superficie está en la parte superior, y simplemente dibuja todas las capas en su lugar. Este tipo de imprecisiones varían con el tamaño de la pantalla y la distancia, por lo que si bien 10 centímetros pueden separar capas y verse bien mientras se está cerca de la superficie, a distancias mayores la diferencia de distancia puede ser inferior a un píxel, lo que provocaría una superposición.
En el ejemplo que se muestra a continuación, si la cámara se mueve para mirar hacia abajo en la zona donde el personaje está de pie, la visualización de superposición de píxeles de Nanite muestra cómo se están renderizando estas superficies apiladas. Las zonas más iluminadas indican que se está produciendo más superposición en esas zonas que en otras.
La visualización de superposición es la forma más eficaz de encontrar problemas de este tipo. Aunque cabe esperar cierta cantidad de superposición, una cantidad excesiva provocará un aumento en los costes de cribado y rasterización de Nanite, y el escalado de Nanite independientemente de la complejidad de la escena será menos efectivo en el proceso.
Normales facetadas y de bordes duros
Un problema que se debe tener en cuenta es cuando se importan mallas con mucho detalle que tienen normales facetadas, es decir, que la normal entre dos polígonos diferentes no se ha suavizado. Este problema es frecuente y fácil de pasar por alto, y conviene tener cuidado para evitarlo, ya que una cantidad reducida de vértices compartidos en una malla puede resultar significativamente más cara, tanto en rendimiento de renderizado como en tamaño de datos. Lo ideal sería que la cantidad de vértices de una malla fuera inferior a la cantidad de triángulos que tiene. Si la proporción es de 2:1 o superior, lo más probable es que haya un problema, sobre todo si esto resulta en un recuento elevado de triángulos. Una proporción de 3:1 significa que la malla es completamente facetada y que cada triángulo tiene sus propios tres vértices, y ninguno de ellos se comparte con otro triángulo. En la mayoría de los casos, esto se debe a que las normales no coinciden debido a que no están suavizadas.
Por lo tanto, un mayor número de vértices significa más datos que almacenar. También conlleva más trabajo de transformación de vértices, y las proporciones superiores a 2:1 hacen que el renderizado sea más lento. El uso intencionado en el modelado de superficies rígidas no debería causar ningún problema, y no hay ninguna razón para no utilizarlas. No obstante, las mallas muy densas con un 100 % de facetas accidentales son mucho más caras de lo previsto. Otra cosa a tener en cuenta son las normales importadas en superficies densas de tipo orgánico generadas en otros paquetes de la DCC que tienen umbrales de normales bien definidos que pueden ser lógicos en mallas de menos polígonos, pero pueden añadir gastos innecesarios con Nanite.
Por ejemplo, en las dos mallas que aparecen a continuación, la malla de la izquierda tiene las normales facetadas mientras que la de la derecha tiene las normales suavizadas. Al compararlas mediante la visualización de triángulos de Nanite, se aprecian diferencias notables en el número de triángulos utilizados por Nanite para dibujarlas. La facetada de la izquierda dibuja muchos más triángulos que la suavizada de la derecha.
Mallas con Nanite y normales facetadas (izquierda) y suavizadas (derecha) | Visualización de triángulos de mallas con Nanite y normales facetadas (izquierda) y suavizadas (derecha) |
Haz clic en la imagen para verla a tamaño completo. | Haz clic en la imagen para verla a tamaño completo. |
Malla esquelética de Nanite
Esta función es experimental.
Las mallas esqueléticas de Nanite son compatibles con:
Una nueva API de malla esquelética que simplifica el renderizado.
Una llamada de trazado para una malla entera.
Sombreado a partir de mapas de sombras virtuales.
LOD sin geometría. La malla esquelética de Nanite utiliza LOD de animación.
Instanciado con bancos de animación.
Follaje utilizando Nanite
El follaje que utiliza Nanite se considera en fase beta y se está investigando y desarrollando activamente. Esta sección ofrece orientación sobre el uso de la geometría del follaje con Nanite.
Para recursos como árboles con la configuración predeterminada de Nanite, es posible que las copas tiendan a reducirse con la distancia. Estos casos son una forma particular de geometría de agregados en la que cada parte independiente (una hoja o brizna de hierba) tiene bordes abiertos en su límite. La activación de Conservar superficie resulta útil para evitar esta reducción cuando Nanite está habilitado. Cuando Nanite simplifica la geometría en la distancia reduciendo el número de triángulos, al final tiene que empezar a eliminar por completo algunos de estos elementos independientes. Si Nanite no dispone de más información, el resultado parecerá más reducido porque ha habido una gran pérdida de superficie. Conservar zona redistribuirá esa zona perdida entre los triángulos restantes dilatando los bordes límite abiertos. La dilatación para las formas simétricas como las hojas tiene el mismo efecto que escalarlas. En los casos de formas no simétricas como cintas, por ejemplo briznas de hierba, tiene el efecto de hacerlas más gruesas.
Recomendamos utilizar Conservar superficie para todas las mallas de follaje, pero no para las mallas que no vayan a usarse como follaje de escena.
La visualización del clúster de Nanite proporciona una vista más clara de cómo Conservar superficie redistribuye la superficie perdida.
A continuación se ofrecen algunas recomendaciones a la hora de utilizar y crear recursos de follaje teniendo en cuenta Nanite. Todavía estamos probando y aprendiendo cuáles son los mejores planteamientos. De momento, hemos visto que el follaje utilizando Nanite debe ser creado de forma diferente que antes, pero si juegas con sus puntos fuertes puedes obtener resultados más rápidos y de mayor calidad con Nanite.
Utiliza Conservar superficie (activada en el Editor de mallas estáticas).
Utiliza geometría en vez de tarjetas con máscara.
Los materiales con máscara son más costosos que los opacos. Probablemente, los resultados más rápidos se obtienen si no se utilizan en absoluto.
El método tradicional de tarjetas (muchos elementos se representan con una sola tarjeta) con Nanite puede ser más lento que sin Nanite. No esperes que activar Nanite en el follaje basado en tarjetas suponga siempre una mejora de rendimiento.
Los píxeles con máscara cuestan casi tanto como los píxeles dibujados.
La geometría de follaje ha demostrado ser más rápida con Nanite que con los enfoques por tarjeta, tanto con tarjetas de Nanite como sin ellas. También se ve mejor.
El paquete Megascans: Grass disponible en Fab ofrece buenos ejemplos para realizar pruebas. El paquete ofrece tanto geometría con máscara y formada por muchos polígonos, en la que cada elemento es independiente, como tarjetas con máscara y formadas por pocos polígonos, en las que muchos elementos están representados por una sola tarjeta.
Al utilizar la compensación de la posición global (WPO), cuantos más vértices, mayor coste. La lógica de WPO debe ser limitada y supervisada.
Los problemas explicados en la sección Geometría de agregados de esta página siguen sucediendo. Los bosques densos (como en los ejemplos anteriores) se renderizarán mucho más despacio que la misma escena con todas las mallas sustituidas por formas sólidas del mismo número de triángulos.
Cómo usar el desplazamiento máximo de la posición del mundo con Nanite
En tus materiales e instancias de material, puedes usar el ajuste Desplazamiento máximo de la posición del mundo para establecer un límite superior en la cantidad de compensación que puede tener el WPO. Esto puede ser especialmente útil para las mallas de Nanite, ya que se dividen en conjuntos más pequeños, cada uno de los cuales tiene sus propios límites y se criban individualmente en la GPU. Fijar el WPO es una buena forma de solucionar este problema.
El ajuste Desplazamiento máximo de la posición del mundo se encuentra en la categoría Detalles > Compensación de la posición global del material o en Anulaciones de propiedades del material en una instancia de material.
Para obtener más información, consulta Propiedades de materiales.
Mapeo de desplazamiento estático de Nanite
Esta función es experimental.
El editor de mallas estáticas incluye una opción para añadir detalles a las mallas habilitadas para Nanite mediante un teselador adaptable sin conexión. El teselador genera una malla de Nanite optimizada usando mapas de desplazamiento integrados. Este enfoque de texturas no es destructivo y permite controlar la cantidad de teselado y desplazamiento a través de parámetros escalares.
En el panel Detalles, en Configuración de Nanite, haz lo siguiente:
Establece Reducir error relativo en un valor distinto a 0 para controlar la cantidad de teselado.
Un buen valor por defecto es 0.04, pero debe mantenerse por encima de 0.02. Este valor determina un nivel de error al teselar la malla. Si es demasiado pequeño, simplemente utilizará muchos triángulos e incrementará los tiempos de compilación.
Añade mapas de desplazamiento.
Despliega el elemento Índice y añade una textura para utilizarla como desplazamiento.
Si tu malla tiene más de una ranura de material, cada índice de mapas de desplazamiento se asigna a la ranura de material correspondiente. Por ejemplo, la ranura de material 0 se asigna al índice 0 de los mapas de desplazamiento, la ranura de material 1 al mapa 1, y así sucesivamente.
Establece una magnitud para controlar la cantidad de desplazamiento.
Haz clic en Aplicar cambios.
Teselado de Nanite
Esta función es experimental.
El teselado de Nanite es un desplazamiento dinámico programable que permite modificar las mallas de Nanite en tiempo de ejecución mediante un mapa de desplazamiento o un material procedimental. A diferencia del desfase de la posición en el mundo, que solo puede actuar en los vértices originales de la malla, el desplazamiento de Nanite tesela la malla en tiempo de ejecución en triángulos adicionales para ajustarse al detalle del mapa de desplazamiento. Solo se generan los detalles del triángulo necesarios para la densidad de píxeles actual.
Entre las ventajas del teselado de Nanite se encuentran las siguientes:
Uso de mallas fuente que incluyen menos detalles en el proceso de creación.
Desplazamiento animado y basado en materiales.
Creación de paisajes detallados de Nanite.
Haz clic en la imagen para verla a tamaño completo.
Para activar el teselado de Nanite, debes establecer las siguientes variables de consola en ConsoleVariables.ini o en los archivos de configuración .ini de tu proyecto:
// This is read-only and must be set in the config file for the project.
r.Nanite.AllowTessellation=1
// This can be dynamically toggled at runtime.
r.Nanite.Tessellation=1Una vez que hayas establecido estas variables, puedes configurar el teselado usando el editor de materiales siguiendo estos pasos:
Seleccionar el nodo de material principal.
En el panel Detalles, en los ajustes de Nanite, marca la casilla Habilitar teselado.
Conecta una muestra de textura a la entrada Desplazamiento del nodo de material principal.
El rango de valores de entrada de Desplazamiento es 0-1.
Existen dos ajustes para configurar cuando se utiliza el teselado en un material:
Magnitud: la altura del desplazamiento medida de mínimo a máximo al que se asigna el intervalo 0-1 del pin Desplazamiento. También determina los límites que se usan para el cribado, por lo que debes establecer un valor tan grande como sea necesario.
Este valor tiene un impacto significativo en el rendimiento, y puede tener otros efectos no deseados. Consulta la sección Aspectos técnicos de esta página para obtener más información.
Centro: especifica qué valor de desplazamiento corresponde a que no haya cambios con respecto a la malla base. Por tanto, si el gris medio es el centro y quieres que el desplazamiento sea el mismo tanto dentro como fuera de la malla, usa 0.5. Si solo quieres empujar hacia fuera, establécelo a 0.
Además, en un material puedes optimizar el teselado de Nanite si habilitas Fundido de desplazamiento en el panel Detalles. Cuenta con dos ajustes:
Tamaño de fundido inicial (píxeles): qué tamaño debería tener el desplazamiento máximo, en píxeles en pantalla, cuándo se empieza a fundir el desplazamiento. Este valor debe ser superior al valor de tamaño de fundido final.
Tamaño de fundido final (píxeles): qué tamaño debería tener el desplazamiento máximo, en píxeles en pantalla, cuando se completa el fundido y se desactiva el desplazamiento. Este valor debe ser inferior al valor de tamaño de fundido inicial.
Aspectos técnicos:
Solo funciona en mallas de Nanite. El teselado y el desplazamiento se ignoran en las mallas que no son de Nanite o en los casos en los que Nanite no es compatible.
El desplazamiento no cambia el sombreado (a diferencia de los renderizadores sin conexión). Es necesario proporcionar el mapa normal correspondiente o derivar una normal a partir de las derivadas del desplazamiento. Por motivos de calidad y compresión, recomendamos disponer de un mapa normal adicional.
Solo desplazamiento escalar. Por el momento, el desplazamiento vectorial no es compatible.
El desplazamiento se realiza a lo largo de la normal interpolada y no normalizada de los vértices. Actualmente no existe ninguna opción para controlar la dirección de desplazamiento en el sombreador. Siempre se realiza a lo largo de la normal.
El desplazamiento se realiza en el espacio local antes de cualquier tipo de escala del objeto. Eso significa que la magnitud de desplazamiento especificada en el material está en unidades de espacio del objeto antes de cambiar la escala de la malla, que es a menudo lo conveniente, pero puede que no sea así. Por ejemplo, en los casos en los que quieres un ladrillo teselado en un cubo al que le has cambiado el tamaño para convertirlo en pared. Es probable que en el futuro añadamos una opción para el espacio en el mundo con el fin de resolver estos casos.
El teselado y el desplazamiento también funcionan en el paisaje, siempre que se haya generado Nanite para ello. Desafortunadamente, a las mallas generadas por el paisaje se les aplica automáticamente una escala considerable, así que asegúrate de utilizar una magnitud mucho menor para los materiales del paisaje (como 64 veces más pequeña). Es probable que esto se solucione en el futuro con la opción mencionada en el punto anterior.
Mantén el valor del ajuste Magnitud tan bajo como sea necesario. En su lugar, intenta utilizar todo el rango 0-1 de la salida Desplazamiento. No ajustes la magnitud a 100 para luego reducir el valor que introduces en la salida Desplazamiento para compensar. El motivo de esto es que el valor de Magnitud se usa para limitar los parches para el cribado. Si la magnitud es grande, el rendimiento puede verse seriamente afectado, sobre todo en los mapas de sombras virtuales.
Actualmente no existe una solución para el desplazamiento sin fisuras, como la que tenía Unreal Engine 4 con el teselado por hardware. Esto significa que las costuras de UV, las normales de los bordes bien definidos o cualquier atributo de vértice que afecte al desplazamiento y que no esté bien definido provocará fisuras.
El teselado puede combinarse con la compensación de la posición global (WPO, por sus siglas en inglés). En este caso, el WPO se aplica a los vértices de la malla base antes del teselado. Como siempre, el desplazamiento se aplica a los vértices del triángulo cortado después del teselado.
El teselado no es compatible con la compensación de profundidad de píxel (PDO, por sus siglas en inglés). Si se activa el teselado, se ignorará el PDO.
El teselado se puede combinar con la máscara de opacidad, pero por razones de rendimiento, el enmascaramiento se realiza a una velocidad de triángulos cortados, no por píxel. Para la mayoría de los casos, esto debería funcionar bien, pero no funcionará bien con el difuminado, ya que realmente tiene que ser por píxel.
Es posible que los artefactos de compresión de texturas sean evidentes en los mapas de desplazamiento y parezcan peldaños de escalera. El ajuste de compresión de texturas Alfa, que usa BC4, funciona adecuadamente en muchos casos. Si se almacena en el alfa de un RGBA con Default/DXT5/BC3 debería obtener resultados similares. A veces puede ser necesario descomprimir, pero el punto flotante probablemente sea excesivo. Empaquetar los canales, especialmente la altura con normales, con cualquier formato comprimido probablemente muestre artefactos, lo cual puede ir en contra de experiencias anteriores, cuando los mapas de altura se usaban para otros fines.
El desplazamiento es relativo a los triángulos planos de la malla base. Eso significa que no parte de una superficie curva como los triángulos de normal a punto o las superficies de subdivisión de Catmull-Clark. El teselado no alisa intrínsecamente la superficie.
Splines de Nanite
Las mallas de spline se usan para deformar mallas siguiendo la forma de un spline, como carreteras y rutas sobre un terreno del paisaje. Las mallas habilitadas para Nanite son compatibles con splines por defecto y se pueden crear como splines de paisaje y splines de Blueprint.
Escena de ejemplo con malla de Nanite en primer plano y spline de Nanite. Esta escena muestra la visualización de la iluminación y los triángulos de Nanite.
Las mallas de spline de Nanite pueden presentar problemas visuales. Por ejemplo, al crear una malla de spline con una malla estática habilitada para Nanite, es posible que la resolución de la malla de spline sea menor a medida que la cámara se aleja de ella. Esto sucede porque Nanite no tiene en cuenta la deformación de las mallas de spline al generar su menor nivel de detalle (LOD). En consecuencia, las simplificaciones que son imperceptibles a la misma distancia cuando no está deformadas pueden resultar evidentes cuando se estiran a lo largo de una curva de spline.
Puedes solucionar este problema de deformación con el ajuste Factor de longitud máxima de borde, que se encuentra en el editor de mallas estáticas, en Configuración de Nanite del panel Detalles. Este parámetro mitiga este problema obligando a Nanite a conservar el detalle suficiente para mantener una cantidad deseada de distancia entre los vértices de la malla en pantalla, evitando que la malla se renderice por debajo de cierto umbral de densidad de vértices.
El factor de longitud máxima de borde por defecto es 0. Esto indica que la longitud del borde no se tendrá en cuenta para esta malla. Los valores superiores a 0 representan la distancia deseada entre dos vértices conectados cualesquiera en el espacio de pantalla. Más concretamente, esta distancia se representa como un múltiplo del borde del triángulo de Nanite más pequeño deseado (configurado por r.Nanite.MaxPixelsPerEdge).
Cómo actualizar a splines de Nanite desde una versión anterior del motor
En los proyectos realizados con Unreal Engine 5.3 y versiones anteriores, los componentes de malla de spline que usaban mallas estáticas habilitadas para Nanite renderizaban previamente las mallas alternativas generadas a partir de la malla de Nanite como mallas estáticas normales. Como el renderizado de splines con Nanite ahora está activo por defecto en Unreal Engine 5.4, estas mallas se renderizarán ahora como Nanite, lo que puede dar lugar a diferencias visuales.
Para mantener el comportamiento anterior de renderizar la malla imprecisa de Nanite como la malla de spline, puedes establecer r.SplineMesh.RenderNanite en 0.
Procesos de trabajo híbridos de contenido con y sin Nanite
Las siguientes secciones destacan los procesos de trabajo que puedes utilizar en tus proyectos con Nanite que necesiten ser compatibles también con características y plataformas que no sean Nanite sin duplicar recursos.
Cómo importar una malla de alta resolución para Nanite
Puedes importar una malla de alta resolución para que sea tu representación de Nanite para cualquier malla estática existente que no sea Nanite a través del explorador de contenido o del Editor de mallas estáticas.
Desde el explorador de contenido, puedes utilizar el menú contextual haciendo clic con el botón derecho del ratón en un recurso de malla estática para seleccionar Nivel de detalle > Alta resolución > Importar alta resolución y navegar hasta el archivo que deseas importar.
Como alternativa, puedes utilizar el Editor de mallas estáticas para importar una malla de alta resolución mediante la configuración de Nanite en el panel Detalles. Haz clic en Importar y navega hasta el archivo que quieras importar.
Mediante este proceso de trabajo, la malla estática ya existente y su cadena de nivel de detalle (LOD) se convierten en la malla imprecisa en vez de que el proceso de importación genere automáticamente una malla imprecisa a partir de la geometría de Nanite.
Este proceso de trabajo tiene en cuenta el ajuste No permitir Nanite en los actores de la malla estática en las escenas y se explica más adelante en la sección Opciones de componentes de malla estática.
Procesos de trabajo de materiales
Existen dos formas de mejorar los procesos de trabajo con materiales de Nanite y no Nanite: mediante el uso de un nodo en el grafo de material para romper las rutas lógicas, o mediante el uso de un material de anulación que solo se utiliza para renderizar con Nanite.
Nodo de cambio de pasada de Nanite
El nodo Cambio de pasada de Nanite permite definir un comportamiento especializado en un grafo de material cuando se renderiza con Nanite.
Utiliza la entrada por defecto al renderizar en pasadas que no sean Nanite, para manejar el material como se haría normalmente. Utiliza la entrada Nanite para cualquier lógica de material que quieras simplificar o que se renderice específicamente a pasadas de Nanite. Por ejemplo, cuando un material utiliza una característica no compatible con Nanite, podrías mantener la misma lógica para la entrada por defecto y utilizar una lógica menos técnica para la entrada de Nanite.
Material de anulación de Nanite
La ranura Material de anulación de Nanite está disponible en materiales e instancias de materiales. Al establecer un material de anulación, todas las mallas activadas para Nanite que tengan asignado el material o la instancia de material utilizarán en su lugar el material de anulación de Nanite referenciado. Esto quiere decir que puedes crear materiales específicos para los flujos de trabajo de Nanite en vez de gestionar la lógica directamente dentro del grafo de materiales utilizando el nodo Pass Switch de Nanite.
En las instancias de material, la ranura de material de anulación de Nanite se establece de forma forzada de forma predeterminada en Ninguna para que la configuración de la anulación en un material principal no provoque que se herede automáticamente en ninguna de las instancias secundarias de ese material.
En el ejemplo que se muestra a continuación, la malla estática de la estatua tiene activado Nanite y se le ha aplicado una instancia de material. La instancia de material tiene su material de anulación de Nanite establecido con algunos cambios de color simples para fines demostrativos. El actor de malla estática de la izquierda muestra el material de anulación de Nanite, ya que la malla se está renderizando con Nanite. El actor de malla estática de la derecha muestra el mismo material hasta que se establece No permitir Nanite en el actor, desactivando el material de anulación de Nanite para mostrar el material base no Nanite de la instancia de material.
Opción de componente de malla estática: Deshabilitar Nanite
Puedes establecer cuándo las mallas estáticas activadas para Nanite deben utilizar su representación Nanite utilizando la configuración No permitir Nanite en actores de escena individuales. Esto quiere decir que puedes mezclar actores Nanite y no Nanite que utilicen el mismo recurso de malla estática.
El ejemplo que aparece a continuación muestra un único recurso de malla estática activada para Nanite, donde la representación de malla de la izquierda corresponde a Nanite y la de la derecha tiene activada la opción No permitir Nanite.
Terreno de paisaje
Puedes activar Nanite en actores de paisaje. Las mallas de paisaje de Nanite se recompilan en segundo plano para no interrumpir el proceso de trabajo del usuario en el editor. El paisaje de Nanite no mejora la resolución del paisaje, pero permite al usuario aprovechar las funciones en tiempo de ejecución de Nanite, como el cribado de la GPU, la transmisión automática de geometría y los LOD. Por lo general, aumenta el rendimiento en tiempo de ejecución, sobre todo en el caso de funciones exigentes como los mapas virtuales de sombras.
Para obtener información sobre cómo activar y usar Nanite en tu paisaje, consulta la documentación Uso de Nanite con paisajes.
Rendimiento del contenido normal
Con fines de comparación, se han tomado los siguientes tiempos de GPU de la demostración técnica de Unreal Engine 5 Lumen en el mundo de Nanite en una PlayStation 5:
Resolución media de renderizado de 1400p submuestreada temporalmente a 4K.
Aproximadamente 2,5 milisegundos (ms) para cribar y rasterizar todas las mallas de Nanite (que era casi todo en esta demostración).
Casi toda la geometría utilizada fue una malla de Nanite.
Prácticamente sin coste de CPU, ya que funciona al 100 % en la GPU.
Aproximadamente 2 ms para evaluar los materiales de todas las mallas de Nanite.
Coste de CPU bajo con 1 llamada de trazado por material presente en la escena.
Si consideramos estos tiempos de GPU juntos, son aproximadamente 4,5 ms en total lo que sería equivalente al paso previo de profundidad de Unreal Engine 4 más el paso base. Esto hace que Nanite resulte ideal para proyectos de juegos a 60 FPS.
Cabe esperar este tipo de resultados de los contenidos que no sufren los problemas de rendimiento mencionados en las secciones anteriores. Los recuentos de instancias muy elevados y la gran cantidad de materiales únicos también pueden provocar un aumento de los costes y es un aspecto del desarrollo de Nanite en el que se está trabajando activamente.
Tamaño de datos
Teniendo en cuenta el microdetalle que Nanite es capaz de alcanzar, podría suponerse que implica un gran aumento de los datos de geometría, lo que se traduce en mayores tamaños de los paquetes de juego y descargas para los jugadores. No obstante, la realidad no es tan grave. De hecho, el formato de malla de Nanite es considerablemente más pequeño que el formato de malla estática estándar debido a la codificación especializada de malla de Nanite.
Por ejemplo, utilizando la muestra de Unreal Engine 5 Valley of the Ancients, las mallas de Nanite tienen una media de 14,4 bytes por triángulo de entrada. Esto significa que una malla de Nanite media de un millón de triángulos ocupará aproximadamente 13,8 megabytes (MB) en disco.
Si comparamos una malla tradicional formada por pocos polígonos y su mapa de normales con una malla de Nanite formada por muchos polígonos, veremos algo parecido a lo siguiente:
Malla formada por pocos polígonos
Tamaño del paquete comprimido de malla estática: 1,34 MB | Malla de Nanite
Tamaño del paquete comprimido de malla estática: 19,64 MB |
No obstante, el tamaño del paquete comprimido no es el tamaño total del recurso. También hay que tener en cuenta las texturas exclusivas que solo utiliza esta malla. Muchos de los materiales utilizados por las mallas tienen sus propias texturas únicas compuestas por texturas diferentes de Normal, Color base, Metálico, Especular, Rugosidad y Máscara.
Este recurso en particular emplea solo dos texturas (BaseColor y Normal) y por lo tanto no ocupa tanto espacio en disco como uno con muchas texturas únicas. Por ejemplo, ten en cuenta que el tamaño de la malla de Nanite con aproximadamente 1,5 millones de triángulos es inferior (19,64 MB) al de una textura de mapa normal 4K.
| Textura Type | Tamaño de textura | Tamaño en el disco. |
|---|---|---|
Color base | 4k x 4k | 8,2 MB |
Normal | 4k x 4k | 21,85 MB |
El tamaño total del paquete comprimido para esta malla y sus texturas es:
Malla formada por pocos polígonos: 31,04 MB
Malla formada por muchos polígonos: 49,69 MB
Puesto que la malla de Nanite ya es muy detallada, podemos intentar sustituir el mapa normal único por una normal de detalle de teselado que se comparta con otros recursos. A pesar de que, en este caso, se produce cierta pérdida de calidad, es bastante pequeña y, desde luego, mucho menor que la diferencia de calidad entre la versión formada por pocos polígonos y la versión formada por muchos polígonos. Por lo tanto, una malla de Nanite de 1,5 millones de triángulos puede tener mejor aspecto y ser más pequeña que una malla formada por pocos polígonos con un mapa normal 4K.
Tamaño total comprimido de la malla y las texturas de Nanite: 27,83 MB
Se pueden realizar multitud de experimentos con la resolución de las texturas y los mapas normales de detalle, pero esta comparación en concreto pretende demostrar que los tamaños de los datos de las mallas de Nanite no son muy distintos de los datos con los que los artistas ya están familiarizados.
Por último, podemos comparar la compresión de Nanite con el formato estándar de malla estática utilizando el high poly, donde ambos son idénticos en LOD0.
Malla estática formada por muchos polígonos
Tamaño del paquete comprimido de malla estática: 148,95 MB | Malla de Nanite
Tamaño del paquete comprimido de malla estática: 19,64 MB |
Si comparamos la compresión de Nanite anterior con un tamaño de 19,64 MB es 7,6 veces más pequeña que la compresión estándar de malla estática con 4 LOD.
La compresión de Nanite y el tamaño de los datos son aspectos clave que se mejorarán en futuras versiones de Unreal Engine.
Consejos generales sobre el tamaño de datos
Los sistemas Nanite y Texturas visuales, junto con las rápidas unidades SSD, han reducido la preocupación por los costes de ejecución de la geometría y las texturas. El mayor cuello de botella es ahora cómo hacer llegar estos datos al usuario.
El tamaño de los datos en disco es un factor importante a la hora de decidir cómo se distribuyen los contenidos (en soporte físico o descargándolos por internet), y la tecnología de compresión tiene un límite. El promedio de ancho de banda de internet del usuario final, el tamaño de los soportes ópticos y el tamaño de los discos duros no han aumentado al mismo ritmo que el ancho de banda y la latencia de acceso a los discos duros, la potencia de cálculo de las GPU y la tecnología de software como Nanite. Hacer llegar esos datos a los usuarios está siendo todo un desafío.
El renderizado eficiente de mallas muy detalladas es menos preocupante con Nanite, pero el almacenamiento de sus datos en disco es ahora el aspecto clave que hay que tener bajo control.
Modos de visualización
Nanite incluye varios modos de visualización para inspeccionar los datos en la escena actual.
En el visor del nivel, en el menú desplegable Modos de visualización, coloca el cursor sobre Visualización de Nanite y selecciona una opción.
La visualización Presentación muestra la escena renderizada en el centro de la imagen con visualizaciones de Nanite seleccionadas alrededor de la pantalla como referencia.
Puedes elegir entre los siguientes modos de visualización de Nanite:
| Visualización de Nanite | Descripción |
|---|---|
Máscara | Visualización que marca la geometría de Nanite (verde) y la que no es de Nanite (roja). |
Triángulos | Muestra todos los triángulos de las mallas de Nanite en la escena actual. |
Parches | Muestra todos los parches de las mallas de Nanite en la escena actual. |
Clústeres | Muestra representaciones en color de todos los grupos de triángulos que se están renderizando en la vista de escena actual. |
Formas primitivas | Visualización que colorea todos los componentes del mismo color para todas las instancias de una malla estática de instancias (ISM). |
Instancias | Visualización que aplica un color diferente a cada instancia de la escena. |
Superposición de píxeles | Muestra la cantidad de superposición de píxeles que se produce en la geometría de la escena. Todos los píxeles evaluados, incluidos los enmascarados, se añaden a la vista de superposición. Los objetos más pequeños que se apilan estrechamente crean más superposición que los más grandes. |
UV de mapa de luz | Visualización que muestra las coordenadas UV de las superficies de la malla de Nanite. |
Evaluar WPO | Colorea la geometría habilitada para Nanite que utilizan el desfase de la posición en el mundo (verde) frente a las que no (rojo). |
Programable por píxeles | |
Teselado | Visualización de la malla de Nanite mediante teselado y cantidad de teselado que se produce solo en las mallas teseladas. |
Contenedores de rasterizado | Muestra grupos que representan lotes de geometría. |
Contenedores de sombreado |
Nanite dispone de un modo de visualización avanzado que permite opciones de visualización adicionales en el menú Visualización de Nanite. Estas visualizaciones resultan útiles para los programadores que están depurando o generando perfiles de distintos aspectos de bajo nivel de Nanite.
Activa este modo de visualización avanzada con la variable de consola r.Nanite.Visualize.Advanced 1.
Variables y comandos de consola
Las siguientes estadísticas y variables de consola están disponibles para su uso en la depuración y configuración de Nanite.
El renderizado de Nanite se puede activar y desactivar globalmente en tiempo de ejecución utilizando la variable de consola r.Nanite 0. La desactivación de Nanite es una buena forma para emular las plataformas que no son compatibles.
Modos de renderizado de Nanite alternativos
Nanite ofrece modos de renderizado de malla alternativa cuando Nanite está desactivado o no es compatible con una plataforma. Puedes controlar qué modo se utiliza mediante la variable de consola r.Nanite.ProxyRenderMode.
0 es el modo por defecto y pasa a renderizar mallas alternativas, o LOD controlados por el espacio en pantalla, si están configurados. Esto incluye el reconocimiento de LOD mín. en las propiedades del editor de mallas estáticas (descritas en la sección anterior Malla alternativa).
1 desactiva todo el renderizado de mallas activadas para Nanite.
2 funciona de forma similar al modo 1 pero permite la visualización Mostrar > Nanite alternativo en el editor de mallas estáticas para renderizar un Nanite alternativo.
Los modos de renderizado alternativo 1 y 2 resultan útiles para escenas que tienen muchas más instancias que las que se podrían admitir sin Nanite. Estos permiten abrir la escena en el editor en plataformas no compatibles con Nanite.
Por ejemplo, en el proyecto de muestra de Unreal Engine 5 Valley of the Ancients, si se desactiva Nanite, se producirán decenas de miles de llamadas de trazado regulares, lo que dificultaría la apertura del mapa en una plataforma no compatible.
Comando de estadísticas de Nanite
El comando NaniteStats añade una superposición de las estadísticas de cribado de Nanite en la parte superior derecha del visor.
Los argumentos del comando se utilizan para indicar las estadísticas que Nanite muestra en pantalla. Si no se proporciona ningún argumento, se utilizará la vista principal.
Utiliza NaniteStats List para ver todas las vistas disponibles en la salida de depuración:
Principal
Mapas de sombras virtuales
También podrás ver otras estadísticas disponibles para ShadowAtlas y CubemapShadows cuando estén disponibles. Selecciona una vista introduciendo el comando seguido del nombre de la lista de estadísticas que deseas ver. Por ejemplo, puedes introducir NaniteStats VirtualShadowMaps.
Para las vistas que utilizan la eliminación selectiva de oclusiones en dos pasadas, las estadísticas están divididas en depósitos separados para la pasada principal y la pasada subsiguiente.
Cómo cambiar el tamaño del grupo de transmisión de Nanite
Controla la cantidad de memoria dedicada a mantener los datos de retransmisión de Nanite con la variable de consola r.Nanite.Streaming.StreamingPoolSize. Si se utilizan grupos más grandes, se reduce el trabajo de E/S y descompresión al desplazarse por la escena, pero a costa de un mayor consumo de memoria.
Si el grupo no es lo suficientemente grande como para contener todos los datos necesarios para una vista, es posible que se produzca una paginación excesiva (thrashing) de la caché en la que la retransmisión nunca se estabilice, ni siquiera para una vista estática.
Para visualizar los datos de transmisión de Nanite, puedes utilizar el habilitador de visibilidad Geometría de transmisión, disponible en Mostrar > Nanite > Geometría de transmisión. Si se desactiva, las mallas de Nanite solo se renderizan con el nivel de calidad que siempre se conserva en la memoria.
Cómo establecer la cantidad máxima de clústeres en una sola pasada
Puedes especificar la cantidad máxima de clústeres candidatos y visibles utilizados en una sola pasada con las variables de consola r.Nanite.MaxCandidateClusters y r.Nanite.MaxVisibleClusters. Estos valores se utilizan para determinar el tamaño de los búferes intermedios y sus valores por defecto se han elegido para que funcionen en los escenarios de renderizado más comunes.
No existe ningún mecanismo para cambiar el tamaño dinámicamente de ninguno de estos búferes, ni para reducir la calidad de forma automática en caso de desbordamiento, lo que puede ocasionar artefactos de renderizado por ser demasiado pequeños para la complejidad de la escena, y manifestarse normalmente como geometría ausente o parpadeante. Cuando se producen este tipo de artefactos, utiliza NaniteStats para determinar límites prudenciales para los clústeres candidatos y visibles. Más concretamente, fíjate en las estadísticas de ClustersSW y ClustersHW. El coste de memoria de un clúster candidato es actualmente de 12 bytes y el de un clúster visible es de 16 bytes.
Esta variable de consola no se puede modificar en tiempo de ejecución y se debe especificar en un archivo de configuración (.ini).