Question

Comment les jeux informatiques rendent leur terrain? Je vais utiliser un heightmap pour la géométrie (bien que je vais plus tard optimiser) mais je me demande quelle technique est la meilleure, par exemple, de «peinture mon sol; herbe presque partout, des chemins de terre ici et là, gravier à l'intérieur des villes, et une transition harmonieuse entre chaque type de matériau.

Est-ce que je viens d'utiliser une énorme texture précuite? Cela semble très inefficace, quand je pouvais carreaux textures existantes. Alors dois-je utiliser une énorme carte alpha pour chaque texture existante? En théorie, ça sonne bien pour moi, mais comment puis-je aller en fait de le faire et quelles sont les conséquences? Je ne sais vraiment pas par où commencer, et mes recherches Google ne sont pas très efficaces prouvais.

Je préfère ne pas avoir à « pression » de la texture à la grille (à savoir l'espace (0,0) est de l'herbe, l'espace (0,2) est la saleté, l'espace (0,1) est transition herbe-terre) ; Je préfère être capable de peindre de façon arbitraire afin qu'il semble plus convaincant. Bien sûr, ce serait la façon facile, mais il est trop d'un sacrifice dans la qualité graphique et le « réalisme ».

Je suis surtout à la recherche d'ici la théorie et les options. J'utilise OpenGL donc si vous pouvez fournir des conseils dans la mesure que la manière d'OpenGL de faire les choses, et les fonctions que je ne l'ai entendu parler, ce serait génial.

Juste pour clarifier, Oblivion est une bonne référence à ce que je cherche. Je ne sais pas comment la géométrie du sol est (heightmap, modèles 3D statiques, etc.), mais leur terrain a différents types de sol et des transitions en douceur entre eux, comme je parle. Voici un exemple d'image, remarquez comment le mélange dans l'herbe pavé, mais en douceur déraisonnablement: http://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg

Je pense aussi que je lis à ce sujet dans l'un des livres Gems de Programmation du jeu, mais je n'y ai pas prêté beaucoup d'attention à l'époque, et maintenant que c'est l'été, je ne pas avoir accès à la bibliothèque de mon université pour vérifier ! Je cherche des tables des matières en ce moment et je modifier si je trouve, mais je ne vais pas encore être en mesure de le lire jusqu'à la mi-Août.

EDIT: Ah homme, Gems Game Programming 7 a un chapitre 5.8 intitulé « Cartographie grandes textures pour extérieur Terrain de rendu », qui sonne comme exactement ce que j'ai besoin, mais la bibliothèque de mon U ne dispose même pas ce livre! Je ne pouvais pas trouver quoi que ce soit exactement comme celui-ci dans l'autre programmation du jeu de livres Gems, si un couple a eu quelques articles de la géométrie du terrain.

Était-ce utile?

La solution

Je l'ai récemment écrit un petit moteur de rendu de terrain en OpenGL qui fait quelque chose de semblable à ce que vous parlez. La technique que j'utilise est décrit comme texture splatting .

J'utilise cinq textures pour y parvenir. Quatre de ces textures sont textures détail: l'herbe, la roche, l'eau et le sable. Ces textures sont assez petites, 512x512 textures, et ils sont carrelés à travers le terrain. La cinquième texture est un mixmap. Le mixmap est une texture géante qui couvre tout le terrain, dans mon cas est 4096x4096.

MixMap

Cette mixmap utilise tous les canaux 4 couleurs (r, g, b, a) pour décrire à quel point une texture de détail pour afficher à cet endroit précis. J'utilise le canal de couleur rouge pour déterminer le degré d'opacité est le sable, le vert est pour l'herbe, le bleu est pour l'eau, et l'alpha est pour le rock. Cette mixmap est calculée à partir de la heightmap lors de l'initialisation et j'utiliser des altitudes pour déterminer ces valeurs. Par exemple, à proximité du niveau de la mer, je veux surtout de l'eau, donc je mis une valeur élevée dans le canal bleu et de faibles valeurs dans les autres canaux. Comme je l'ai plus haut dans les montagnes, je mets le canal de couleur alpha à une valeur élevée puisque je veux beaucoup de texture de la roche, mais je mets tous les autres canaux de couleur à des valeurs inférieures.

Fragment Shader

