ฉันจะรวมฟิสิกส์เข้ากับโลกที่สร้างขึ้นจากขั้นตอนทางเรขาคณิตได้อย่างไร


10

โดยพื้นฐานแล้วฉันต้องการที่จะลบความจำเป็นในการสร้างสัญญาณรบกวนจาก CPU ไปยัง GPU จากที่นั่นฉันต้องการสร้างภูมิประเทศสำหรับโลกสามมิติโดยใช้เสียงนี้เป็นความหนาแน่นในจุด voxel หลังจากนี้ฉันต้องการนำความหนาแน่นเหล่านั้นมารวมกันเป็นรูปหลายเหลี่ยม (สร้างจุดยอด) ที่แสดงถึงภูมิประเทศของโลก

นี่เป็นเรื่องปกติและทุกอย่าง แต่ฉันยังต้องการที่จะทำให้โลกผิดปกติแบบไดนามิกในเวลาจริง เมื่อฉันมาถึงจุดนี้ฉันมีปัญหาในการพยายามนำจุดยอดกลับไปที่ CPU เพื่อทำสิ่งต่าง ๆ เช่นการตรวจจับการชนและการคำนวณเกมทั้งหมดที่ฉันต้องการมีส่วนร่วมกับ CPU ไม่ใช่ GPU

ดังนั้นคำถามคือฉันจะรับเซตย่อยของจุดยอดกลับไปยัง CPU เพื่อจัดการกับการชนกันของสิ่งอื่นได้อย่างไร

และคำถามอีกข้อหนึ่ง: มีวิธีง่าย ๆ ในการตั้งจุดยอดและสร้างดัชนีจากพวกเขาบน GPU หรือไม่?

ฉันสับสนเช่นเดียวกับชนิดของเฉดสีที่ฉันควรใช้สำหรับสิ่งที่แตกต่างเหล่านี้ ฉันได้ยินคนที่ใช้ pixel shader เพื่อรวบรวมความหนาแน่นแล้วใช้ geometry shader สำหรับจัดการกับการสร้างภูมิประเทศจากจุดยอดแล้วก็รวมส่วนยอด shader เพื่อทำการเปลี่ยนรูปแบบไดนามิก

ฉันใช้ C # 4.0, .NET 4.0 และ XNA Game Studio 4.0


1
คุณบอกว่าคุณกำลังใช้เรขาคณิต shader ในชื่อ แต่คุณก็บอกว่าคุณกำลังใช้ XNA4.0 เท่าที่ฉันรู้ XNA 4.0 ต้องใช้ DirectX 10 (เพื่อให้ง่ายต่อการพัฒนาสำหรับแพลตฟอร์มที่สม่ำเสมอกว่า) รองรับคุณสมบัติ SM3.0 เท่านั้นดังนั้นจึงไม่มีรูปทรงเรขาคณิต Forums.create.msdn.com/forums/p/31369/178924.aspx
Roy T.

และตอนนี้ฉันจะไม่ใช้ XNA อีกต่อไปหรือทำการออกแบบใหม่อีกครั้ง ขอบคุณสำหรับการชี้ให้เห็นว่า ฉันได้ดูมันและไม่ได้ตระหนักถึงข้อ จำกัด นี้ (ไม่มี SM 4) ฉันคิดว่าคำถามยังคงอยู่แม้ว่าโดยไม่พิจารณา XNA.So จากมุมมองของ DirectX เท่านั้นมีวิธีทำสิ่งที่ฉันต้องการหรือไม่ หรือบางทีด้วยจุดสุดยอดใน XNA?

1
XNA ยังใช้งานได้ดีเว้นแต่ว่าคุณจะได้รับกรณีทดสอบที่ได้รับการพิสูจน์แล้วว่าการเปลี่ยนรูปและการสร้างช้าเกินไป และการที่คุณได้รับการพิสูจน์แล้วในการทดสอบกรณีอื่นที่ GPU เบี้ยว + รุ่นและจากนั้นได้รับข้อมูลกลับไปซีพียูเร็วขึ้น :)
รอย T.

จริง เราพบว่าการใช้ XNA และการเก็บทุกอย่างไว้ใน CPU ทำให้เรามีจุดยอดเยี่ยมประมาณ 1 ล้านจุดในเวลาประมาณสามนาทีบน Core i7 ที่มี 8 คอร์และ 8 เธรดซึ่งขนานกันหลายส่วนของภูมิประเทศต่อเธรด เมื่อพยายามทำแบบเรียลไทม์และหวังว่าจะแสดงภูมิประเทศก่อนที่ผู้เล่นจะเห็นมันเราทำได้ประมาณ 20 เฟรมต่อวินาที ดังนั้นกรณีทดสอบจะแน่นอนตามลำดับของแต่ละวิธี
Michael J. Gray

คำตอบ:


3

