วิธีการ LOD ที่ดีที่สุดสำหรับการเรนเดอร์ดาวเคราะห์


23

ฉันกำลังทำวิทยานิพนธ์ของฉันมันเป็นเครื่องมือในการแสดงภูมิประเทศขนาดดาวเคราะห์

ฉันยังทำการค้นคว้าเสร็จและพบสิ่งต่าง ๆ มากมายเกี่ยวกับเรื่องนี้ปัญหาคือฉันไม่สามารถตัดสินใจได้ว่าควรใช้วิธีใดในระดับรายละเอียด (LOD)

ฉันรู้เกี่ยวกับ geomipmapping, geometry clipmaps (GPU) และ chunked LOD โดย Ulrich ที่ทำงานได้ดีบนภูมิประเทศขนาดใหญ่และสามารถใช้ในการเรนเดอร์ 6 หน้าของลูกบาศก์แล้ว "spherify" cube ด้วยวิธีนี้และฉันเข้าใจวิธีการใช้ทั้งหมด วิธีการเหล่านี้ใน GPU โดยใช้ C ++ / OpenGL / GLSL (ใช้วิธีการเช่น ROAM หรือวิธีอื่น ๆ ที่ไม่ได้ใช้คิวบ์ไม่อยู่ในมือฉันเพราะการทำพื้นผิวเป็นเรื่องเจ็บปวด) นอกจากนี้เมื่อเร็ว ๆ นี้ฉันได้เข้าสู่การสอนเกี่ยวกับการเรนเดอร์ภูมิประเทศโดยใช้เทสเซลเลชันเชดเดอร์ที่นี่

ดังนั้นฉันไม่มีเวลาที่จะใช้วิธีการทั้งหมดและดูว่าวิธีใดดีที่สุดและเหมาะสมกว่าสำหรับระดับดาวเคราะห์และฉันขอให้ที่นี่เพื่อดูว่ามีคนทำการเปรียบเทียบแบบนี้และช่วยฉันตัดสินใจว่าวิธีใด ฉันควรติดตั้งและใช้งาน (ผู้สอนของฉันเป็นบ้าและอยากให้ฉันทำอะไรกับ icosahedron แต่ฉันไม่เข้าใจวิธีการนั้นยกเว้นว่าใช้ ROAM)

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

คำขออื่นคือฉันรู้ว่ามีปัญหาเกี่ยวกับความแม่นยำของตัวเลขลอยเมื่อได้รับรายละเอียดจำนวนมากในภูมิประเทศฉันไม่รู้วิธีแก้มันฉันอ่านวิธีแก้ปัญหาในฟอรัม แต่ไม่เข้าใจวิธีการ ใช้ฉันลืมติดตามหัวข้อนั้นและฉันต้องการทราบวิธีแก้ปัญหาความแม่นยำนี้

ขณะนี้ฉันกำลังอ่านเกี่ยวกับการแปลงเมทริกซ์เพื่อแก้ปัญหาความแม่นยำลอยปัญหาการต่อสู้แบบ z การต่อสู้แบบ frustum ที่มีค่า z แบบไดนามิกและการแสดงข้อมูลสำหรับชิ้นส่วน (ใช้พื้นที่แพทช์ที่มีลอยและตำแหน่งในพิกัดโลกเป็นสองเท่า) ฉันคิดว่าฉันสามารถแก้ปัญหาความแม่นยำได้อย่างง่ายดาย ฉันยังต้องการการเปรียบเทียบระหว่างวิธี LOD กับความคิดเห็นและข้อเสนอแนะของคุณเพื่อตัดสินใจว่าจะดีกว่าสำหรับโครงการนี้ ใช้เวลานับความยากลำบากในการนำไปใช้กับคุณภาพของภาพกับประสิทธิภาพฉันต้องการสิ่งที่ดีที่สุด

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


6
ไม่มีวิธี "ดีที่สุด" ในระดับสากล มีเพียงคุณเท่านั้นที่รู้ข้อกำหนดทั้งหมดของโครงการของคุณและคุณรู้เกี่ยวกับตัวเลือก LOD จำนวนมาก สุดท้ายคุณควรตัดสินใจด้วยตัวเองเพราะเป็นส่วนหนึ่งของวิทยานิพนธ์ของคุณ วิทยานิพนธ์ของคุณแสดงความรู้เกี่ยวกับหัวข้อที่คุณกำลังศึกษา หากคุณไม่รู้ว่าสิ่งไหนดีที่สุดสำหรับความต้องการของคุณบางทีคุณควรศึกษาทางเลือกเพิ่มเติมอีกเล็กน้อย
MichaelHouse

