Jakie są sposoby na teksturowanie mapy terenu?

10

Pracuję z XNA nad grą 3D i staram się stworzyć odpowiednie i przyjemne środowisko. Właściwie wykonałem samouczek, aby utworzyć teren z mapy wysokości. Aby go teksturować, po prostu nakładam na niego teksturę trawy i układam ją kilkakrotnie.

Ale chcę mieć naprawdę realistyczne teksturowanie, ale także generować je automatycznie (na przykład, jeśli chcę użyć szumu Perlina do wygenerowania terenu, a następnie jego tekstury).

Nauczyłem się już o wieloteksturowaniu, ładowaniu pliku mapy w różnych kolorach dla różnych tekstur, ale nie sądzę, że jest to naprawdę wydajne, na przykład w przypadku klifów lub bardzo stromych obszarów źle oklei teksturę, ponieważ jest to widok z Top. (Poza tym nie wiem, jak narysuję przy tym drogi lub ścieżki gruntu.)

Szukam wydajnego rozwiązania do realistycznego mapowania tekstury terenu generowanego proceduralnie.

Adrien Neveu
źródło
1
Twój problem z mapowaniem wcale nie jest trywialny. Nie można poprawnie odpowiedzieć w kilku akapitach. Polecam przyjrzeć się odwzorowaniom harmonicznych i temu, co wyjaśniono w tym artykule: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Odpowiedzi:

2

Wydaje mi się, że nie zajmujesz się mapami mieszania ani rozpryskiwaniem tekstur (ponieważ jest to niezależne od mapowania UV). Ponieważ specjalnie poprosiłeś o zminimalizowanie zniekształceń spowodowanych mapowaniem, możesz zapoznać się z sekcją 1.5 tego artykułu o klejnotach GPU:

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

Może to działać nawet na proceduralnie generowanym terenie. Koncepcja ta znana jest również jako „teksturowanie trójplanarne” .

PÓŹNA EDYCJA: Przetestowałem tę technikę w moim rendererze terenu, nie wykorzystując do obliczeń żadnych wstępnie obliczonych ultrafioletów. Wszystko, co musisz zrobić, to obliczyć 3 zestawy promieni UV dla 3 różnych płaszczyzn projekcji (XY, YZ i ZX). Można to osiągnąć za pomocą prostych fragmentów modułu cieniującego wierzchołków i fragmentów:

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
źródło
3

Możesz zdefiniować zestaw tekstur (trawa, brud, skała) i użyć ich. Powiedzmy, że używając tych trzech warstw (kamień na dole, brud na górze i trawa na szczycie), możesz zdefiniować trzy kanały alfa, aby określić, jak duża jest widoczność każdej tekstury. Zacznij od prostej mapy hałasu dla kanałów alfa i być może weź pod uwagę nachylenie terenu. Im bardziej nachylenie, tym więcej skały będzie świecić. Jest to technika zwana „rozpryskiwaniem tekstur”, o ile pamiętam. Oto kilka linków, które pomogą Ci zacząć. Zaawansowane teksturowanie (gamasutra)

TextureSplatting (charlesbloom, ten, w którym zaczynałem pracę z tym tematem)

Powinieneś być w stanie uzyskać dobre wyniki raczej szybki, bardzo satysfakcjonujący temat

pettersson
źródło