¿Qué estás buscando?
Industry

Libro de los Muertos: Quixel, viento, construcción de escenas y trucos de optimización de contenidos

JULIEN HEIJMANS / UNITY TECHNOLOGIESAnonymous
Jun 29, 2018|18 minutos
Libro de los Muertos: Quixel, viento, construcción de escenas y trucos de optimización de contenidos
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.

En esta serie de blogs, repasaremos todos los aspectos de la creación de nuestra demo Libro de los Muertos. Hoy nos centraremos en nuestra asociación con Quixel, nuestro sistema de vientos, la creación de escenas y los trucos de optimización de contenidos. Este es el cuarto blog de nuestra serie "Making Of". En caso de que te lo hayas perdido, echa un vistazo a los tres últimos posts que repasan el proceso creativo de los personajes, el arte conceptual y los activos de fotogrametría, los árboles y los efectos visuales de Book of the Dead.

¡Hola! Me llamo Julien Heijmans y trabajo como artista de entornos en el equipo de demostración de Unity. Me incorporé a Unity el año pasado, pero tengo unos 7 años de experiencia en la industria de los videojuegos. Esta entrada del blog le ofrecerá una visión de la producción de Book of the Dead desde mi perspectiva, la de un creador de contenidos y un artista de entornos.

Soy algo novato en el trabajo de los activos de fotogrametría, pero recuerdo claramente el día en que Quixel anunció la creación de Megascans hace varios años. Desde entonces, he estado deseando tener la oportunidad de trabajar con sus activos. Unirme al equipo de demos de Unity lo hizo posible, ya que empecé a trabajar en El libro de los muertos.

Si quieres empezar a experimentar con las herramientas comentadas en este blog puedes descargarte el Libro de los Muertos: Proyecto medioambiental ahora.

Descarga el proyecto

Asociación con Quixel
Quixel、Megascans、フォトグラメトリ、環境アート

Cuando me uní al proyecto me di cuenta de que no sólo estábamos utilizando recursos de la biblioteca Megascans de Quixel, sino que Unity y Quixel estaban colaborando en la creación de este proyecto.

Durante el proceso de producción, el Equipo de Demostración creó una lista de los activos que necesitarían y Quixel capturaría nuevos activos si les faltaba una coincidencia adecuada en su biblioteca existente. Muchos de esos activos eran vegetación, como césped, plantas y arbustos, que requieren un equipo y una configuración adecuados para su escaneado.

Quixel no sólo nos proporcionó las hojas de texturas para esos activos, sino que también creó la geometría, con sus LOD y la configuración de colores de vértices para soportar nuestro sombreador de viento.

Título

Entre la publicación del Libro de los Muertos: Environment, y los recursos inéditos utilizados en el teaser, recibimos más de 50 recursos de gran calidad y de una complejidad que nos habría hecho pasar apuros para cumplir los plazos con los pocos artistas que tenemos en el equipo.

Durante la producción, pudimos introducir los activos con bastante rapidez en el motor, y con buen aspecto. A menudo retocábamos las texturas (sobre todo el albedo, retocábamos el brillo/niveles/curva y a menudo retocábamos los colores para unificarlos en toda la escena), las volvíamos a empaquetar correctamente, retocábamos un poco los LOD al nivel que queríamos, asignábamos las texturas a un nuevo material HDRP Lit, y ya habíamos terminado.

Por suerte, Quixel ha lanzado recientemente una herramienta, Megascans Bridge, que haría la mayor parte del trabajo de importación que hacíamos manualmente. Ahorra tiempo en el reempaquetado de texturas para HDRP y similares.

Título

Para aquellos que estén interesados en más activos de Megascans, les recordamos que hay varias colecciones de Megascans en la Unity Asset Store. Todos los activos están listos para ser importados a un proyecto configurado con el Canal de Renderizado de Alta Definición o el Canal de Renderizado Ligero.

Viento
Imagen

La creación de un sistema eólico para los activos de vegetación y toda su tubería es siempre un proceso complicado. Hay muchos tipos diferentes de vegetación que necesitarían ser animados de diferentes maneras; dos árboles diferentes podrían requerir una configuración completamente diferente y una complejidad de sombreado diferente.

Por este motivo, nuestro equipo decidió crear una animación procedimental basada en sombreadores de vértices personalizados para el efecto del viento en nuestros activos de vegetación. Lo hicimos a medida para que funcionara con nuestro proyecto específico y los árboles o arbustos que contiene. Permitiéndonos tener un control total sobre ella.

