Bir araziyi haritalamak için bazı yollar nelerdir?


10

XNA ile bir 3D Oyun üzerinde çalışıyorum ve düzgün ve güzel bir ortam elde etmeye çalışıyorum. Aslında bir yükseklik haritasından bir arazi oluşturmak için bir öğretici izledim. Dokulandırmak için üzerine bir çim dokusu uyguluyorum ve birkaç kez fayans yapıyorum.

Ama yapmak istediğim gerçekten gerçekçi bir tekstüre sahip olmak, ama aynı zamanda otomatik olarak üretmektir (örneğin, bir arazi oluşturmak ve sonra doku oluşturmak için Perlin gürültüsünü kullanmak istersem).

Farklı dokular için farklı renklere sahip bir harita dosyası yükleyerek çoklu doku oluşturmayı öğrendim, ancak bunun gerçekten etkili olduğunu düşünmüyorum, örneğin uçurumlar veya çok dik alanlar için, bir doku üst. (Ayrıca, bununla nasıl yol veya toprak yol çizeceğimi de bilmiyorum.)

Prosedürel olarak oluşturulan arazinin gerçekçi bir şekilde doku eşleştirilmesi için verimli bir çözüm arıyorum.


1
Haritalama sorununuz hiç de önemsiz değil. Birkaç paragrafta düzgün yanıtlanamaz. Harmonik eşlemelere ve bu makalede açıklananlara bir göz atmanızı
teodron

Yanıtlar:


2

Sanırım karışım haritaları veya doku sıçraması ile ilgilenmiyorsunuz (bu UV eşlemenizden bağımsızdır). Eşlemenin yol açtığı bozulmayı en aza indirmenizi özellikle istediğinden, bu GPU Mücevherleri makalesinin 1.5 bölümüne başvurabilirsiniz:

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

Bu, usulle oluşturulan arazide bile işe yarayabilir. Bu kavram "triplanar tekstüre" olarak da bilinir .

SON DÜZENLEME: Tek arazi oluşturucumda tekniği haritalama için önceden hesaplanmış uv kullanmadan test ettim. Tek yapmanız gereken 3 farklı projeksiyon düzlemi (XY, YZ ve ZX) için 3 set UV hesaplamak. Bu, basit köşe ve parça gölgelendirici parçacıkları kullanılarak gerçekleştirilebilir:

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

Bir dizi doku (çim, kir, kaya) tanımlayabilir ve bunları kullanabilirsiniz. Diyelim ki bu üç katmanı (altta kaya, üstte kir ve en üstte ot) kullanarak, her bir dokunun ne kadarının görünür olduğunu tanımlamak için üç alfa kanalı tanımlayabilirsiniz. Alfa kanallarınız için basit bir gürültü haritası ile başlayın ve belki de arazinin eğimini dikkate alın. Eğim ne kadar fazlaysa, kaya o kadar fazla parlar. Bu, hatırladığım kadarıyla 'Doku Sıçraması' adı verilen bir teknik. İşte başlamanız için bazı bağlantılar. Gelişmiş Doku Sıçraması (gamasutra)

TextureSplatting (charlesbloom, bu konuya başlarken kullandığım)

Oldukça hızlı ve çok faydalı bir konu olan iyi görünümlü sonuçlar alabilmelisiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.