@ Byte56 คุณพูดถูกและฉันค้นคว้าข้อมูลเกี่ยวกับวิธีการของ LOD อย่างมากมายฉันแค่อยากเห็นคำแนะนำจากคนอื่น ๆ ที่นำบางส่วนมาใช้และพูดคุยเกี่ยวกับ preformance และคุณภาพของภาพเพื่อที่ฉันจะได้เลือก ... สำหรับความคิดเห็นของคุณ :) และโดยวิธีการในปัจจุบันฉันเข้าใจเกี่ยวกับ tadersion shaders และพบว่าการกวดวิชาที่ดี (เชื่อมโยงกับคำถามหลัก) และฉันคิดว่าฉันจะไปที่มันอธิบายไว้สำหรับการแสดงผลภูมิประเทศเพียง แต่ฉันสามารถแก้ไขได้ เพื่อทำให้ใบหน้าที่ 6 และทำให้ก้อนกลม
nosmirck

vterrain.org/LODมีข้อมูลจำนวนมากเกี่ยวกับหัวข้อของการเรนเดอร์ภูมิประเทศ ส่วนที่เชื่อมโยงจะแสดงเอกสารและแหล่งข้อมูลอื่น ๆ สำหรับระดับอัลกอริธึมรายละเอียด vterrain.org/LOD/spherical.htmlจัดการกับกริดทรงกลม (เช่นดาวเคราะห์)
Exilyth

@sarahm ฉันรู้ว่ามีที่ฉันเริ่มฉันสีแดงพวกเขาทั้งหมด ... ฉันเพียงแค่ต้องเปรียบเทียบระหว่างวิธีการ LOD บางอย่างเพื่อเลือกสิ่งที่ใช้ฉันสามารถทำพวกเขาทั้งหมด แต่ฉันไม่มีเวลา ... ฉันจะมีวิธีการที่ใช้ shaders tessellation มันเป็นสิ่งใหม่และไม่มีการดำเนินการทำบนพื้นผิวทรงกลม :)
nosmirck

3
ฉันรู้ว่าคุณได้ทำการวิจัยจำนวนมากแล้วและฉันไม่แน่ใจว่าสิ่งนี้มาถึงเดสก์ท็อปของคุณ แต่ลองดูที่ "การออกแบบเครื่องยนต์ 3 มิติสำหรับโลกเสมือน: Patrick Cozzi และ Kevin Ring" - ฉันพบมาก ของข้อมูลที่เป็นประโยชน์ที่ดีอยู่ในนั้น มันได้รับการวิจัยอย่างดีและตามที่กล่าวมานำมาจากมุมมองที่เป็นประโยชน์อย่างมาก HTH ไม่ทางใดก็ทางหนึ่ง
Schoenobates

คำตอบ:


17

ในที่สุดหลังจากการค้นคว้าจำนวนมากฉันสามารถสรุปได้ว่าอย่างที่ใครบางคนพูดก่อนหน้านี้ไม่มีวิธี "ดีที่สุด" ในระดับสากล แต่งานวิจัยของฉันทำให้ฉันรู้ถึงสิ่งต่าง ๆ ต่อไปนี้:

ขึ้นอยู่กับตาข่ายในที่สุดคุณจะใช้:

  • Cube Spherified:วิธี LOD ใด ๆ ที่มีการใช้ quadtree จะทำงานได้ดีคุณต้องดูแลในกรณีพิเศษเช่นเส้นขอบระหว่างใบหน้าในกรณีที่ quadtree ของคุณจะต้องมีตัวชี้ไปยังเพื่อนบ้านในใบหน้า adyacent ในแต่ละระดับ
  • อื่น ๆ :ฉันคิดว่า ROAM (รุ่นใหม่กว่า 2.0 หรือส่วนขยายอื่น ๆ เช่น BDAM, CABTT หรือ RUSTIC) จะทำได้ดีอย่างไรก็ตามอัลกอริทึมเหล่านี้ทำงานได้ยากต้องใช้หน่วยความจำมากขึ้นและช้ากว่า aproaches อื่น ๆ ที่มีลูกบาศก์

มีวิธีการ LOD มากมายที่สามารถเข้ากันได้ดี แต่ 5 อันดับแรกของฉันคือ:

  1. LOD ขึ้นอยู่กับระยะทางอย่างต่อเนื่อง (CDLOD)
  2. คลิปบอร์ด Geomety ที่ใช้ GPU (GPUGCM)
  3. ก้อนหนา ๆ
  4. การแสดงผลภูมิประเทศด้วย OpenGL GPU Tessellation (หนังสือ: OpenGL Insight, บทที่ 10)
  5. การทำแผนที่ทางเรขาคณิต

