ในที่สุดหลังจากการค้นคว้าจำนวนมากฉันสามารถสรุปได้ว่าอย่างที่ใครบางคนพูดก่อนหน้านี้ไม่มีวิธี "ดีที่สุด" ในระดับสากล แต่งานวิจัยของฉันทำให้ฉันรู้ถึงสิ่งต่าง ๆ ต่อไปนี้:
ขึ้นอยู่กับตาข่ายในที่สุดคุณจะใช้:
- Cube Spherified:วิธี LOD ใด ๆ ที่มีการใช้ quadtree จะทำงานได้ดีคุณต้องดูแลในกรณีพิเศษเช่นเส้นขอบระหว่างใบหน้าในกรณีที่ quadtree ของคุณจะต้องมีตัวชี้ไปยังเพื่อนบ้านในใบหน้า adyacent ในแต่ละระดับ
- อื่น ๆ :ฉันคิดว่า ROAM (รุ่นใหม่กว่า 2.0 หรือส่วนขยายอื่น ๆ เช่น BDAM, CABTT หรือ RUSTIC) จะทำได้ดีอย่างไรก็ตามอัลกอริทึมเหล่านี้ทำงานได้ยากต้องใช้หน่วยความจำมากขึ้นและช้ากว่า aproaches อื่น ๆ ที่มีลูกบาศก์
มีวิธีการ LOD มากมายที่สามารถเข้ากันได้ดี แต่ 5 อันดับแรกของฉันคือ:
- LOD ขึ้นอยู่กับระยะทางอย่างต่อเนื่อง (CDLOD)
- คลิปบอร์ด Geomety ที่ใช้ GPU (GPUGCM)
- ก้อนหนา ๆ
- การแสดงผลภูมิประเทศด้วย OpenGL GPU Tessellation (หนังสือ: OpenGL Insight, บทที่ 10)
- การทำแผนที่ทางเรขาคณิต
แต่ละคนเสนอวิธีที่ไม่ซ้ำกันในการเรนเดอร์ภูมิประเทศตัวอย่างเช่น 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 ตรวจสอบหนังสือเล่มนี้
ฉันหวังว่าคุณจะพบว่ารีวิวนี้มีประโยชน์