Césped procedural con Megascans, SpeedTree y Unreal Engine 4

Césped procedural con Megascans, SpeedTree y Unreal Engine 4. El artista de entornos 3D Karsten Malmquist nos muestra cómo crea el césped de procedural en tiempo real. Explica cómo usar escaneados de Megascans para crear grupos de césped en SpeedTree. Y cómo configurar el Shader o sombreador del césped.

Karsten Malmquist es artista ambiental en Ernst&Borg Studio en Malmö, Suecia. Se graduó en una escuela de desarrollo de juegos en Malmö llamada The Game Assembly y ha estado en PortaPlay y Star Vault como interino, trabajando en Mortal Online 2.

Proyecto de césped procedural en tiempo real

El artista ha estado jugando con este proyecto durante algunos fines de semana aquí y allá. Empezó esporádicamente intentando conseguir un material para paisajes y más tarde se convirtió en algo más grande. Llegados este punto decide seguir y la idea original se convierte en un proyecto más grande. Donde quiere generar proceduralmente un bioma completo.

Césped procedural con Megascans SpeedTree y Unreal Engine 4
Césped procedural con Megascans SpeedTree y Unreal Engine 4

Flujo de trabajo de Megascans a SpeedTree

Su flujo de trabajo para crear activos generalmente empieza navegando por la biblioteca de Megascans. Ya que siempre quiere saber qué activos están disponibles para su proyecto. Mientras navega, trata de obtener una visión general de qué activos podría usar de inmediato y qué activos podría modificar para posteriormente utilizar. En este caso, la biblioteca de Megascans tiene muchos modelos de hierba y césped que están listos para usar, pero al ver que son demasiado densos en triángulos, decide hacer sus propios clústeres.

Sabiendo que iba a hacer sus propios grupos de hierba, comenzó a buscar algunas fotografías de hierba diferentes en Megascans y SpeedTree. Hasta encontrar una buena combinación. Utilizó SpeedTree ya que ofrece un flujo de trabajo procedural no destructivo donde puede cambiar de opinión sobre casi cualquier cosa sin tener que rehacer todo desde cero. La razón para usar bibliotecas escaneadas es que te permite probar muchas fotografías diferentes de gran tamaño hasta que encuentras un buen ajuste.

Mientras probaba diferentes texturas de las bibliotecas, llegó a la conclusión de que las fotografías con más espacio entre las hebras de hierba o césped individuales generalmente se ven mejor. Cuando usa mapa con un espaciado estrecho entre las hebras de hierba, toda la textura se mezcla a medida que se activan los mipmaps rompiendo la ilusión de que la hierba está formada por hebras individuales.

Flujo de trabajo de Megascans a SpeedTree
Flujo de trabajo de Megascans a SpeedTree

Grupos de césped procedural en SpeedTree

Para crear los grupos de hierba en SpeedTree, empieza creando las mallas de mallas colocando vértices en la parte superior del mapa y se asegura asignar los diferentes LOD con los recuentos de triángulos apropiados. No se preocupa demasiado por el recuento exacto de triángulos de momento. Ya que sabe que tendra que volver a revisar este paso una vez que traiga los clústeres a Unreal Engine y vea cómo funcionan.

crear los grupos de hierba en SpeedTree
crear los grupos de hierba en SpeedTree

Después de configurar los LOD de la malla, empieza a hacer el clúster. Para esto, primero usa un nodo Zone para definir dónde puede engendrar la hierba. Luego conecta un nodo Leaf Mesh que contiene las mallas que creó anteriormente. La forma en que los nodos SpeedTree funcionan generalmente es que los hijos se generan a partir del padre, lo que en este caso significa que las mallas de Leaf Mesh aparecerán dentro de las zonas creadas por el nodo Zone.

zonas creadas por el nodo Zone
zonas creadas por el nodo Zone

Utilizando el nodo Zone

Para ajustar el clúster en su conjunto, modifica el nodo Zone para cambiar dónde pueden generar las mallas. Luego modifica el nodo Leaf Mesh para cambiar cuántas mallas se generan en una ubicación determinada y cómo se orientan las mallas.

Con el nodo Zona seleccionado, va a la pestaña «generación» y ajusta la configuración de «barrido». Para hacer que los clústeres se generen en un círculo y ajuste la configuración de «número» para generar más zonas al azar.

