การทำแผนที่พื้นผิวมีวิธีใดบ้าง


10

ฉันทำงานกับ XNA ในเกม 3 มิติและฉันพยายามมีสภาพแวดล้อมที่เหมาะสมและดี ฉันติดตามการกวดวิชาเพื่อสร้างภูมิประเทศจากแผนที่ความสูง เพื่อทำพื้นผิวฉันแค่ใช้พื้นผิวหญ้าบนมันและเรียงมันหลาย ๆ ครั้ง

แต่สิ่งที่ฉันต้องการทำคือมีพื้นผิวที่เหมือนจริงมาก ๆ แต่ก็สร้างมันขึ้นมาโดยอัตโนมัติ (เช่นถ้าฉันต้องการใช้เสียง Perlin เพื่อสร้างภูมิประเทศ

ฉันเรียนรู้เกี่ยวกับการทำพื้นผิวหลายแบบการโหลดไฟล์แผนที่ที่มีสีแตกต่างกันสำหรับพื้นผิวที่แตกต่างกัน แต่ฉันไม่คิดว่ามันจะมีประสิทธิภาพจริง ๆ เช่นหน้าผาหรือพื้นที่สูงชันมากมันจะเรียงพื้นผิวไม่ดี ด้านบน (นอกจากนี้ฉันไม่รู้ว่าฉันจะวาดถนนหรือทางดินด้วยวิธีนั้นได้อย่างไร)

ฉันกำลังมองหาโซลูชันที่มีประสิทธิภาพในการทำแผนที่พื้นผิวที่สร้างขึ้นตามขั้นตอนจริง


1
ปัญหาการทำแผนที่ของคุณไม่สำคัญเลย ไม่สามารถตอบได้อย่างถูกต้องในสองสามย่อหน้า ฉันขอแนะนำให้คุณดูการแมปฮาร์มอนิกและสิ่งที่อธิบายไว้ในบทความนี้: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

คำตอบ:


2

ฉันเดาว่าคุณไม่ได้กังวลกับการผสมผสานแผนที่หรือการกระจายพื้นผิว (เนื่องจากเป็นอิสระจากการทำแผนที่ UV ของคุณ) เนื่องจากคุณขอให้ลดการบิดเบือนที่เกิดจากการทำแผนที่ให้น้อยที่สุดคุณสามารถศึกษาหัวข้อ 1.5 ของบทความ GPU Gems นี้:

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

สิ่งนี้สามารถทำงานได้แม้ในภูมิประเทศที่สร้างตามขั้นตอน แนวคิดที่รู้จักกันในนาม"triplanar พื้นผิว"

การแก้ไขภายหลัง: ฉันได้ทดสอบเทคนิคในโหมดแสดงภาพภูมิประเทศของตัวเองโดยไม่ใช้ UVs ที่คำนวณล่วงหน้าสำหรับการทำแผนที่ สิ่งที่คุณต้องทำคือคำนวณ UVs 3 ชุดสำหรับระนาบการฉาย 3 แบบ (XY, YZ และ ZX) สามารถทำได้โดยใช้จุดสุดยอดอย่างง่ายและตัวอย่างส่วน Shader:

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

คุณสามารถกำหนดชุดของพื้นผิว (หญ้าดินหิน) และใช้สิ่งเหล่านั้น สมมติว่าใช้สามเลเยอร์เหล่านี้ (หินที่ด้านล่างสิ่งสกปรกด้านบนและด้านบนสุดของหญ้า) คุณสามารถกำหนดช่องอัลฟาสามช่องเพื่อกำหนดว่าจะมองเห็นแต่ละพื้นผิวได้มากน้อยเพียงใด เริ่มต้นด้วยแผนที่สัญญาณรบกวนแบบง่ายสำหรับช่องอัลฟาของคุณและอาจคำนึงถึงความลาดชันของภูมิประเทศ ยิ่งมีความลาดชันมากเท่าใดหินก็ยิ่งส่องประกายมากขึ้นเท่านั้น นี่เป็นเทคนิคที่เรียกว่า 'Texture Splatting' เท่าที่ฉันจำได้ นี่คือลิงค์บางส่วนเพื่อให้คุณเริ่มต้นได้ Splatting พื้นผิวขั้นสูง (gamasutra)

TextureSplatting (charlesbloom คนที่ฉันเคยเริ่มหัวข้อนี้)

คุณควรจะได้รับผลลัพธ์ที่ดูดีค่อนข้างรวดเร็วหัวข้อที่คุ้มค่ามาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.