Wie kann ein Terrain texturiert werden?


10

Ich arbeite mit XNA an einem 3D-Spiel und versuche, eine angemessene und schöne Umgebung zu schaffen. Ich habe tatsächlich ein Tutorial befolgt, um ein Terrain aus einer Höhenkarte zu erstellen. Um es zu texturieren, trage ich einfach eine Grasstruktur darauf auf und kachle es mehrmals.

Was ich aber tun möchte, ist eine wirklich realistische Texturierung, die aber auch automatisch generiert wird (zum Beispiel, wenn ich Perlin-Rauschen verwenden möchte, um ein Terrain zu generieren und es dann zu texturieren).

Ich habe bereits etwas über Multitexturierung gelernt und eine Kartendatei mit verschiedenen Farben für verschiedene Texturen geladen, aber ich denke nicht, dass dies wirklich effizient ist, zum Beispiel für Klippen oder sehr steile Bereiche, da es eine Textur schlecht kachelt, da es eine Ansicht von der ist oben. (Außerdem weiß ich nicht, wie ich damit Straßen oder Feldwege zeichnen soll.)

Ich suche nach einer effizienten Lösung für die realistische Texturabbildung von prozedural erzeugtem Gelände.


1
Ihr Mapping-Problem ist überhaupt nicht trivial. Es kann in einigen Absätzen nicht richtig beantwortet werden. Ich empfehle Ihnen, sich die harmonischen Zuordnungen und die Erläuterungen in diesem Artikel
anzusehen

Antworten:


2

Ich denke, Sie beschäftigen sich nicht mit Mischkarten oder Textur-Splatting (da dies unabhängig von Ihrer UV-Zuordnung ist). Da Sie ausdrücklich darum gebeten haben, die durch das Mapping verursachten Verzerrungen zu minimieren, können Sie Abschnitt 1.5 dieses GPU Gems-Artikels lesen:

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

Dies könnte sogar auf prozedural erzeugtem Gelände funktionieren. Das Konzept wird auch als "triplanare Texturierung" bezeichnet .

SPÄTER BEARBEITEN: Ich habe die Technik in meinem eigenen Terrain-Renderer getestet, ohne vorberechnete UVs für das Mapping. Sie müssen lediglich 3 UV-Sätze für die 3 verschiedenen Projektionsebenen (XY, YZ und ZX) berechnen. Dies kann mit einfachen Vertex- und Fragment-Shader-Snippets erreicht werden:

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

Sie können eine Reihe von Texturen (Gras, Schmutz, Stein) definieren und diese verwenden. Angenommen, Sie verwenden diese drei Schichten (Stein unten, Schmutz oben und Gras oben). Sie können drei Alphakanäle definieren, um zu definieren, wie viel von jeder Textur sichtbar ist. Beginnen Sie mit einer einfachen Rauschkarte für Ihre Alphakanäle und berücksichtigen Sie möglicherweise die Neigung des Geländes. Je mehr Hang, desto mehr Fels scheint durch. Soweit ich mich erinnere, ist dies eine Technik namens "Texture Splatting". Hier sind einige Links, um Ihnen den Einstieg zu erleichtern. Erweitertes Textur-Splatting (Gamasutra)

TextureSplatting (charlesbloom, das, mit dem ich mit diesem Thema angefangen habe)

Sie sollten in der Lage sein, schnell gut aussehende Ergebnisse zu erzielen, ein sehr lohnendes Thema

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.