generar más zonas al azar
generar más zonas al azar

Al seleccionar el nodo Leaf Mesh, también ajustas el número de mallas de césped en la pestaña «generación» y luego te diriges a la pestaña «orientación local» para cambiar la orientación local de las mallas individuales. Recomienda probar las diferentes configuraciones para ver qué hacen, ya que no siempre se explican por sí mismas.

nodo Leaf Mesh orientation local
nodo Leaf Mesh orientation local

Al editar el grupo de hierba, hay algunas cosas que tiene en cuenta:

  • El tamaño del clúster general.
  • Cuántas mallas hay en el clúster.
  • El tamaño del clúster afectará a la cantidad de instancias que deben generarse en el motor para cubrir el suelo.

Para el rendimiento, es mejor que el clúster sea bastante grande para mantener bajas las llamadas de dibujo. Pero no es bueno que sean demasiado grandes para que los clústeres asomen del suelo en lugares donde el terreno es desigual.

Césped procedural con Megascans - nodo Leaf Mesh orientation local
Césped procedural con Megascans – nodo Leaf Mesh orientation local

El número de cartas afectará mucho al rendimiento, ya que una gran cantidad de mallas conduce a muchos sobregiros, lo cual reduce el rendimiento. Para este proyecto, descubrió que era mejor para el rendimiento emplear triángulos adicionales para cortar partes totalmente transparentes del mapa de hierba. Si estás haciendo tu propia vegetación en SpeedTree, te recomiendo que pruebes diferentes recuentos de triángulos para encontrar un punto óptimo.

Césped procedural con Megascans - grupo de hierba en SpeedTree
Césped procedural con Megascans – grupo de hierba en SpeedTree

Después de configurar los clústeres en SpeedTree, los exportamos a Unreal Engine. En este punto, quiero ver la hierba en el contexto de toda la escena en lugar de acercarme a un solo mapa o trozo de hierba. Mientras tienes la hierba en el motor, también debes buscar qué ajustes necesitas hacer en SpeedTree para que se vean bien en el motor. Sin embargo, antes de regresar a SpeedTree, debes configurar un sombreador (Shader) adecuado en Unreal Engine para no distraerte con un extraño sombreado en la hierba cuando busque mejoras.

Configuración del sombreador de césped

Generalmente cuando se exporta la vegetación de SpeedTree a Unreal Engine no se ve muy bien de inmediato. Necesitas un buen sombreador para que la vegetación se vea bien. Hay una opción en SpeedTree para exportar un material existente a Unreal, pero he descubierto que necesitaba muchas más funciones de las que ofrecía. En lugar de usar el sombreador importado, hice el mío propio que consta las siguientes características.

Paso primero para crear un Shader o sombreado propio

La hierba que se desvanece se agrupa en función de la distancia de la cámara. Para hacer esto, uso el nodo PerInstanceFadeAmount, que le dice al sombreador la cantidad de una instancia de hierba dada que se desvanece. Para usar este nodo, hay que engendrar la hierba con mapas de hierba. Lo que hago con un material de paisaje.

Los mapas de césped son una forma de desovar vegetación procedural, llamada landscape Grass Type assets, en un paisaje a través de su material. Abrir un tipo de césped de paisaje y establecer «Start Cull Distance» a un valor más bajo que «End Cull Distance».

Esto hará que PerInstanceFadeAmount empiece a salir en el material de césped. La cantidad de cada instancia de césped se desvanece una vez que están más lejos que la «Start Cull Distance». Con esta información, ahora puedes ver la opacidad general de la hierba para que se desvanezca en la distancia.

Paso primero para crear un Shader o sombreado propio
Paso primero para crear un Shader o sombreado propio

Segundo paso para crear un Shader o sombreado propio

Aumentar la fuerza del Mapa Normal. Esto romperá la iluminación en las mallas de hierba, dando la ilusión de que las hebras de hierba individuales apuntan en diferentes direcciones. En lugar de parecer filas planas de hebras de hierba. Utiliza un nodo FlattenNormal para este efecto.

El resultado de esto variará según el mapa normal que estés utilizando. Sería ideal que las hebras de hierba apunten en diferentes direcciones y que las hebras de hierba individuales se doblen, giren y giren como lo hacen en la naturaleza.

Aumentar la fuerza del Mapa Normal
Aumentar la fuerza del Mapa Normal

