Saltar al contenido principal

Packing Textures

Descripción General

Packing textures es un proceso en el cual se juntan varias texturas en una sola. Esto es posible gracias a que existen cuatro canales RGBA que almacenan información. Por ejemplo un albedo que sea png puede ocupar los cuatro espacios desde un inicio: RGB que le darán todos los colores que necesite y el alpha le dará la transparencia (en caso de que la tenga). Sin embargo hay otros tipos de texturas que no utilizan todos los canales, sino mas bien, blancos y negros (que se puede interpretar como qué tanto valor pasa o no del mismo). Por ejemplo los mapas de Metalness, Roughness, Ambient Occlusion u Opacity. Otro ejemplo es un mapa de normales el cual ocupa los espacios RGB pero deja un cupo disponible: el canal Alpha.

Dependiendo de nuestras necesidades, la realidad es que puedes "empaquetar" las texturas como desees. Es decir, juntar el mapa de Metalness, Opacity y Emission en una textura donde ocupe el metalness el canal Rojo, el opacity el canal Verde y el emission en el canal Azul o en cualquier orden. Sin embargo hay que tener presente que si empaquetamos también tenemos que desempaquetar. Esto quiere decir que de alguna forma la computadora tiene que saber en qué canal buscar qué información. Asi que una selección arbitraria de canales y mapas asignados no debería suceder.

Con lo dicho anteriormente, se reduce el "empaquetado" a dos situaciones:


Los mapas ORM que puede considerarse una convención. El mapa ORM almacena la información de los mapas Occlusion, Roughness y Metalness (las letras iniciales de cada uno da lugar al nombre).. Como ya mencionamos, gracias a que esos tres mapas funcionan originalmente en blanco y negro, pueden fusionarse cada uno en un canal RGB que es el acomodo siguiente:

  1. El mapa de Ambient Oclussion irá en el canal Rojo
  2. El mapa de Roughness irá en el canal Verde
  3. El mapa de Metalness irá en el canal Azul

Como te darás cuenta la asignación va en orden ORM | RGB = OR, RG, MB. Spark AR ocupa esta disposición y es la recomendada si se planea hacer un empaquetado "personalizado". En el caso de Unity, habría que generar un shader para desempaquetar este paquete.


Uso en Unity, por alguna razón Unity maneja distintos canales para leer la información de las texturas por lo cual la convención anterior no funcionará a menos de que generes/obtengas un shader que separe los canales correspondientes como se mencionaba en el punto anterior. La asignación de Unity por default para los canales es la siguiente:

  1. El mapa de Metalness irá en el canal Rojo
  2. El mapa de Ambient Occlusion irá en el canal Azul/Rojo (Como estamos usando el rojo para los metales, tendrá que ir en el canal azul. Sin embargo, lo reconoce en ambos canales, pero los metales sólo en el canal Rojo)

Alcances

Alcances de la investigación.

Proceso de Desarrollo

Cómo obtener un mapa ORM

Método 1: Substance

Programas como Substance lo exportan de manera automática y tiene varias configuraciones como las siguientes:

Método 2:  Creándolo en Photoshop

Como en el caso particular de Unity, será necesario generarlo en Photoshop. En este ejemplo vamos a ver cómo armar un ORM. A pesar de que Unity ocupe otra disposición, saber cómo se arma este mapa facilitará la comprensión del otro. Para esto, una vez teniendo tus tres mapas (Ambient Oclussion, Roughness, Metalness) cargalos en un archivo de Photoshop. Para tener un poco más de claridad visual puedes meterlos a un grupo y nombrarlos con su respectivo color, como se muestra a continuación:

Incluso puedes dar click derecho en el grupo y hasta abajo del menú seleccionar el respectivo color, se verá como a continuación. (hacer esto es opcional)

Una vez organizado el archivo como sea de tu preferencia, da doble click en el grupo o capa para ver el estilo de capa y en Blending options deja activo únicamente al canal que le corresponde. Es decir, con el Ambient Occlusion, como le corresponde el canal Rojo, apaga el Verde y el Azul. Haz eso con cada mapa. Recuerda:Ambient Occlusion = Rojo, Roughness = Verde, Metalness = Azul

En resumen los pasos son: Doble click en capa o grupo para ver el estilo de capa > Blending Options > en la sección de Advanced Blending > apaga o prende los canales que necesites.

Este es un ejemplo de cómo se podría ver un ORM; podemos ver que el mapa de Ambient Occlusion es negro. Como no contiene información, entonces no pasa ningún rojo y se ve ese azul saturado.

Método 3: Otros

En el caso de que se necesite juntar estas texturas al trabajar con un GLTF, por ejemplo, Sketchfab lo hace de manera automática. No te darás cuenta hasta que lo descargues y veas alguna textura de tonos raros (como el de arriba) y ninguna en blanco y negro. Ese es el mapa ORM. En este caso es mejor trabajar como siempre: no generar ningún ORM de antemano pues no hay opción para asignarlo directamente. Caso contrario de Spark AR el cual sí tiene la opción de asignar un ORM.

Menú de Sketchfab comparado al menú de Spark AR

Packing Textures en Unity

Se habrá de hacer el "empaquetado" juntando los mapas de Metalness y Ambient Occlusion en los canales mencionados en la introducción y usando el método dos. Es decir, se jalan ambos mapas a Photoshop, al mapa de Metalness se le habilita la opción de Rojo únicamente y al de Ambient Occlusion la opción de Azul. Dentro de Unity asignas esta textura a ambas opciones.

Enlaces de descarga

Los enlaces de descarga ya sean plugins o Assets.

Archivos Adjuntos

Comentarios

  • Si al momento de generar tu mapa ORM en Photoshop, en el menú de Blending options, no aparece para habilitar R, G, o B revisa que tu archivo esté en modo RGB. Para esto dirígete a Image > Mode > RGB
  • Si gustas saber en qué canal está colocando Substance determinado mapa dirígete a Export Textures > pestaña de  Configuration > el preset que estés exportando. Después posiciona tu cursor sobre el canal que desees y te saldrá el nombre la textura que tiene.

  • En Unity el render pipeline no afecta la disposición: puedes usar el mapa en LWRP y en URP por igual

Ventajas

Se reduce el peso de texturas totales gracias a que en vez de cargar 2 o 3 imagenes, solo se carga una

Desventajas

El "desempaquetado" puede no ser claro. Por ejemplo, con Unity cargar la convención (ORM) se ve distinto y es por eso que se intentó resolver porqué. Esto dio pie a conocer los canales que realmente usa.

Sin embargo, alguien puede confiar en el ORM, (o cualquier otra disposición) en algún otro programa y si no se hace comparativa con otro material que tenga los mapas de la manera tradicional, pueden asumir que se ve bien cuando no se están respetando los canales o propiedades.

Ubicación Proyecto

La ubicación del proyecto en el servidor.

Elaboró

Daphne Sánchez