แต่ละคนเสนอวิธีที่ไม่ซ้ำกันในการเรนเดอร์ภูมิประเทศตัวอย่างเช่น CDLOD มีการนำไปใช้งานที่ง่ายมากโดยใช้ shaders (GLSL หรือ HLSL) แต่ยังสามารถนำไปใช้กับ CPU (สำหรับฮาร์ดแวร์ดั้งเดิม) ได้อย่างไรก็ตามเป้าหมายของ Planet Rendering คือ ดีที่สุดสำหรับ GPU ที่ทันสมัยดังนั้น GPUGCM จะดีที่สุดเมื่อคุณต้องการบีบ GPU ของคุณ พวกเขาทั้งสองทำงานได้ดีมากกับการแสดงข้อมูลขั้นตอนหรือแบบผสม (ภูมิประเทศตามข้อมูลคงที่หรือแผนที่ความสูงและรายละเอียดที่เพิ่มเข้ามากับการแสดงผลขั้นตอน) ของภูมิประเทศขนาดใหญ่

นอกจากนี้ยังมีส่วนขยายทรงกลมไปยังวิธีการทางเรขาคณิตพื้นฐานคลิปแมปที่มีอยู่ แต่มีปัญหาบางอย่างเพราะตัวอย่างภาพถ่ายของความสูงความสูงจะต้องมีการ parametrized โดยใช้พิกัดทรงกลม

Chunked LOD นั้นเหมาะสำหรับฮาร์ดแวร์แบบดั้งเดิมไม่จำเป็นต้องใช้การคำนวณด้าน GPU ใด ๆ มันเหมาะสำหรับชุดข้อมูลขนาดใหญ่ แต่ไม่สามารถจัดการข้อมูลขั้นตอนได้แบบเรียลไทม์ (อาจมีการแก้ไขบางอย่าง)

การใช้เฉดสี Tessellation เป็นอีกเทคนิคใหม่มากเนื่องจาก OpenGL 4.x ออกมาในความคิดของฉันมันอาจจะดีที่สุด แต่เรากำลังพูดถึง Planet Rendering เราพบปัญหาว่าวิธีการอื่นสามารถจัดการได้ง่ายมากและเป็น เกี่ยวกับความแม่นยำ

