Probablemente hayas corrido en un terreno donde los lados escarpados de un acantilado tienen su textura estirada tanto que parece poco realista. Tal vez usted tiene un mundo generado de manera procesal en el que no tiene forma de desenvolver y texturizar los rayos UV. El mapeo triplanar proporciona una técnica elegante para resolver estos problemas y brindarle texturas realistas desde cualquier ángulo o en cualquier forma compleja. Aquí aprenderá sobre la técnica, verá el código y examinará algunos de los beneficios, desventajas y otras posibilidades cuando use el mapeo tri-plano..
Artículos RelacionadosEl problema más común son las texturas estiradas, en particular cuando se trata de terreno. El problema radica en las coordenadas UV del objeto que está texturizando. En el caso del terreno, las coordenadas UV se extienden en una cuadrícula, espaciadas uniformemente en el plano X-Y, así:
Este diseño UV no tiene en cuenta la diferencia de altura en el terreno y provoca estiramientos. Puede tomar medidas para nivelar el área de los polígonos empinados desenvolviendo cuidadosamente las coordenadas UV, pero eso lleva a un resultado menos que ideal. Aún tiene texturas combadas y algunos mosaicos, como el del centro, están comprimidos..
También puede estar en una posición en la que no pueda desenvolver las coordenadas UV de la malla: el terreno o la forma podrían generarse de manera procesal. Tal vez tengas un sistema de cuevas o agujeros en tu forma..
Podemos resolver estos problemas con la técnica de mapeo tri-planar (también conocida como "texturización tri-planar").
Primero, veamos el terreno nuevamente con el mapeo tri-plannar aplicado:
Ahora que es mucho mejor! El estiramiento ha desaparecido y las pendientes empinadas parecen más realistas..
El mapeo tri-plano lo hace representando la textura 3 veces, en 3 direcciones diferentes: ejes X, Y y Z. Imagina una caja. Primero, la textura se proyecta hacia abajo desde el eje X positivo hacia el eje X negativo. Todos los fragmentos (píxeles de la geometría) que se enfrentan en la dirección del eje X obtienen la textura que se les aplica. El mismo proceso se aplica al eje Y y al eje Z.
Estas representaciones se mezclan entre sí. Por lo tanto, un fragmento que se enfrenta a la mitad en el eje X y la mitad en el eje Z tomará la mitad de la representación del eje X y la mitad de la representación del eje Z. Si el fragmento está orientado hacia el 90% hacia el eje X, entonces recibe el 90% de la representación del eje X y solo el 10% del eje Z. Es como tomar 3 latas de aerosol y rociar desde la parte superior, el costado y la parte delantera..
Todo esto se hace en el fragmento de sombreado de su material. Básicamente texturiza la geometría 3 veces, una en cada dirección y luego combina el resultado..
El mapeo tri-plano no usa coordenadas UV en absoluto. En su lugar, utiliza coordenadas reales del mundo. Sabiendo esto, veamos el código..
La primera parte es calcular el factor de mezcla para cada dirección:
// en wNorm es la normal del espacio-mundo del fragmento vec3 blending = abs (wNorm); mezcla = normalizar (max (mezcla, 0.00001)); // Forzar que los pesos sumen 1.0 float b = (blending.x + blending.y + blending.z); mezcla / = vec3 (b, b, b);
Aquí se toma la normal del espacio-mundo del fragmento (que se normalizará y cada componente estará dentro del rango de -1 y 1) y lo convertimos en un valor absoluto. No nos importa si una normal se enfrenta en -X o X, solo eso es en el eje X. Si nos preocupáramos por la dirección absoluta, estaríamos pintando la forma desde la parte delantera, trasera, izquierda, derecha, superior e inferior; 3 veces más de las que necesitamos.
Luego, forzamos que esté dentro del rango de 0 a 1, por lo que terminamos con un multiplicador porcentual para cada uno de los componentes del eje. Si lo normal es hacia arriba en el eje Y, obtenemos un valor Y de 1 y obtenemos toda la pintura del eje Y mientras que los otros ejes tendrán valores de 0 y no obtendrán ninguno..
Esa es la parte difícil. A continuación, simplemente mezclamos los tres valores de fusión (x, y, z) con la textura en esa coordenada de textura. Recuerda, la coordenada de textura está en el espacio-mundo:
vec4 xaxis = texture2D (rockTexture, coords.yz); vec4 yaxis = texture2D (rockTexture, coords.xz); vec4 zaxis = texture2D (rockTexture, coords.xy); // mezcla los resultados de las 3 proyecciones planas. vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Y ahí lo tenemos. "tex" es el color final del fragmento, mezclado tres veces desde los 3 ejes.
Puede ser muy útil aplicar un factor de escala a la textura, ya que sin duda querrá escalarla:
// in float scale vec4 xaxis = texture2D (rockTexture, coords.yz * scale); vec4 yaxis = texture2D (rockTexture, coords.xz * scale); vec4 zaxis = texture2D (rockTexture, coords.xy * scale); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Si está utilizando mapeo tri-planar y mapas normales, también querrá aplicar el mismo procedimiento a las normales en el sombreador de fragmentos, de esta manera:
vec4 xaxis = texture2D (rockNormalTexture, coords.yz * scale); vec4 yaxis = texture2D (rockNormalTexture, coords.xz * scale); vec4 zaxis = texture2D (rockNormalTexture, coords.xy * scale); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;PROPINA: Cree una función getTriPlanarBlend () para calcular la mezcla para texturas difusas, normales y especulares.
La primera caída que encontrarás es el rendimiento. Los fragmentos de la geometría se representarán 3 veces, una vez en cada dirección. Esto significa que los cálculos de color e iluminación (normales) se repetirán y luego se combinarán. Si ya está atado para marcos libres, es posible que no desee utilizar la asignación tri-planar.
La siguiente caída importante es la fusión en ángulos de 45 grados, especialmente donde se superponen diferentes texturas en las que se utiliza la salpicadura de texturas. Podría realizar 4 renderizaciones más, desde las esquinas de los ángulos, pero el impacto de rendimiento probablemente no valdrá la pena. Podrías intentar mezclar con un mapa de profundidad, una técnica que a veces se usa para salpicar texturas..
Ahora debe tener una comprensión de cómo funciona el mapeo tri-planar y para qué se puede usar. Pero tiene muchas otras aplicaciones en las que se puede cambiar ligeramente para producir resultados interesantes.
Como se mencionó anteriormente, el terreno procesal es un buen candidato para la técnica. Cuevas, acantilados y túneles complejos de lava ahora son fáciles de texturizar. Incluso podría influir en qué textura se usa cuando se basa en algunas rutinas aleatorias o pseudoaleatorias (ruido). La elevación o incluso la pendiente podrían determinar qué textura se usa.
Modificando la rutina para solo proyectar una textura desde la parte superior (eje y) y sujetando firmemente el valor de fusión a un rango aceptable, es decir. 10%, entonces podrías hacer que la nieve esté encima de todo en la escena. Una explosión atómica podría quemar todo lo que irradia desde un determinado punto de origen de coordenadas mundiales utilizando la misma técnica, pero basando el ángulo desde el punto de origen y utilizando una textura de quemadura oscura.
¿Alguna otra aplicación viene a la mente? Háganos saber y no dude en discutir.