Mengoptimalkan mesh untuk lanskap voxel cube


12

Bermain-main dengan menciptakan lanskap dunia minecraftish / lego di Unity 3D (lanskap voxel yang dihasilkan secara prosedural dengan kubus), saya menemukan bahwa jerat yang dibuat untuk lanskap ini membutuhkan banyak memori. Mesh saat ini hanya terdiri dari simpul untuk sisi kubus yang terlihat. Penggunaan memori untuk medan yang kompleks mungkin membutuhkan 6 atau 7 ratus mcg.

Jejaring ini dapat dioptimalkan, tetapi saya berjuang untuk menemukan algoritma yang layak untuk melakukan ini.

Algoritme harus mempertimbangkan bahwa Anda tidak ingin "menggabungkan" blok-blok yang berbeda jenis medan. Saya kira permulaan yang sangat sederhana mungkin untuk hanya memproses semua blok sepanjang satu sumbu, dan melakukan sapuan ekstra untuk dua sumbu lainnya.

Saya perlu menjaga bentuk mesh, yang tidak menggabungkan simpul ke titik bahwa ruang kosong atau padat diubah. Alasannya adalah, mungkin ada makhluk / dll yang masih perlu bernavigasi di sekitar jala. Jadi saya tidak bisa hanya membuat detail yang sangat rendah, jaring yang terdistorsi.

Adakah pemikiran / saran / kiat tentang ini?


2
Mengapa Anda menyimpan simpul untuk kubus ukuran yang dikenal? Lakukan secara algoritmik; atau gunakan buffer vertex bersama.
decaviatedcaviar

Mengapa mesh poligonal? Voxel dapat dirender dengan cukup efisien seperti mereka . Untuk satu voxel cube Anda membutuhkan 3 float (x, y, z), untuk 1 kotak Anda membutuhkan sekitar 8 * 3 float (8 simpul), dan jika Anda memiliki tepi dan poligon yang tersirat. Mungkin Unity bukan alat untuk masalah voxel ini.
user712092

Jawaban:


5

Pertanyaanku adalah:

Mengapa Anda membutuhkan jaring itu sendiri untuk melakukan gerakan makhluk?

Tidak bisakah Anda melakukan perhitungan lintasan pada matriks 3d id?

Saya pikir Minecraft menggunakan matriks 3d dengan 4 bit blok pr. Itu juga hanya mensimulasikan makhluk radius tertentu di sekitar pemain.

Anda dapat menyimpan potongan-potongan Anda dalam struktur pohon-oc, di mana setiap potongan dikompresi.

Jika Anda menyimpan data terkompresi dalam RAM, Anda dapat mendekompres data dengan cukup cepat saat dibutuhkan.

teks alternatif


Saya mengandalkan memiliki mesh untuk dibangun dalam deteksi tabrakan dengan Unity, tetapi tidak ada yang menghentikan saya dari hanya menguji tabrakan / pathing terhadap struktur data khusus. Namun, saya masih perlu membuat jaring yang terlihat untuk menampilkan medan, dan inilah yang perlu saya optimalkan.
James Livingston

Satu hal lagi ... seperti yang dapat Anda lihat dari tangkapan layar ... tidak ada banyak bidang yang datar ini. Mesh umumnya permukaan kasar kubus, tapi saya pikir ada beberapa ruang untuk mengoptimalkan wajah mesh / simpul. Sepertinya sebuah octree akan lebih baik untuk data yang memiliki banyak blok data yang serupa, daripada data "jaggy". Atau ini tidak benar?
James Livingston

@Gatorfrog: Ingat, ruang kosong juga merupakan data. jika jaggy maka pasti, akan ada banyak bit menandakan kosong. Oktree hanya ada di sana untuk Anda mengetahui potongan mana yang harus Anda dekompresi sebelum Anda membuat mereka. Ruang kosong hanya akan menjadi sekelompok nol. Pekerjaan siang hari saya melibatkan bekerja dengan perpustakaan rendering voxel yang sangat canggih. Posting saya berikutnya akan menjelaskan apa yang mereka lakukan.
Nailer

Perpustakaan tempat saya bekerja melakukan hal-hal berikut: Membuat potongan data dan menyimpannya dalam database file datar. Setiap chunk memiliki id. Setiap kubus terdiri dari banyak bongkahan. Untuk setiap bidak ada dibuat sejumlah tingkat detail. Jika level detail tertinggi memiliki 100% voxel, tertinggi kedua memiliki 25% dari semua voxel dan kemudian dibagi 4 untuk setiap level berikutnya. Bongkahan yang dekat dengan Anda dapat divisualisasikan menggunakan tingkat detail tertinggi.
Nailer

semua data dikirim dalam bentuk terkompresi dari RAM ke VRAM di mana ia digelembungkan oleh algoritma kompresi GPGPU yang berjalan di CUDA. Ini menghemat banyak bandwidth memori. Jadi: Periksa di mana pemain berada dan dapatkan potongan detail tingkat tinggi di sana, hal-hal yang paling jauh dapat dengan mudah divisualisasikan menggunakan salah satu LOD yang lebih rendah.
Nailer

1

Bagaimana kalau menggunakan octree untuk menyimpan medan?

Misalnya udara = tidak ada simpul, semua jenis medan lainnya akan memiliki simpul dengan jenis medan.

Saat memasukkan / menghapus node, Anda dapat memeriksa apakah kedelapan anak dari setiap node pada path tree yang dimodifikasi memiliki tipe terain yang sama dan menggabungkannya jika diperlukan. Dengan begitu, balok besar dari bahan yang sama hanya akan memakan satu simpul.


0

Apakah Anda hanya membuat kubus untuk bagian geometri yang bisa dilihat pemain? Itu akan menjadi langkah pertama saya. Tergantung pada ukuran medan Anda, Anda tidak harus memiliki seluruh dunia dimuat / gambar / terlihat / apa pun.


Saya hanya membuat jaring untuk sisi kubus yang memiliki udara kosong di sebelahnya. Sejauh tidak menggambar jerat yang tidak bisa dilihat pemain ... Saya berpikir untuk mengecualikan bongkahan yang tidak memiliki blok yang terlihat, seperti gua bawah tanah atau lubang yang mengarah ke tanah pada sudut. Saya pasti tidak akan bisa mengandalkan jerat saya untuk tabrakan / jalur pada saat itu.
James Livingston
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.