Torbjorn Laedre, nuestro jefe técnico, creó un sombreador que admite varios tipos de vegetación, utilizando 3 técnicas diferentes:

  • Pivote Jerarquía, para nuestros árboles y algunas plantas con una estructura/jerarquía muy definida.
  • Pivote único, para césped, plantas pequeñas y para arbustos grandes con estructura/jerarquía indefinida
  • Animación procedimental, para activos de vegetación en los que no se pueden predecir los pivotes.
Imagen

Los árboles fueron los activos más complejos de preparar, en cuanto al contenido, utilizan el tipo de animación Hierarchy Pivot y se basan en 3 niveles distintos de jerarquía:

  • Tronco, que descansa sobre el suelo.
  • Ramas Nivel A, que están conectadas al tronco.
  • Ramas Nivel B, que están conectadas a las ramas del Nivel A.

El sombreador necesita conocer el nivel de jerarquía y el pivote de cada uno de los vértices del árbol. Primero tuve que crear la geometría del árbol en sí, y luego asignar el nivel de jerarquía para cada polígono del árbol utilizando el canal de color verde de los vértices.

Imagen
  • Un valor de 0 para el canal verde del color del vértice significaría que es el tronco
  • Un valor entre 0 y 1 sería el nivel de sucursales A
  • Un valor de 1 sería el nivel de ramas B

Hice esto usando Autodesk Maya, con algunos pequeños scripts fui capaz de configurar todos los LOD de un activo en 10-15 minutos.

Además, utilizamos lo que llamamos "máscara de aleteo". Son máscaras de textura que ayudarían a determinar en qué punto de la geometría estaría el pivote de la rama. Usamos esto para las ramas que usaban texturas alfa duras para la geometría. He aquí una ilustración de esta máscara.

Título

Con toda esta información preparada, podría utilizar el script C# que introduciría mi prefab de árbol, y generaría un nuevo prefab con la información de pivote de cada vértice incorporada. Después de añadir un objeto WindControl a mi escena, puedo importar mi árbol en la escena, y empezar a jugar con las propiedades del material.

Puede ver que cada nivel jerárquico tiene una propiedad de rango (básicamente la longitud del tronco, o de las ramas) y una propiedad de elasticidad.

También hay algunas propiedades para configurar la animación del aleteo del viento. Añaden un poco de ruido procedimental a las posiciones de los vértices, para imitar la vibración de las ramas cuando el viento sopla sobre ellas.

Por último, tuvimos que hacer que el sonido del viento FX influyera en la animación del viento. El volumen del sonido impulsa la fuerza del viento de la animación. Es realmente sorprendente cómo una simple idea puede enriquecer el proyecto. Si aún no lo ha hecho, debería abrir el proyecto y recorrerlo. Notarás que los árboles y toda la hierba de alrededor tiemblan cuando oigas grandes ráfagas de viento golpear a tu alrededor.

Diseño

Al plantearme el nivel de detalle y densidad de un proyecto como Book of the Dead, era importante pensar en cómo iba a estructurar el nivel, para evitar problemas de rendimiento más adelante en la producción. Una de las cosas con las que intenté tener cuidado fue limitar las distancias de visión largas en la escena. Puedes hacerlo colocando "pasillos" y "cuellos de botella" en el diseño de la escena.

Imagen

Esos layouts, junto con assets correctamente configurados como 'Occluder static' y 'Occludee static' flags harán que el occlusion culling de Unity sea más eficiente.

Este vídeo muestra la Visualización de Oclusión, y se puede adivinar fácilmente hacia dónde mira la cámara desde la vista superior. Hacia el final del vídeo, activo/desactivo la eliminación de oclusiones, y veo qué objetos están siendo eliminados por la eliminación de oclusiones.

También podrá ver que algunos objetos no se eliminan, en su mayoría son árboles muy altos, algunos de más de 25 metros de altura, que tienen una caja delimitadora muy grande y por lo tanto son difíciles de eliminar detrás de los acantilados.

Uso de terrenos heredados de Unity

Cuando se publicó el tráiler, vimos comentarios de que de ninguna manera se utilizaría el sistema de terreno heredado. Pero eso es exactamente lo que usamos, y modificamos el shader Layered Lit del HD Render Pipeline para que lo soporte.

El sombreador de capas HDRP permite la mezcla de capas utilizando su textura de mapa de altura, por lo que el resultado es mejor que la mezcla lineal que viene con el sombreador de terreno heredado.

Imagen

