Apa sajakah cara untuk memetakan tekstur suatu medan?


10

Saya bekerja dengan XNA pada Game 3D, dan saya mencoba memiliki lingkungan yang baik dan bagus. Saya benar-benar mengikuti tutorial untuk membuat medan dari peta ketinggian. Untuk teksturnya, saya hanya menerapkan tekstur rumput di atasnya dan ubin beberapa kali.

Tetapi yang ingin saya lakukan adalah memiliki tekstur yang benar-benar realistis, tetapi juga menghasilkannya secara otomatis (misalnya jika saya ingin menggunakan suara Perlin untuk menghasilkan medan dan kemudian teksturnya).

Saya sudah belajar tentang multi-tekstur, memuat file peta dengan warna yang berbeda untuk tekstur yang berbeda, tetapi saya tidak berpikir ini sangat efisien, misalnya untuk tebing atau daerah yang sangat curam itu akan membentuk tekstur yang buruk karena pemandangan dari teratas. (Juga, aku tidak tahu bagaimana aku akan menggambar jalan atau jalan tanah dengan itu.)

Saya sedang mencari solusi yang efisien untuk pemetaan tekstur yang dihasilkan secara realistis secara realistis.


1
Masalah pemetaan Anda sama sekali tidak sepele. Itu tidak dapat dijawab dengan benar dalam beberapa paragraf. Saya sarankan Anda melihat pemetaan harmonik dan apa yang dijelaskan dalam makalah ini: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Jawaban:


2

Saya kira Anda tidak peduli dengan campuran peta atau percikan tekstur (karena itu tidak tergantung pada pemetaan UV Anda). Karena Anda secara khusus meminta meminimalkan distorsi yang disebabkan oleh pemetaan, Anda dapat membaca bagian 1.5 dari artikel Permata GPU ini:

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

Ini dapat bekerja bahkan di medan yang dihasilkan secara prosedural. Konsep ini juga dikenal sebagai "triplanar texturing" .

EDIT KEMUDIAN: Saya telah menguji teknik di renderer terain saya sendiri tanpa menggunakan uv yang telah dikomputasi untuk pemetaan. Yang harus Anda lakukan adalah menghitung 3 set UV untuk 3 bidang proyeksi yang berbeda (XY, YZ dan ZX). Ini dapat dicapai menggunakan potongan vertex dan fragmen shader sederhana:

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

Anda dapat menentukan satu set tekstur (rumput, tanah, batu) dan menggunakannya. Katakanlah menggunakan tiga lapisan ini (batu di bagian bawah, kotoran di atas dan rumput paling atas), Anda dapat menentukan tiga saluran alfa untuk menentukan seberapa banyak setiap tekstur terlihat. Mulailah dengan peta kebisingan sederhana untuk saluran alfa Anda dan mungkin pertimbangkan kemiringan medan. Semakin banyak lereng, semakin banyak batu yang akan bersinar. Ini adalah teknik yang disebut 'Texture Splatting' sejauh yang saya ingat. Berikut ini beberapa tautan untuk membantu Anda memulai. Advanced Texture Splatting (gamasutra)

TextureSplatting (charlesbloom, yang saya gunakan untuk memulai topik ini)

Anda harus bisa mendapatkan hasil yang terlihat bagus dengan topik yang cepat dan sangat bermanfaat

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.