Akhirnya, setelah banyak meneliti saya dapat menyimpulkan bahwa, seperti yang dikatakan seseorang sebelumnya, Tidak ada metode "terbaik" yang universal. Tetapi penelitian saya membuat saya mengetahui hal-hal berikut:
Bergantung pada jala Anda akhirnya akan menggunakan:
- Spherified Cube: metode LOD apa pun dengan implementasi quadtree akan berfungsi dengan baik, Anda hanya harus berhati-hati pada kasus khusus seperti perbatasan antara wajah, yang mana, quadtree Anda harus memiliki pointer ke tetangga di wajah adyacent di setiap level.
- Yang lain: Saya pikir ROAM (versi yang lebih baru 2.0 atau ekstensi lain seperti BDAM, CABTT atau RUSTIC) akan bekerja dengan baik, namun, algoritma ini sulit untuk dikerjakan, memerlukan lebih banyak memori dan sedikit lebih lambat dibandingkan dengan pendekatan lain dengan kubus.
Ada banyak metode LOD yang cocok, tetapi top 5 pribadi saya adalah:
- Distance-Dependent Distance LOD (CDLOD)
- Kliping Geometri Berbasis GPU (GPUGCM)
- Chunked LOD
- Rendering Terrains dengan OpenGL GPU Tessellation (Buku: OpenGL Insight, Bab 10)
- Pemetaan Geometris
Masing-masing menawarkan cara unik untuk membuat medan, misalnya, CDLOD memiliki implementasi yang sangat mudah menggunakan shader (GLSL atau HLSL) tetapi juga mampu diimplementasikan pada CPU (untuk perangkat keras sebelumnya) namun tujuan Planet Rendering adalah untuk meledakkan terbaik pada GPU modern, jadi GPUGCM adalah yang terbaik saat Anda ingin memeras GPU Anda. Keduanya bekerja sangat baik dengan rendering berbasis data, prosedural atau campuran (dataran berdasarkan data tetap atau pemetaan tinggi dan detail yang ditambah dengan pekerjaan prosedural) rendering dari medan yang besar.
Juga ekstensi bola ke metode Klip Geaps geometrik dasar ada tetapi memiliki beberapa masalah karena sampel planar dari heightmap harus diparameterisasi menggunakan koordinat bola.
Chunked LOD, di sisi lain, sangat cocok untuk hardware lama, tidak memerlukan perhitungan sisi GPU untuk bekerja, itu sempurna untuk dataset besar tetapi tidak dapat menangani data prosedural secara real time (mungkin dengan beberapa modifikasi, itu bisa)
Menggunakan Tessellation shaders adalah teknik lain, sangat baru, sejak OpenGL 4.x keluar, menurut saya itu bisa menjadi yang terbaik, tetapi, kita berbicara tentang Planet Rendering, kita menghadapi masalah yang metode lain dapat tangani dengan sangat mudah dan itu adalah tentang presisi.
Kecuali jika Anda hanya menginginkan ketelitian Anda menjadi 1Km di antara vertikal, gunakan Tessellation shaders. Masalah dengan medan yang sangat besar dengan metode ini adalah bahwa jitter agak sulit untuk dipecahkan (atau setidaknya bagi saya, karena saya baru mengenal tessellation shaders).
Geomipmapping adalah teknik yang hebat, mengambil keuntungan dari quadtree dan memiliki kesalahan pixel yang diproyeksikan rendah, tetapi, untuk rendering planet Anda perlu mengatur setidaknya 16 tingkat level rincian, yang berarti Anda akan memerlukan (untuk menjahit tumpuan) beberapa patch tambahan untuk menghubungkan level yang berbeda dan menjaga level tetangga Anda, ini bisa membosankan untuk diselesaikan, terutama menggunakan 6 permukaan medan.
Ada metode lain, sangat khusus dalam dirinya sendiri: "Pemetaan Grid Proyektif untuk Medan Planetary" sangat baik untuk visualisasi, tetapi memiliki kelemahan, jika Anda ingin tahu lebih banyak, buka tautan.
Masalah:
Jitter : Sebagian besar GPU saat ini hanya mendukung nilai floating-point 32-bit, yang tidak memberikan cukup presisi untuk memanipulasi posisi besar di medan skala planet. Jitter terjadi ketika pemirsa memperbesar dan memutar atau bergerak, maka poligon mulai memantul ke depan dan ke belakang.
Solusi terbaik untuk ini adalah dengan menggunakan metode "Rendering Relative to Eye Using the GPU". Metode ini dijelaskan dalam buku "Desain Mesin 3D untuk Globes Virtual" (Saya yakin Anda dapat menemukannya di internet juga) di mana pada dasarnya Anda harus mengatur semua posisi Anda dengan dua kali lipat pada CPU (patch, clipmaps, objek, frustrum, kamera, dll) dan kemudian MV berpusat di sekitar pemirsa dengan mengatur terjemahannya ke (0, 0, 0) T dan ganda dikodekan dalam representasi titik tetap menggunakan fraksi (mantissa) bit dua float, rendah dan tinggi dengan beberapa metode (baca tentang Menggunakan implementasi Ohlarik dan The DSFUN90 Fortran library).
Meskipun vertex shader hanya membutuhkan tambahan dua pengurangan dan satu tambahan, GPU RTE menggandakan jumlah memori buffer vertex yang diperlukan untuk posisi. Ini tidak harus menggandakan persyaratan memori kecuali hanya posisi yang disimpan.
Depth Buffer Precision : Z-fighting. Saat kita membuat medan yang sangat besar, dalam hal ini: planet, buffer-Z harus BESAR, tetapi tidak masalah dengan nilai yang Anda tetapkan untuk znear dan zfar, akan selalu ada masalah.
Karena Z-buffer tergantung pada interval titik float, dan juga itu adalah linear (walaupun proyeksi perspektif non linear) nilai-nilai di dekat mata menderita Z-Fighting karena kurangnya presisi float 32-bit miliki.
Cara terbaik untuk mengatasi masalah ini adalah dengan menggunakan "Buffer Depth Logarithmic"
http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html
Buffer kedalaman logaritmik meningkatkan presisi buffer kedalaman untuk objek yang jauh dengan menggunakan distribusi logaritmik untuk zscreen. Ini memperdagangkan presisi untuk objek dekat untuk presisi untuk objek yang jauh. Karena kita merender dengan metode LOD, objek jauh membutuhkan ketelitian yang lebih kecil karena mereka memiliki lebih sedikit segitiga.
Sesuatu yang penting untuk disebutkan adalah bahwa semua metode yang tercantum (kecuali untuk grid proyektif) sangat baik ketika melakukan fisika (kebanyakan tabrakan) karena basis Quadtree, itu adalah sesuatu yang wajib jika Anda berencana untuk membuat permainan.
Kesimpulannya, cukup periksa semua opsi yang tersedia dan pilih yang menurut Anda lebih nyaman, menurut saya CDLOD bekerja dengan baik. Jangan lupa untuk memecahkan masalah jitter dan Z-buffer, dan yang paling penting: bersenang-senang membuatnya!
Untuk informasi lebih lanjut tentang LOD, periksa tautan ini .
Untuk demostrasi lengkap tentang spherifying a cube periksa tautan ini .
Untuk penjelasan yang lebih baik tentang menyelesaikan masalah jittering dan Z-Buffer, periksa buku ini .
Saya harap Anda menganggap ulasan kecil ini bermanfaat.