Se trata, por supuesto, de una solución temporal, y no está debidamente integrada en la interfaz de usuario. Para cambiar el terreno tendrás que editar el material que se le aplica, en lugar de utilizar el botón 'Editar Textura' en la pestaña Pintar Textura del objeto terreno.

Imagen
Imagen

Si quieres crear un nuevo terreno y aplicarle diferentes texturas, necesitarás duplicar este material TerrainLayeredLit y asignarlo a tu nuevo terreno. También tendrá que crear esos 4 conjuntos de texturas en la pestaña Textura de pintura. Las texturas asignadas allí no se utilizarán para renderizar el terreno, pero te permitirán pintar las diferentes capas de tu terreno. También es ahí donde puedes cambiar las propiedades de alicatado de las distintas capas.

Además, para poder utilizar plenamente la función LODGroup, todos los activos colocados a través del terreno están configurados como Árboles, y no como activos de detalle.

Título

Pero en realidad, este proyecto tiene una cantidad realmente elevada de activos esparcidos por el suelo: hierba, arbustos, planos, ramitas de madera, rocas, etc. Con todo esto, el terreno puede ser bastante simple, puedes ver abajo que en esta toma en particular el terreno es solo un simple material de mosaico.

Activos de detalle dispersos

Cuando camines por el nivel, observarás que en algunos lugares hay una gran cantidad de pequeñas ramitas y piñas esparcidas por el suelo.

Título

En realidad no son tan obvios cuando simplemente caminas por el nivel, pero realmente aportan el nivel de detalle de la escena cuando empiezas a mirar al suelo. A veces hay cientos de ramitas diminutas en el suelo, entre las rocas y los troncos muertos, tal y como acabarían descansando si se cayeran de los árboles. Colocarlos a mano sería sencillamente imposible, por eso Torbjorn Laedre creó una herramienta para ayudarnos a dispersar esos pequeños detalles en el nivel.

Las ramitas son simples planos recortados con un material alfa. Les hemos añadido colisionadores de cápsulas de física.

Título

El script primero generará la cantidad deseada de esos objetos dispersos alrededor de una posición de transformación, y luego simulará la física para que caigan al suelo, colisionando con el terreno y todos los demás activos (roca, troncos muertos, etc). Entonces, pulsando el botón 'Bake', serán despojados de sus colliders, fusionados en un único objeto, y se les asignará un LODGroup con una distancia específica a la que deben ser eliminados.

Este script es usado por objetos llamados 'UberTreeSpawner' en la escena, y eres libre de usarlo como quieras.

Nota al margen sobre esta herramienta: Para que las ramitas y otros objetos dispersos caigan correctamente sobre el suelo y otros activos, necesitará tener colisionadores de malla de densidad bastante alta en todos los activos de la escena. Al mismo tiempo, no querrás que esos colliders pesados se utilicen cuando el juego esté en marcha. Por esta razón, la mayoría de los activos de la escena tienen dos colisionadores diferentes: Una luz para ser utilizada en tiempo real en modo de juego por el PlayerController con la Capa por defecto asignada. Y otra utilizada exclusivamente para la simulación física de esas ramitas, con la Capa 'GroundScatter' asignada.

Iluminación

El Libro de los Muertos: El proyecto Environment utiliza iluminación global indirecta con iluminación directa en tiempo real.

Tanto la iluminación indirecta del sol como la directa e indirecta del cielo se incorporan a los mapas de iluminación y a las sondas de luz. Las sondas de reflexión, las sondas de oclusión y otras fuentes de oclusión también se hornean. En cambio, la contribución directa del sol es una iluminación en tiempo real. El sombreado en el HD Render Pipeline se ve mejor cuando se utiliza luz directa en tiempo real, y también nos da cierta libertad para animar la rotación, la intensidad y la temperatura de color de la luz direccional en tiempo de ejecución.

Título

Dado que la iluminación indirecta está bakeada, no podemos cambiar demasiado la intensidad y el color de la luz direccional, o dejará de coincidir con la iluminación bakeada. En esta configuración no podríamos utilizar un ciclo día/noche completo, aunque un bosque es un entorno bastante indulgente en términos de oscurecimiento de la iluminación indirecta desajustada.

Los mapas de luz horneados se utilizan principalmente para el terreno y algunos otros recursos, pero preferimos utilizar una combinación de sondas de luz y sondas de oclusión para todas las rocas y acantilados del proyecto, ya que proporcionan mejores resultados para objetos con ángulos agudos y mapas de normales nítidos.

