Quels sont les moyens de texturer la carte d'un terrain?


10

Je travaille avec XNA sur un jeu 3D et j'essaie d'avoir un environnement propre et agréable. J'ai en fait suivi un tutoriel pour créer un terrain à partir d'une carte de hauteur. Pour le texturer, j'applique juste une texture d'herbe dessus et je le mets plusieurs fois.

Mais ce que je veux faire, c'est avoir une texturation vraiment réaliste, mais aussi la générer automatiquement (par exemple si je veux utiliser du bruit Perlin pour générer un terrain puis le texturer).

J'ai déjà appris sur la multi-texturation, le chargement d'un fichier de carte avec différentes couleurs pour différentes textures, mais je ne pense pas que ce soit vraiment efficace, par exemple pour les falaises ou les zones très escarpées, il tuile mal une texture car c'est une vue de la Haut. (De plus, je ne sais pas comment je vais dessiner des routes ou des chemins de terre avec ça.)

Je suis à la recherche d'une solution efficace pour cartographier de manière réaliste le relief généré par des procédures.


1
Votre problème de cartographie n'est pas du tout trivial. On ne peut y répondre correctement en quelques paragraphes. Je vous recommande de jeter un coup d'œil aux correspondances harmoniques et à ce qui est expliqué dans cet article: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Réponses:


2

Je suppose que vous n'êtes pas concerné par les cartes de mélange ou les éclaboussures de texture (car cela est indépendant de votre cartographie UV). Puisque vous avez spécifiquement demandé de minimiser la distorsion causée par le mappage, vous pouvez consulter la section 1.5 de cet article sur les gemmes GPU:

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

Cela pourrait fonctionner même sur un terrain généré de manière procédurale. Le concept est également connu sous le nom de "texturation triplanaire" .

MODIFICATION PLUS TARD: J'ai testé la technique dans mon propre rendu de terrain sans utiliser d'UV précalculés pour la cartographie. Il vous suffit de calculer 3 ensembles d'UV pour les 3 plans de projection différents (XY, YZ et ZX). Cela peut être réalisé en utilisant de simples extraits de vertex et de fragment 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;

3

Vous pouvez définir un ensemble de textures (herbe, terre, roche) et les utiliser. Disons qu'en utilisant ces trois couches (roche en bas, saleté en haut et herbe en haut), vous pouvez définir trois canaux alpha pour définir la quantité de chaque texture visible. Commencez avec une simple carte de bruit pour vos canaux alpha et prenez peut-être en compte la pente du terrain. Plus il y a de pente, plus la roche brillera. C'est une technique appelée «Texture Splatting» pour autant que je m'en souvienne. Voici quelques liens pour vous aider à démarrer. Éclaboussures de texture avancées (gamasutra)

TextureSplatting (charlesbloom, celui que j'ai utilisé pour commencer avec ce sujet)

Vous devriez pouvoir obtenir de bons résultats plutôt rapidement, un sujet très gratifiant

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.