Cette mixmap est ensuite mis à utiliser dans le fragment shader, où je prends ces canaux de couleur de la mixmap et les utiliser pour combiner les textures de détail. Voici le code GLSL J'utilise pour le fragment shader:

uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;

varying vec3 normal, lightDir ;

void main()
{
   // Get the color information
   vec3 alpha    = texture2D( alpha, gl_TexCoord[0].st ).rgb;
   vec3 texSand  = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texGrass = texture2D( grass,  gl_TexCoord[0].st * texscale ).rgb;
   vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texRock  = texture2D( rock,  gl_TexCoord[0].st * texscale ).rgb;

   // Mix the colors together
   texSand *= mixmap.r;
   texGrass = mix(texSand,  texGrass, mixmap.g);
   texWater = mix(texGrass, texWater, mixmap.b);
   vec3 tx  = mix(texWater, texRock,  mixmap.a);

   // Lighting calculations
   vec3 dl = gl_LightSource[0].diffuse.rgb;   
   vec3 al = gl_LightSource[0].ambient.rgb;
   vec3 n = normalize(normal);
   vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );   

   // Apply the lighting to the final color   
   vec4 finalColor = vec4( min(d, 1.0), 1.0);
   gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}

Le texscale uniforme est une valeur qui détermine combien de fois les textures détaillées sont carrelées sur le terrain. Des valeurs plus élevées feront les textures détaillées semblent plus nettes au risque de leur donner un aspect plus répétitif.

Autres conseils

précuisson est certainement pas inefficace. il est en fait le plus efficace parce que votre code d'exécution ne doit pas faire une fusion ou d'autres calculs. il rend juste la texture. Bien sûr, les techniques dynamiques offrent une simplification de l'ensemble des outils et plus d'options.

ID semblent avoir fait le seul grand « mégatexture » (nous parlons 32K ^ 2-128K ^ 2) travailler QuakeWars.

Il y a un intéressant Q & A avec Carmack à ce sujet à

http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2

(lien d'origine semble mort actuellement, mais ne pas faire ce qui précède un lien car semble SO avoir des problèmes avec des liens Internet Archive, elles semblent bonnes dans l'aperçu de modifier, puis briser sur la page principale).

L'un des moyens classiques, utilisés par exemple dans le moteur source (HL2), est d'avoir un par sommet alpha de se fondre entre deux matériaux. Les matériaux sont généralement constitués d'au moins un albédo et une carte normale. Dans le moteur source seulement 2 matériaux par matériau « mélange texture » est autorisée est, ce qui est un peu merdique.

Si vous voulez plus de 2 matériaux que vous devez simuler par texturation différents déplacements avec des textures différentes, en vous assurant que tout carreau ne contient que 2 matériaux au plus.

Avoir un alpha par vertex plutôt que par pixel donne un aspect assez mauvais. Comme vous l'avez noté dans Oblivion vous obtenez en douceur de mélange pavés du sable par exemple. Il y a un correctif pour ce défaut; vous utilisez une autre texture qui module l'alpha sur une base par pixel, de sorte que les fissures entre les pavés se remplissent de sable facilement, mais les sommets des pavés restiez à presque 1,0 alpha jusqu'à ce que le sommet interpolée alpha est presque 0 pour le galet Matériel. Cela peut rendre le look de transition très agréable au lieu d'un frottis laid.

Vous pouvez également utiliser une texture basse résolution qui contient les alphas (mais encore beaucoup plus élevé que 1 alpha par sommet). Les tuiles textures terain peuvent être 2048x2048, mais la texture utilisée pour les mélanger ne toghether pas besoin de résolution par-texel. Un 256x256 8 bits par texture texel est seulement 96 Ko avec mip maps.

En général, les zones de transition sont precreated, bien qu'il soit possible de faire des choses avec des canaux alpha et le mélange des textures.

vous cant fuyez carrelage mais peut-être si vous utilisez une texture de base qui fait un peu de bruit sur le sol, il semble que il n'y a pas de carrelage ...

utiliser la texture de base avec les mêmes coordonnées de texture de la texture alpha. la texture de base peut être quelque chose .. une image sattelite, ou une texture de l'herbe .. il serait parfait si elle correspond est liée à la forme de votre sol ..

et essayez d'utiliser des textures transparentes pour votre herbe, des textures rock ... il ne résout pas mais fait regarder comme il n'y a pas de problème

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top