Sondas de oclusión

Iluminar un bosque denso es algo complicado de conseguir en tiempo real. Los árboles, con todas sus hojas y ramas, tienen una superficie enorme y una geometría compleja, por lo que no resulta práctico cubrirlos con lightmaps. Si se utiliza una sola sonda luminosa por árbol, la iluminación será uniforme de abajo arriba. Los volúmenes proxy de la sonda de luz se acercan más a lo que querríamos, pero no resulta práctico aumentar la resolución de la rejilla para captar detalles finos.

Por eso, nuestro programador gráfico jefe, Robert Cupisz, desarrolló las sondas de oclusión.

Desde el punto de vista de un artista, es una función realmente agradable y fácil de usar: basta con añadir el objeto a la escena, y se muestra un aparatito de volumen que hay que escalar para que cubra el área deseada, y luego configurar sus parámetros de resolución en X, Y y Z.

Imagen

También te permite crear sondas de oclusión "Detalle" si quieres que alguna zona de la escena tenga una mayor densidad de sondas. Una vez configurado, tendrás que hornear la iluminación de toda la escena. Las sondas de oclusión se hornearán durante ese proceso.

Cada sonda de la cuadrícula 3D muestrea la visibilidad del cielo disparando rayos en el hemisferio superior, y la almacena como un valor de 8 bits que va de totalmente ocluido 0 a totalmente visible 1. Esto nos da zonas más oscuras allí donde hay una mayor concentración de hojas y ramas, incluso más cuando unos cuantos árboles están agrupados.

Las sondas que tengan la mala suerte de caer dentro de troncos o rocas quedarán totalmente negras. Para evitar que se filtre esa oscuridad, se marcan como no válidas y se sobrescriben con sondas vecinas válidas.

Dado que las sondas muestrean qué parte del cielo es visible, sólo deberían atenuar la contribución directa del cielo. Por esta razón, el lightmapper se configura para excluir la contribución de luz directa de las sondas de luz regulares, y entonces la iluminación de la sonda se compone como sonda de luz más sonda de cielo directa ocluida por sondas de oclusión.

De esta forma podemos tener toneladas de sondas de oclusión baratas muestreando pequeños detalles de cómo el follaje ocluye el cielo, aportando profundidad a la imagen, y muy pocas sondas de luz más caras muestreando la luz indirecta que cambia más lentamente.

image

Si quieres tener una idea más clara de cómo afectan a la escena, también puedes utilizar la vista SkyOcclusion Debug.

Título

La API de sonda de oclusión para hornear sondas de oclusión y excluir la contribución directa del cielo de las sondas de luz se ha añadido a Unity 2018.1, y todos los scripts y shaders están disponibles en el proyecto.

Dispersión atmosférica

Hemos portado y reutilizado la solución de dispersión atmosférica que desarrollamos originalmente para la demo de Blacksmith.

Nuestro programador jefe Lasse Jon Fuglsang Pedersen lo ha ampliado para que utilice el supermuestreo temporal, lo que da como resultado un aspecto mucho más suave.

image
Transmisión de tuberías HD Render

El Lit Shader por defecto de HD Render Pipeline soporta varios tipos de difusión. Le permite tener materiales con dispersión sub-superficial, o-como se utiliza para toda nuestra vegetación en este proyecto-un material translúcido más simple con sólo la transmisión de luz.

image

Este efecto se establece en dos lugares diferentes:

  • En el material que usted necesita para elegir el tipo de material "translúcido", introduzca un mapa de espesor, y elegir un perfil de difusión, que es la segunda ubicación:
  • Los ajustes del perfil de difusión, donde puedes editar todos los demás parámetros de tu efecto de transmisión
Título

Nota: Nuestro equipo añadió controles deslizantes adicionales para controlar por separado la transmisión directa y la indirecta para tener más control sobre el resultado final. Pero este cambio no respeta las reglas PBR y por lo tanto no entrará en el HD Render Pipeline.

Volúmenes de área

Los volúmenes de área se basan en el sistema de volúmenes principales que ofrece SRP y son muy similares a los volúmenes de postproceso. Su función es controlar las propiedades de los objetos en función de la posición del objeto Cámara principal.

Varios objetos, incluyendo la Luz Direccional, la Dispersión Atmosférica, el Enfoque Automático y el Control del Viento tienen sus propiedades controladas por Volúmenes de Área, así que si quieres cambiar la configuración de iluminación actual, por ejemplo, necesitarás hacerlo en el Volumen de Área correspondiente. Estos objetos Volúmenes de Área se encuentran en la escena principal, en _SceneSettings > _AREASETTINGS, y tienen el sufijo '_AV'.

