¿Cuáles son algunas formas de mapear texturas un terreno?

10

Estoy trabajando con XNA en un juego 3D, y estoy tratando de tener un entorno adecuado y agradable. De hecho, seguí un tutorial para crear un terreno a partir de un mapa de altura. Para texturizarlo, solo aplico una textura de hierba y lo azulejo varias veces.

Pero lo que quiero hacer es tener una textura realmente realista, pero también generarla automáticamente (por ejemplo, si quiero usar el ruido Perlin para generar un terreno y luego texturizarlo).

Ya aprendí sobre texturizado múltiple, cargando un archivo de mapa con diferentes colores para diferentes texturas, pero no creo que esto sea realmente eficiente, por ejemplo, para acantilados o áreas muy empinadas, revestirá mal una textura ya que es una vista desde el parte superior. (Además, no sé cómo dibujaré caminos o caminos de tierra con eso).

Estoy buscando una solución eficiente para mapear de manera realista el terreno generado por procedimientos.

Adrien Neveu
fuente
1
Su problema de mapeo no es en absoluto trivial. No se puede responder adecuadamente en unos pocos párrafos. Le recomiendo que eche un vistazo a las asignaciones armónicas y lo que se explica en este documento: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Respuestas:

2

Supongo que no le preocupan los mapas de mezcla o las salpicaduras de textura (ya que eso es independiente de su mapeo UV). Dado que solicitó específicamente minimizar la distorsión causada por el mapeo, puede consultar la sección 1.5 de este artículo de GPU Gems:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html

Esto podría funcionar incluso en terrenos generados por procedimientos. El concepto también se conoce como "texturización triplanar" .

EDICIÓN MÁS TARDE: probé la técnica en mi propio renderizador de terreno sin utilizar uvs calculados previamente para el mapeo. Todo lo que tiene que hacer es calcular 3 conjuntos de UV para los 3 planos de proyección diferentes (XY, YZ y ZX). Esto se puede lograr utilizando fragmentos de sombreadores de vértices y fragmentos simples:

VShader:

float tileSize = 2.0;
vec4 worldPos = ( gl_Vertex);//So we obtain the world position

TexCoordX = (worldPos.zy/tileSize);//here are our texture coordinates...
TexCoordY = (worldPos.xz/tileSize);
TexCoordZ = (worldPos.xy/tileSize);
normal =  gl_Normal;
wNormal = normal;

FShader:

vec3 n = wNormal;
n*=n;
vec2 tcX = fract(TexCoordX);
vec2 tcY = fract(TexCoordY);
vec2 tcZ = fract(TexCoordZ);

vec4 grassCol = texture2D(grassTexture,tcX)*n.x+
                texture2D(grassTexture,tcY)*n.y+
                texture2D(grassTexture,tcZ)*n.z;
teodron
fuente
3

Puede definir un conjunto de texturas (hierba, tierra, roca) y usarlas. Digamos que usando estas tres capas (roca en la parte inferior, tierra en la parte superior y hierba en la parte superior), puede definir tres canales alfa para definir qué cantidad de cada textura es visible. Comience con un mapa de ruido simple para sus canales alfa y tal vez tenga en cuenta la pendiente del terreno. Cuanto más pendiente, más roca brillará. Por lo que recuerdo, esta es una técnica llamada 'Splatting de textura'. Aquí hay algunos enlaces para comenzar. Salpicadura de textura avanzada (gamasutra)

TextureSplatting (charlesbloom, el que solía comenzar con este tema)

Debería poder obtener resultados atractivos bastante rápido, un tema muy gratificante

Pettersson
fuente