Quali sono alcuni modi per mappare la trama di un terreno?


10

Sto lavorando con XNA su un gioco 3D e sto cercando di avere un ambiente adeguato e piacevole. In realtà ho seguito un tutorial per creare un terreno da una mappa di altezza. Per strutturarlo, applico solo una trama di erba su di esso e la piastrello più volte.

Ma quello che voglio fare è avere una trama molto realistica, ma anche generarla automaticamente (ad esempio se voglio usare il rumore Perlin per generare un terreno e poi strutturarlo).

Ho già appreso sul multi-texturing, caricando un file di mappa con colori diversi per diverse trame, ma non penso che sia davvero efficiente, ad esempio per scogliere o aree molto ripide piastrellerà male una trama poiché è una vista dal superiore. (Inoltre, non so come disegnerò strade o sentieri sterrati con quello.)

Sto cercando una soluzione efficiente per strutturare realisticamente la mappatura del terreno generato proceduralmente.


1
Il tuo problema di mappatura non è affatto banale. Non è possibile rispondere correttamente in alcuni paragrafi. Ti consiglio di dare un'occhiata alle mappature armoniche e a ciò che è spiegato in questo documento: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Risposte:


2

Suppongo che non ti preoccupi delle mappe di fusione o dello splatting delle trame (poiché è indipendente dalla tua mappatura UV). Dato che hai chiesto espressamente di ridurre al minimo la distorsione causata dalla mappatura, puoi consultare la sezione 1.5 di questo articolo Gemme GPU:

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

Ciò potrebbe funzionare anche su terreni generati proceduralmente. Il concetto è anche noto come "texturing triplanare" .

LATER EDIT: ho testato la tecnica nel mio renderizzatore di terreno senza usare uv precompilati per la mappatura. Tutto quello che devi fare è calcolare 3 set di UV per i 3 diversi piani di proiezione (XY, YZ e ZX). Ciò può essere ottenuto utilizzando semplici frammenti di shader di vertici e frammenti:

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

È possibile definire un insieme di trame (erba, terra, roccia) e utilizzarle. Diciamo che usando questi tre strati (roccia nella parte inferiore, sporcizia nella parte superiore e erba nella parte superiore), è possibile definire tre canali alfa per definire la quantità di ogni trama visibile. Inizia con una semplice mappa del rumore per i tuoi canali alfa e forse prendi in considerazione la pendenza del terreno. Più pendio, più roccia brillerà attraverso. Questa è una tecnica chiamata "Texture Splatting" per quanto mi ricordo. Ecco alcuni link per iniziare. Advanced Texture Splatting (gamasutra)

TextureSplatting (charlesbloom, quello che ho usato per iniziare con questo argomento)

Dovresti essere in grado di ottenere risultati di bell'aspetto piuttosto veloce, argomento molto gratificante

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.