Tercer paso para crear un Shader o sombreado propio

Dispersión del subsuelo. Esta es una de las partes más importantes para que la hierba se vea creíble. Encuentro que usar el albedo como el color del subsuelo funciona bien para la hierba y también desvanezce el efecto de dispersión del subsuelo cerca de las raíces con el color del vértice para mezclar mejor la hierba con la textura del paisaje.

Dispersión del subsuelo
Dispersión del subsuelo

Cuarto paso para crear un Shader o sombreado propio

La variación de color también es muy importante para deshacerse del aspecto artificial de la hierba de color uniforme. Utiliza variación a pequeña y gran escala en tu sombreador.

Con la variación a pequeña escala que consiste en un nodo llamado SpeedTreeColorVariation, que da color aleatorio por instancia de hierba.

La variación de color a gran escala proviene de una máscara de textura que se alicata en el espacio mundial XY que uso para lerp entre dos tintes.

variación de color en el sombreado
variación de color en el sombreado

Quinto paso para crear un Shader o sombreado propio

La variación de altura es una característica importante del sombreador, ya que hace que la hierba se vea esponjosa. Se logra compensando los vértices a lo largo de sus normales.

Como no te combiene mover las bases, puedes poner colores de vértice en los vértices más cercanos al suelo para enmascarar las raíces de este efecto de desplazamiento. Para obtener una variación, usa un mosaico de máscaras en el espacio mundial para determinar qué grupos compensar.

La variación de altura en el shader
La variación de altura en el shader
Césped procedural con Megascans resumen visual del sombreador
Césped procedural con Megascans resumen visual del sombreador

Configuración del material del paisaje con césped procedural

El material paisajístico es la pieza que reúne todo en este proyecto, es lo que te permite dirigir la vegetación procedural. El material en sí es bastante simple. Tiene dos capas, una llamada «Grass» y la otra «Grass High», que puedes pintar en el paisaje.

Estas capas generarán diferentes mallas de hierba utilizando el nodo de salida de hierba de paisaje. La capa de hierba generará una malla de hierba que es corta y la capa de hierba alta generará una malla de hierba que es más alta.

Además, generamos racimos de malezas y flores en la capa de hierba usando un mosaico de máscaras en el espacio mundial XY a través del paisaje. Finalmente, para reducir el sobregiro, debes asegurarte de que las malezas, las flores y los pastos cortos no desovan en la capa de hierba alta. Para ello simplemente resta la máscara de Hierba Alta de sus respectivas máscaras.

Configuración del material del paisaje
Configuración del material del paisaje

Optimizar la escena de césped procedural

Encuentro que el sobregiro es uno de los factores más importantes a la hora de optimizar cualquier tipo de vegetación, incluido el césped. Como sabía que quería hacer renders de primer plano atractivos, decidí hacer que los grupos de hierba fueran más densos con mallas de lo que tendría que ser si estuviera tratando de alcanzar un objetivo de 60 FPS, por ejemplo.

Para mí, este proyecto se ejecuta a alrededor de 40-45 FPS en mi PC con una GTX 1060 a 1080p. Para mejorar el rendimiento, reduciría la densidad de mallas en los clústeres de hierba. Esto se puede hacer fácil ya que estamos utilizando un flujo de trabajo procedural en SpeedTree, y también podemos generar los clústeres más separados en Unreal Engine.

Césped procedural con Megascans cómo optimizar la escena
Césped procedural con Megascans cómo optimizar la escena

Conclusión del proyecto para crear césped procedural

En retrospectiva, este proyecto ha resultado ser una experiencia muy divertida de la que aprende mucho. Diría que el mayor desafío fue descubrir cómo tomar un clúster que se vea bien en SpeedTree y hacer que se vea bien en Unreal Engine. Averiguar qué tipo de textura de mapa usar junto con la configuración de un buen sombreador son las dos claves.

La optimización también supone un gran desafío. Si bien puedes probar cosas diferentes y llegar a distintas conclusiones, está claro que hay mucho más que aprender sobre cómo hacer vegetación optimizada.

Este artículo fue publicado originalmente en 80 Level en inglés por Karsten Malmquist, artista 3D, de entornos digitales, en una entrevista realizada por Theodore Nikitin.

Tienes más información y comentarios en el foro, sigue leyendo…