Ventana de depuración

Para aquellos que no han utilizado mucho el HD Render Pipeline, ahora hay una ventana específica de depuración SRP que se puede abrir a través del menú Ventana > General > Depuración del Render Pipeline.

image
image

Con esto, podrás ver capas GBuffer individuales, componentes de iluminación o mapas de textura específicos de tus materiales, o incluso anular albedo/suavidad/normal. Es una herramienta realmente útil cuando tienes algunos objetos que no se están renderizando correctamente o cualquier otro error visual. Le ayudará a localizar el origen del problema mucho más rápido.

Lo mejor de todo es que esas vistas de depuración se generan automáticamente a partir de los shaders, y los programadores pueden crear nuevas vistas de depuración con bastante facilidad.

image

Incluso utilicé esas vistas de depuración para crear las vallas publicitarias de los árboles que se utilizan en el fondo de la escena. Acabo de colocar mis activos en una escena vacía y tomó capturas de pantalla con el albedo, la rugosidad, las capas normales gbuffer visible, y los utilizó para crear mis mapas de textura.

Optimización

Aunque una gran parte de la optimización reside en el código, también es importante que los recursos y las escenas estén configurados correctamente si quieres conseguir una velocidad de fotogramas decente. Estas son algunas de las formas en que se optimizó el contenido para este proyecto:

  • Todos nuestros materiales utilizan GPU Instancing.
  • Estamos utilizando LODs para la mayoría de los activos en esta escena, esto es un deber-tener.
  • La función LOD Crossfade es genial, permite tener una mezcla agradable y suave entre los diferentes niveles de detalle de tu objeto. Pero esta función es bastante pesada y puede aumentar realmente el número de llamadas de dibujo en tu proyecto. Por este motivo, lo desactivamos en el mayor número posible de activos.
  • Para evitar una transición perceptible entre LOD, empezamos a utilizar mapas normales de espacio de objeto en muchos de nuestros activos de rocas y acantilados de gran tamaño.
título
image

Nota: Si se utiliza el mapa de normales de espacio de objeto en lugar del mapa de normales de espacio tangente, se reducirá la precisión del mapa de normales. En realidad no es muy perceptible en nuestros activos que son muy ásperos y ruidosos, pero es probable que no desee utilizarlo para los activos de superficie dura.

  • Si bien es importante limitar la distancia de visión por la forma en que se construye la escena, y mediante el uso de la ocultación de oclusión, también vale la pena saber que muchas de las llamadas de dibujo utilizadas para renderizar su escena son en realidad procedentes de la representación de cada cascada de sus mapas de sombra (más específicamente de la luz direccional en nuestro proyecto).
  • Recibimos muchas llamadas procedentes de los pequeños elementos de vegetación diseminados por el terreno, cientos y cientos de ellos en algunos lugares. Conseguimos una buena reducción de las llamadas al sorteo creando parches más grandes de esos activos de hierba y plantas. En lugar de tener cientos de ellos, sólo tendríamos entre 15 y 20.
    Tenga en cuenta que esto tiene un impacto en la calidad visual, con activos tan grandes, se hace muy difícil evitar que la hierba se recorte con las rocas y otros activos colocados en el suelo.
  • Estamos utilizando la selección de capas, que es una característica ya en Unity, pero no tiene ninguna interfaz de usuario. Esta función le permite seleccionar objetos asignados a una capa específica, en función de la distancia a la que se encuentren de la cámara. Torbjorn ha ampliado esta función para poder eliminar también la proyección de sombras de esos objetos a una distancia diferente. Por ejemplo, la mayoría de nuestros activos de vegetación pequeños dejan de proyectar sombras a una distancia de unos 15 metros, lo que no es muy perceptible dada la cantidad de ruido con la hierba y otras plantas en el suelo, y luego son completamente eliminados a unos 25 metros - no importa cómo se configuren sus LODGroup.

---

Esté atento a la próxima entrada de la serie. Exploraremos el trabajo que supuso crear el sombreado, la iluminación, el postprocesado y mucho más del Libro de los Muertos.

Si no pudiste asistir a Unite Berlín, pronto publicaremos la presentación de Julien Heijmans sobre el arte ambiental en la demo. Puedes seguir nuestro canal de YouTube para estar al día de cuándo se publica ese vídeo.

Más información sobre el Libro de los Muertos