หากคุณไม่ต้องการให้ความแม่นยำของคุณอยู่ที่ 1 กิโลเมตรระหว่างแนวตั้งเท่านั้น ปัญหาของภูมิประเทศที่ใหญ่มาก ๆ ด้วยวิธีนี้ก็คือการกระวนกระวายใจเป็นการยากที่จะแก้ไข (หรืออย่างน้อยสำหรับฉัน

Geomipmapping เป็นเทคนิคที่ยอดเยี่ยมใช้ประโยชน์จาก quadtree และมีข้อผิดพลาดของพิกเซลต่ำ แต่สำหรับการเรนเดอร์ดาวเคราะห์คุณจะต้องกำหนดรายละเอียดอย่างน้อย 16+ ระดับนั่นหมายความว่าคุณจะต้อง (สำหรับการเย็บริน) ในการเชื่อมต่อระดับต่าง ๆ และดูแลระดับเพื่อนบ้านของคุณอาจเป็นการแก้ปัญหาที่น่าเบื่อโดยเฉพาะอย่างยิ่งการใช้ใบหน้า 6 ภูมิประเทศ

มีวิธีอื่นโดยเฉพาะอย่างยิ่งในตัวของมันเอง: "Projective Grid Mapping for Planetary Terrain"ยอดเยี่ยมสำหรับการสร้างภาพ แต่มีข้อเสียถ้าคุณต้องการทราบข้อมูลเพิ่มเติมไปที่ลิงค์

ปัญหา:

  • กระวนกระวายใจ : GPU ในปัจจุบันส่วนใหญ่รองรับเฉพาะค่าจุดลอยตัว 32 บิตซึ่งไม่แม่นยำพอสำหรับการจัดการตำแหน่งขนาดใหญ่ในภูมิประเทศของดาวเคราะห์ กระวนกระวายใจเกิดขึ้นเมื่อผู้ชมซูมเข้าและหมุนหรือย้ายจากนั้นรูปหลายเหลี่ยมจะเริ่มเด้งไปมา

    ทางออกที่ดีที่สุดสำหรับสิ่งนี้คือการใช้วิธีการ "แสดงผลญาติกับการใช้ GPU" วิธีนี้อธิบายไว้ในหนังสือ "การออกแบบเครื่องยนต์ 3D สำหรับลูกโลกเสมือนจริง" (ฉันแน่ใจว่าคุณสามารถหามันได้บนอินเทอร์เน็ตเช่นกัน) โดยที่คุณต้องตั้งตำแหน่งทั้งหมดของคุณด้วยการเพิ่มซีพียูเป็นสองเท่า (แพทช์คลิปแผนที่วัตถุ frustrum, กล้อง ฯลฯ ) จากนั้น MV จะอยู่กึ่งกลางผู้ชมโดยการตั้งค่าการแปลเป็น (0, 0, 0) T และคู่ถูกเข้ารหัสในรูปแบบจุดคงที่โดยใช้เศษส่วน (mantissa) ของสองลอยต่ำ และสูงโดยวิธีการบางอย่าง (อ่านเกี่ยวกับการใช้งานการใช้งานของ Ohlarik และห้องสมุด DSFUN90 Fortran)

    แม้ว่า Shader Vertex ต้องการเพียงการลบสองครั้งเพิ่มเติมและการเพิ่มอีกหนึ่งครั้ง GPU RTE จะเพิ่มจำนวนหน่วยความจำบัฟเฟอร์จุดสุดยอดที่ต้องการสำหรับตำแหน่ง สิ่งนี้ไม่จำเป็นต้องเพิ่มความต้องการของหน่วยความจำเป็นสองเท่าเว้นแต่เก็บเฉพาะตำแหน่ง

  • ความแม่นยำของบัฟเฟอร์ลึก : Z-fighting ในขณะที่เรากำลังเรนเดอร์ภูมิประเทศที่มีขนาดใหญ่มากในกรณีนี้: ดาวเคราะห์ Z-buffer จะต้องมีขนาดใหญ่ แต่มันไม่สำคัญว่าคุณจะตั้งค่าสำหรับ znear และ zfar เท่าไรจะมีปัญหาเสมอ

    เนื่องจาก Z-buffer ขึ้นอยู่กับช่วงเวลาจุดลอยตัวและยังเป็นค่าแบบเส้นตรง (แม้ว่าการฉายภาพในมุมมองจะไม่เป็นแบบเส้นตรง) ค่าที่อยู่ใกล้กับดวงตาจะได้รับผลกระทบจากการต่อสู้แบบ Z เนื่องจากไม่มีความแม่นยำ 32 บิต

    วิธีที่ดีที่สุดในการแก้ปัญหานี้คือการใช้ "Logarithmic Depth Buffer" http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html

    บัฟเฟอร์ความลึกแบบลอการิทึมช่วยเพิ่มความแม่นยำของบัฟเฟอร์ความลึกสำหรับวัตถุระยะไกลโดยใช้การแจกแจงแบบลอการิทึมสำหรับ zscreen มันแลกเปลี่ยนความแม่นยำสำหรับวัตถุใกล้เพื่อความแม่นยำสำหรับวัตถุที่อยู่ห่างไกล เนื่องจากเราแสดงผลด้วยวิธี LOD วัตถุไกลจึงต้องการความแม่นยำน้อยกว่าเนื่องจากมีสามเหลี่ยมน้อยกว่า

สิ่งสำคัญที่ต้องพูดถึงคือวิธีการทั้งหมดที่ระบุไว้ (ยกเว้นตาราง projective) นั้นดีมากเมื่อทำการฟิสิกส์ (ส่วนใหญ่มีการชน) เนื่องจากฐาน Quadtree นั่นเป็นสิ่งที่จำเป็นถ้าคุณวางแผนที่จะสร้างเกม

โดยสรุปเพียงแค่ตรวจสอบตัวเลือกทั้งหมดที่มีและไปหาคนที่คุณรู้สึกสบายใจมากขึ้นในความคิดของฉัน CDLOD ทำงานได้ดีมาก อย่าลืมแก้ปัญหากระวนกระวายใจและ Z-buffer และที่สำคัญที่สุด: ขอให้สนุก!

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ LOD ตรวจสอบลิงค์นี้

สำหรับการสาธิตที่สมบูรณ์เกี่ยวกับการ spherifying cube ตรวจสอบลิงค์นี้

สำหรับคำอธิบายที่ดีขึ้นเกี่ยวกับการแก้ปัญหาการกระวนกระวายใจและการขัดจังหวะโดย Z-Buffer ตรวจสอบหนังสือเล่มนี้

ฉันหวังว่าคุณจะพบว่ารีวิวนี้มีประโยชน์


1
ฉันชอบที่จะรู้เพิ่มเติมเกี่ยวกับเส้นทางการวิจัยของคุณ ฉันสามารถติดตามการอัปเดตของคุณได้หรือไม่ บล็อกหรืออะไร
Syaiful Nizam Yahya

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