¿Cómo crear un material si la geometría no tiene coordenadas UV? Triplanar Mapping es una técnica de shading que permite crear materiales sin UV, sin que se vean costuras y que se vea correctamente desde cualquier ángulo.
¿Qué es?
Triplanar Mapping es una técnica perfecta para usar con modelos que por su propia naturaleza no tienen UV o estos están muy deformados o no es práctico tener que generarlas. Ejemplos típicos de estos modelos son los terrenos.
Idea
La idea principal de Triplanar Mapping es proyectar sobre el modelo una textura en el eje X, en el eje Y, y en el eje Z.
¿Cómo proyectar sobre un eje?
Toma la posición del fragmento y usa sus coordenadas XY como coordenadas UV para proyectar sobre eje Z:
Para proyectar sobre el eje X, toma la posición del fragmento y usa sus coordenadas YZ como coordenadas UV:
Para proyectar sobre el eje Y, toma la posición del fragmento y usa sus coordenadas XZ como coordenadas UV:
Ahora tenemos que "mezclar" las tres proyecciones para tener un resultado tal que así:
¿Cómo lo hacemos?
Triplanar Mapping
¿Cómo mezclamos las tres entradas?
Podemos mezclar las tres proyecciones usando una combinación lineal:
$$ ColorFinal = w_x X + w_y Y + w_z Z $$
Cuyos pesos cumplen que:
$$ w_x + w_y + w_z = 1 $$
¿Como asignamos cada uno de esos $w_i$?
Tomemos el eje X por ejemplo. Sea $N$ la normal, cuanto "más" alineada esté la normal en el eje X, más peso deberemos darle a $w_x$.
Podemos definir los pesos así:
$$w_x = \frac{N_x}{N_x + N_y + N_z}$$
$$w_y = \frac{N_y}{N_x + N_y + N_z}$$
$$w_z = \frac{N_z}{N_x + N_y + N_z}$$
En UE4:
Y finalmente sumamos los valores:
Podemos aumentar la "dureza" o brusquedad con la que se transita de una proyección a otra usando una potencia:
World Aligned Blend
Entendiendo los fundamentos de Triplanar Mapping, la buena noticia es que UE4 nos trae un nodo de serie que nos facilita muchísima la tarea.
Este nodo se llama WorldAlignedBlend y basicamente nos permite hacer el apartado de blend en un solo nodo:
Referencias externas
Si quieres profundizar más o que te lo cuenten de otra manera:
Ben Golus tiene un artículo en Medium muy completo sobre Triplanar Mapping.
Martin Palko también escribió en su blog sobre Triplanar Mapping con implementación en Unity y UDK.