เนื่องจาก XNA ไม่รองรับการแปลงรูปทรงเรขาคณิตฉันจะตอบราวกับว่าคุณใช้ DX 10 คุณมีสามตัวเลือกเป็นหลัก

ชุดรูปทรงเรขาคณิตชุดรูป ทรงจริงสามารถปรับเปลี่ยนและเพิ่มจุดยอดในบัฟเฟอร์จุดสุดยอดได้ คุณสามารถอ่านกลับเข้าไปในซีพียูได้ ฉันไม่ได้ดูมัน แต่มันเป็นไปได้อย่างแน่นอน

ใช้ซีพียูอย่างที่ สองทำไมคุณไม่คำนวณบนซีพียู? ข้อเท็จจริงที่ว่ามันทำงานบน GPU ในเฉดสีแสดงให้เห็นว่าอัลกอริทึมการเปลี่ยนรูปของคุณเป็นภาษาท้องถิ่นเช่นคุณสามารถสร้างเพียงส่วนที่เกี่ยวข้องสำหรับการตรวจสอบการชนของคุณ

ตัวอย่างเช่นฉันทำเกมแล่นเรือใบในขณะที่ผ่านมา มหาสมุทรใช้จุดยอดและรูปทรงเรขาคณิตในการเปลี่ยนรูปน้ำด้วยคลื่น ฉันใช้อัลกอริทึมแบบเดียวกันคำนวณบน CPU เพียงไม่กี่จุดใต้เรือสำหรับการเคลื่อนไหวของเรือในคลื่น ฉันแน่ใจว่าคุณสามารถทำสิ่งที่คล้ายกันสำหรับแผนที่ voxel ของคุณ

Pixel Shaders ตัวเลือกสุดท้ายที่คุณพูดถึงในคำถามของคุณเช่นกัน: สร้างความหนาแน่นใน pixel shader และเขียนลงบนพื้นผิว 3 มิติ คุณสามารถเข้าถึงสิ่งนี้ได้จากซีพียูและตัวบังแดดอย่างไม่เป็นอันตราย ตัวแบ่งพิกเซลเหมาะอย่างยิ่งสำหรับงานนี้ แต่วิธีนี้มีค่าใช้จ่ายจำนวนมาก การแสดงพื้นผิวปริมาณรวมถึงการสุ่มตัวอย่างจากในในจุดสุดยอดและภูมิศาสตร์ shaders และต้องอ่านพื้นผิวบนซีพียู

ฉันไม่ทราบรายละเอียดเฉพาะของโครงการของคุณ แต่ฉันจะใช้ CPU กับสิ่งนี้เสมอ โดยวิธีการคำนวณความหนาแน่นบน shaders เช่นกัน แต่ยึดติดกับการใช้กราฟิกการ์ดสำหรับการแสดงผล


ปัญหาหลักที่เรามีคืออุปสรรค GPU-CPU ในแง่ของเมื่อเราสร้างและแสดงภูมิประเทศบน GPU เราจะทราบได้อย่างไรว่าภูมิประเทศมีลักษณะอย่างไรในด้าน CPU ของสิ่งต่าง ๆ เพื่อทำการชนและสิ่งอื่น ๆ ฉันคิดว่าคุณคิดเกี่ยวกับการเก็บไว้ใน CPU ที่ถูกต้อง ฉันหมายความว่าเราอาจจะสามารถเพิ่มประสิทธิภาพอัลกอริทึมของเราได้เล็กน้อยและสร้างภูมิประเทศที่น้อยลง ฉันจะทำเครื่องหมายคำตอบของคุณเป็นวิธีแก้ปัญหาในหนึ่งหรือสองวันเพื่อดูว่าใครมีคำตอบ ขอบคุณสำหรับการกระตุ้นความคิดทางเลือกบางอย่าง
Michael J. Gray

จากตัวอย่างการแล่นเรือของคุณคุณจะไม่สามารถเชื่อมต่อผลลัพธ์ของรูปคลื่นของเรือที่แล่นผ่านคลื่นไปยัง GPU ได้อย่างง่ายดายใช่มั้ย
decaviatedcaviar

1
คุณสามารถใช้ระบบการเรนเดอร์แบบเดิมได้เช่นสร้างและเรนเดอร์ภูมิประเทศบน GPU แต่จำลองส่วนของภูมิประเทศที่คุณต้องการบนซีพียู ใช้อัลกอริทึมเดียวกันและพารามิเตอร์เดียวกันคุณจะได้รับภูมิประเทศเดียวกันบน CPU ตามที่เห็นบนหน้าจอ
Hannesh

@Daniel ไม่ใช่ด้วยอัลกอริทึมของคลื่นโดยตรง แต่เป็นไปได้ที่จะทำให้ตาข่ายน้ำเสียรูปตามการปลุกของเรือด้วยพื้นผิวการกระจัดที่เรือแต่ละลำ "ลาก" อยู่ด้านหลัง
Hannesh

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