¿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.

Proyecciones sobre el dragón

¿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:

Proyectar en Z

Para proyectar sobre el eje X, toma la posición del fragmento y usa sus coordenadas YZ como coordenadas UV:

Proyectar en X

Para proyectar sobre el eje Y, toma la posición del fragmento y usa sus coordenadas XZ como coordenadas UV:

Proyectar en Y

Ahora tenemos que "mezclar" las tres proyecciones para tener un resultado tal que así:

Con las tres proyecciones aplicadas

¿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:

Triplanar en UE4

Podemos aumentar la "dureza" o brusquedad con la que se transita de una proyección a otra usando una potencia:

Usando una potencia para definir la dureza de la transición

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.