Quais são algumas maneiras de mapear um terreno com textura?

10

Estou trabalhando com o XNA em um jogo em 3D e estou tentando ter um ambiente adequado e agradável. Na verdade, segui um tutorial para criar um terreno a partir de um mapa de altura. Para texturizá-lo, apenas aplico uma textura de grama e ladrilhoo várias vezes.

Mas o que eu quero fazer é ter uma textura realmente realista, mas também gerá-la automaticamente (por exemplo, se eu quiser usar o ruído Perlin para gerar um terreno e depois texturizá-lo).

Eu já aprendi sobre multi-texturização, carregando um arquivo de mapa com cores diferentes para diferentes texturas, mas não acho que isso seja realmente eficiente; por exemplo, para falésias ou áreas muito íngremes, ele exibirá uma textura ruim, pois é uma vista do topo. (Além disso, não sei como vou desenhar estradas ou caminhos de terra com isso.)

Estou procurando uma solução eficiente para mapear de maneira realista o mapeamento de terrenos gerados proceduralmente.

Adrien Neveu
fonte
1
Seu problema de mapeamento não é nada trivial. Não pode ser respondido adequadamente em alguns parágrafos. Eu recomendo que você dê uma olhada mapeamentos harmônicas e que é explicado neste artigo: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Respostas:

2

Eu acho que você não está preocupado com mapas de mesclagem ou respingos de textura (como isso é independente do seu mapeamento UV). Como você pediu especificamente para minimizar a distorção causada pelo mapeamento, consulte a seção 1.5 deste artigo da GPU Gems:

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

Isso poderia funcionar mesmo em terrenos gerados proceduralmente. O conceito também é conhecido como "texturização triplanar" .

EDIÇÃO MAIS TARDE: Testei a técnica em meu próprio renderizador de terreno, sem uvs pré-computados para o mapeamento. Tudo o que você precisa fazer é calcular 3 conjuntos de UVs para os 3 planos de projeção diferentes (XY, YZ e ZX). Isso pode ser alcançado usando trechos simples de vértice e fragmento de shader:

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
fonte
3

Você pode definir um conjunto de texturas (grama, sujeira, pedra) e usá-las. Digamos que usando essas três camadas (rocha na parte inferior, sujeira na parte superior e grama na parte superior), você pode definir três canais alfa para definir quanto de cada textura é visível. Comece com um mapa de ruído simples para seus canais alfa e talvez leve em conta a inclinação do terreno. Quanto mais inclinação, mais rocha brilha. Esta é uma técnica chamada 'Textura Splatting', tanto quanto me lembro. Aqui estão alguns links para você começar. Respingos avançados de textura (gamasutra)

TextureSplatting (charlesbloom, o que eu usei para começar com este tópico)

Você deve conseguir resultados com boa aparência tópico bastante rápido e muito gratificante

Pettersson
fonte