Saat ini saya sedang mengerjakan tesis saya, ini adalah mesin untuk membuat medan ukuran planet.
Saya masih menyelesaikan penelitian saya dan saya telah menemukan banyak hal tentang subjek ini, masalahnya adalah saya tidak bisa memutuskan metode Level of Detail (LOD) mana yang harus saya gunakan.
Saya tahu tentang geomipmapping, geometri clipmaps (GPU) dan chunked LOD oleh Ulrich yang bekerja dengan baik pada medan yang besar dan dapat digunakan untuk membuat 6 wajah kubus dan kemudian "membuat kubus" kubus dengan metode ini dan saya mengerti bagaimana menerapkan semua metode ini pada GPU menggunakan C ++ / OpenGL / GLSL (menggunakan metode seperti ROAM atau metode lain yang tidak menggunakan kubus berada di luar jangkauan saya karena texturing adalah hal yang menyebalkan). Juga saya baru-baru ini masuk ke tutorial rendering medan menggunakan shading tessellation di sini
Jadi, saya tidak punya waktu untuk menerapkan SEMUA metode dan melihat mana yang terbaik dan lebih cocok untuk skala planet dan saya meminta di sini untuk melihat apakah seseorang telah membuat perbandingan semacam ini dan membantu saya memutuskan metode mana harus saya terapkan dan gunakan (tutor saya agak gila dan ingin saya melakukan sesuatu dengan icosahedron, tapi saya tidak bisa memahami metode itu kecuali menggunakan ROAM)
Bagaimanapun, jika Anda dapat membantu saya memutuskan atau memiliki saran atau metode lain, saya akan sangat menghargai. Salah satu syaratnya adalah bahwa metode tersebut harus dapat mengimplementasikan sisi GPU (setidaknya sebagian besar dari itu) untuk mencegah kemacetan CPU.
Permintaan lain adalah bahwa saya tahu ada masalah numerik tentang presisi dengan pelampung ketika mendapatkan banyak detail di medan, saya tidak tahu bagaimana menyelesaikannya, saya membaca solusi di forum tetapi tidak bisa memahami cara mengimplementasikan, saya kehilangan jejak utas itu dan saya ingin tahu bagaimana menyelesaikan masalah presisi ini.
Saat ini saya membaca tentang beberapa transformasi matriks untuk menyelesaikan ketepatan float, masalah z-fighting, frustum culling dengan nilai-z dinamis, dan representasi data untuk bongkahan (menggunakan ruang tambalan dengan pelampung dan posisinya di dunia berkoordinasi ganda) sehingga Saya pikir saya bisa menyelesaikan masalah presisi dengan mudah. Saya masih membutuhkan perbandingan antara metode LOD dengan pendapat dan saran Anda untuk memutuskan mana yang lebih baik untuk proyek ini. Mempertimbangkan kesulitan implementasi vs kualitas visual vs kinerja, saya ingin yang terbaik.
Sesuatu yang saya lupa sebutkan adalah bahwa generasi adalah hibrida, maksud saya, saya harus dapat membuat planet ini sepenuhnya menggunakan GPU (ketinggian dihitung dengan cepat) dan / atau menggunakan gambar peta ketinggian tinggi dan menambahkan rincian dengan GPU (titik) shader). Tekstur akan menjadi bagian samping. Saya akan kesulitan belakangan, saat ini saya senang menggunakan hanya warna tergantung pada ketinggian, atau mungkin menggunakan beberapa jenis tekstur suara yang dihasilkan pada fragmen shader.
sumber
Jawaban:
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:
Ada banyak metode LOD yang cocok, tetapi top 5 pribadi saya adalah:
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.
sumber