Medan ketinggian, Voxel, Polygon (geometri)


15

Sehubungan dengan terrain Heightmap, Voxel, dan Polygon:

  1. Apa perbedaan utama di antara ketiganya?
  2. Dapatkah Anda membentuk medan yang "halus" dengan Voxels, maksud saya, dapatkah Anda misalnya mendapatkan gunung yang mulus dengan Voxels, atau Voxels terbatas pada kubus?
  3. Dari segi kinerja, dunia 2000x2000 unit, apa yang akan lebih cepat menjadi dataran tinggi peta, medan Voxel atau berbasis Polygon, medan geometri? (Dengan asumsi bahwa ada keuntungan / optimasi kinerja "masuk akal" yang dilakukan untuk rendering untuk setiap kemungkinan)
  4. Apakah ada teknik lain yang digunakan untuk pembuatan medan?
  5. Adakah judul bagus yang mewakili masing-masing jenis?

Medan berbasis PS Polygon harus sepenuhnya dilayari, tidak ada barang yang berbentuk bujur sangkar.

Jawaban:


30

Ketinggian peta

Dengan peta ketinggian, Anda hanya menyimpan komponen ketinggian untuk setiap simpul (biasanya sebagai tekstur 2D) dan memberikan posisi dan resolusi hanya sekali untuk seluruh quad. Geometri lanskap dihasilkan setiap frame menggunakan geometri shader atau tessellation perangkat keras. Ketinggian peta adalah cara tercepat untuk menyimpan data lanskap untuk deteksi tabrakan.

Pro:

  • Penggunaan memori yang relatif rendah : Anda hanya perlu menyimpan satu nilai per titik dan tidak ada indeks. Dimungkinkan untuk meningkatkan ini lebih lanjut dengan menggunakan peta detail atau filter noise untuk meningkatkan detail yang dipersepsikan.

  • Relatif cepat : Geometri shader untuk pemetaan ketinggian kecil dan berjalan cepat. Ini tidak secepat medan geometri.
    Pada sistem tanpa akselerasi 3D berbasis segitiga, pemetaan ketinggian marching ray adalah cara tercepat untuk membuat medan. Ini disebut sebagai grafik voxel di game yang lebih lama.

  • Dynamic LOD / terrain : Dimungkinkan untuk mengubah resolusi mesh yang dihasilkan berdasarkan jarak dari kamera. Ini akan menyebabkan pergeseran geometri jika resolusi turun terlalu jauh (sekitar 0:40), tetapi dapat digunakan untuk efek yang menarik.

  • Pembuatan / pembuatan medan yang mudah : Peta ketinggian dapat dengan mudah dibuat dengan memadukan fungsi kebisingan seperti Perlin Noise fraktal dan editor ketinggian peta yang cepat dan mudah digunakan. Kedua pendekatan tersebut dapat digabungkan. Mereka juga mudah digunakan dalam editor.

  • Fisika yang efisien : Posisi horizontal memetakan langsung ke (biasanya) satu hingga empat posisi dalam memori, sehingga pencarian geometri untuk fisika sangat cepat.

Cons:

  • Tepat satu ketinggian per koordinat x / y : Biasanya tidak ada lubang di tanah atau tebing terjal.

  • Kontrol kurang : Anda hanya dapat mengontrol ketinggian yang tepat dari setiap titik jika ukuran kotak cocok dengan koordinat tekstur.

  • Artefak : Jika empat simpul yang menentukan sub-quad tidak pada bidang yang sama, perpecahan antara dua simpul akan menjadi terlihat. Ini biasanya terjadi pada tebing curam dengan tepi yang tidak mengikuti arah mata angin.

Heightmaps adalah cara rendering terrain yang paling efisien sejauh ini dan digunakan di banyak gim baru yang tidak mengandalkan fitur medan canggih dan memiliki area outdoor yang luas. Wikipedia memiliki daftar program yang menggunakan pemetaan ketinggian , tetapi saya tidak yakin apakah itu berarti mereka hanya menggunakannya sebagai sumber daya atau juga untuk render, jadi di sini ada beberapa permainan yang cenderung menggunakannya:

  • Penyebab 2: Wilayah dimuat dalam sektor persegi dan tidak ada lubang di medan. Dalam demo, ada lubang yang dalam dengan segitiga membentang di sepanjang tepi tempat biasanya ada bangunan. (Daerah ini biasanya tidak dapat diakses, tetapi ada mod untuk menghapus beberapa batasan demo ...)

  • Sims 2 ( mungkin ): Medan lingkungan dimuat sebagai peta ketinggian, tetapi ada lubang di mana banyak (situs bangunan) ditempatkan. Ada artefak khas jika Anda membuat banyak tebing, dan cukup membosankan untuk menambahkan ruang bawah tanah ke rumah (dan menyembunyikan tebing di bawah beranda).

  • Permainan mesin Sumber Valve: Brush persegi panjang (geometri level statis) dapat memiliki dataran yang dipetakan di wajah mereka. Dalam permainan ini, kebiasaan yang biasa sering disembunyikan dengan kuas atau alat peraga lainnya.

Mustahil untuk mengatakan dengan pasti tanpa melihat ke shader karena setiap dataran tinggi peta dapat diterjemahkan sebagai mesh.

Voxels

Voxel terrain menyimpan data terrain untuk setiap titik dalam kisi 3D. Metode ini selalu menggunakan sebagian besar penyimpanan per detail permukaan yang berarti, bahkan jika Anda menggunakan metode kompresi seperti oktri yang jarang.

(Istilah "mesin voxel" sering digunakan untuk menggambarkan metode pemetaan ketinggian medan ray yang umum di game 3D yang lebih lama. Bagian ini hanya berlaku untuk medan yang disimpan sebagai data voxel.)

Pro:

  • Data 3D berkelanjutan : Voxel adalah satu-satunya cara yang efisien untuk menyimpan data berkelanjutan tentang fitur medan tersembunyi seperti urat bijih.

  • Mudah dimodifikasi : Data voxel yang tidak terkompresi dapat diubah dengan mudah.

  • Fitur medan lanjutan : Dimungkinkan untuk membuat overhang. Terowongan itu mulus.

  • Generasi medan yang menarik : Minecraft melakukan ini dengan melapisi fungsi kebisingan dan gradien dengan fitur medan yang telah ditentukan (pohon, ruang bawah tanah). (Baca Generasi Terrain, Bagian 1 di blog Notch untuk info lebih lanjut. Tidak ada bagian 2 pada 05.8.2011.)

Cons:

  • Lambat : Untuk merender data voxel, Anda harus menggunakan ray tracer atau menghitung mesh, misalnya dengan marching cubes (Akan ada artefak). Voxel tetangga tidak independen untuk pembuatan mesh dan shader lebih rumit dan biasanya menghasilkan geometri yang lebih kompleks. Merender data voxel dengan LOD tinggi bisa sangat lambat.

  • Persyaratan penyimpanan besar : Menyimpan data voxel menggunakan banyak memori . Sering kali tidak praktis untuk memuat data voxel ke dalam VRAM karena alasan ini, karena Anda harus menggunakan tekstur yang lebih kecil untuk mengimbanginya, bahkan pada perangkat keras modern.

Tidak praktis menggunakan voxel untuk gim yang tidak bergantung pada fitur voxel seperti medan yang dapat dideformasi, tetapi dalam beberapa kasus dapat memungkinkan mekanisme gim yang menarik. Mesin Voxel lebih umum di gim yang lebih lama , tetapi ada juga contoh yang lebih baru:

  • Mesin Atomontage : rendering Voxel.

  • Cacing 4: Menggunakan "cacar". Menurut Wikipedia itu adalah campuran voxel dan poligon.

  • Minecraft: Menggunakan voxel untuk mewakili medan dalam RAM, grafiknya adalah grafik poligon. Sebagian besar perangkat lunak dihitung.

  • Terraria: Contoh untuk 2D voxels. Saya tidak tahu bagaimana hasilnya.

  • Voxel dikombinasikan dengan fisika : Bukan game. tetapi dengan baik menunjukkan potensi kehancuran.

  • Voxatron : Gim yang menggunakan voxel untuk hampir semua grafik, termasuk menu dan HUD.

Jerat

Jerat poligon adalah cara penyimpanan dan render medan yang paling fleksibel dan tepat. Mereka sering digunakan dalam game di mana kontrol yang tepat atau fitur medan yang canggih diperlukan.

Pro:

  • Sangat cepat : Anda hanya perlu melakukan perhitungan proyeksi seperti biasa di vertex shader. Shader geometri tidak diperlukan.

  • Sangat tepat : Semua koordinat disimpan secara terpisah untuk setiap titik, sehingga dimungkinkan untuk memindahkannya secara horizontal dan meningkatkan kepadatan jala di tempat dengan detail yang lebih halus.

  • Dampak memori rendah : Ini juga berarti mesh biasanya membutuhkan lebih sedikit memori daripada heighmap, karena simpul bisa lebih jarang di daerah dengan fitur yang lebih kecil.
    (Lihat jaringan tidak teratur Triangulasi di Wikipedia).

  • Tidak ada artefak : Mesh dibuat apa adanya, sehingga tidak akan ada gangguan atau batas yang tampak aneh.

  • Fitur medan canggih : Dimungkinkan untuk meninggalkan lubang dan membuat overhang. Terowongan itu mulus.

Cons:

  • LOD dinamis buruk : Hanya mungkin dengan jerat yang dikomputasi. Ini akan menyebabkan "lompatan" ketika beralih tanpa data tambahan untuk memetakan yang lama ke simpul baru.

  • Tidak mudah dimodifikasi : Menemukan simpul yang sesuai dengan area yang harus dimodifikasi lambat.

  • Tidak terlalu efisien untuk deteksi tabrakan : Tidak seperti pada pemetaan ketinggian dan voxel, alamat memori untuk lokasi tertentu biasanya tidak dapat dihitung secara langsung. Ini berarti fisika dan logika permainan yang bergantung pada geometri permukaan yang tepat kemungkinan besar akan berjalan lebih lambat daripada dengan format penyimpanan lainnya.

Medan poligon sering digunakan dalam game yang tidak memiliki area terbuka yang luas atau tidak dapat menggunakan dataran tinggi karena kurangnya presisi dan overhang. Saya tidak punya daftar, tapi saya cukup yakin itu

  • setiap 3D Zelda dan

  • setiap game 3D Mario

Gunakan ini.

Metode lainnya

Dimungkinkan untuk membuat medan sepenuhnya dalam pipa shader. Jika algoritme hanya berjalan dalam fragmen / piksel shader, detailnya bisa hampir tak terbatas sementara dampak memori hampir nol. Kelemahan jelas hampir tidak ada kontrol atas bentuk dan masalah ketika kamera memotong permukaan rendering asli. Ini masih berguna dalam permainan luar angkasa di mana pemain tidak berinteraksi dengan permukaan planet. Animasi parameter berfungsi paling baik dengan medan seperti ini.

Seharusnya dimungkinkan untuk mengunduh geometri medan yang dihasilkan dari kartu grafis untuk menggunakannya untuk sisa mesin gim, tetapi saya tidak tahu bagaimana kinerjanya atau apakah ini sudah dilakukan sejauh ini.

Kesimpulan

Tidak ada metode yang bekerja dengan baik untuk setiap skenario, tetapi cukup mudah untuk memilih satu untuk tugas tertentu:

  • Heightmaps adalah solusi terbaik jika Anda tidak perlu overhang atau lubang di permukaan medan dan menggunakan fisika atau medan yang dinamis. Mereka scalable dan berfungsi dengan baik untuk sebagian besar game.

  • Jerat memiliki ketelitian tertinggi dan dapat menggambarkan overhang, lubang dan terowongan. Gunakan jika Anda memiliki medan kompleks yang tidak sering berubah.

  • Voxels bagus untuk menggambarkan medan yang sangat dinamis dengan banyak fitur kompleks. Hindari merendernya secara langsung karena mereka membutuhkan banyak memori dan pemrosesan.

  • Metode lain mungkin lebih baik daripada metode di atas jika Anda tidak harus berinteraksi dengan medan atau membutuhkan grafik yang sangat rinci. Mereka biasanya bekerja hanya untuk skenario yang sangat spesifik.

Dimungkinkan untuk menggabungkan metode yang berbeda untuk mendapatkan fitur dari lebih dari satu, misalnya dengan tessellating medan jala dengan peta ketinggian untuk meningkatkan struktur detail tebing.

Generasi medan dinamis banyak digunakan dalam simulasi ruang prosedural dan beberapa telah menjadi sangat maju dalam beberapa tahun terakhir . Forum-forum proyek-proyek ini harus memiliki beberapa sumber pada topik.


3
Mesin sumber tidak menggunakan peta ketinggian untuk medannya. Mereka menggunakan paha depan yang disebut "Displacements" developer.valvesoftware.com/wiki/Displacement
Tetrad

1
Itu jawaban yang manis di sana, akan memberi +1 pada yang satu ini, jika itu mungkin. Terima kasih atas informasi terperinci, sangat kami hargai.
joltmode

@Tetrad Resolusi yang tersedia untuk pemindahan adalah kekuatan dua (pembatasan umum untuk buffer tekstur), satu-satunya koordinat yang disimpan per titik adalah ketinggian dan pemetaan ketinggian dataran diberikan sebagai paha depan yang dikelupas. Wiki juga mengatakan biaya rendering perpindahan lebih rendah daripada geometri biasa. Saya pikir adil untuk menganggap bahwa mereka adalah hal yang sama dengan nama yang berbeda.
Tamschi

1
@NickWiggill Arti "voxel" tampaknya telah berubah sedikit dalam 10 tahun terakhir. Saya akan menggunakan definisi Wikipedia tentang voxels sebagai nilai pada kisi 3D biasa . The entri di Outcast menyebutkan perbedaan makna. Saya telah menambahkan jawaban saya untuk menjelaskan hal ini.
Tamschi

2
Catatan: "Medan poligon" juga disebut " Jaringan Tidak Teratur Triangulasi " ("TIN") di GIS; dan biasanya jauh lebih sedikit memori intensif daripada ketinggian tinggi resolusi efektif yang sama, karena tidak mengganggu dengan merekam data yang tidak penting atau tempat-tempat di mana tidak ada data. Game Gotik pertama menggunakannya (tidak yakin tentang yang lain).
Martin Sojka

8

Saya ingin menunjukkan bahwa tidak ada istilah yang Anda sebutkan yang saling eksklusif satu sama lain - Anda bahkan dapat memiliki gim berbasis voxel yang menggunakan pemetaan ketinggian dan dirender menggunakan poligon.

  1. Tinggi peta adalah representasi dua dimensi dari ketinggian tanah di setiap titik tertentu. Mereka sering disimpan sebagai gambar skala abu-abu, di mana kecerahan mewakili ketinggian titik itu. Voxels pada dasarnya adalah bitmap 3D. Ada berbagai teknik yang digunakan untuk membuat ruang voxel.

  2. Anda dapat membuat medan yang halus dengan voxel, dan itu tidak terbatas pada kubus. Salah satu cara tersebut adalah dengan menggunakan algoritma seperti marching cubes , yang dapat mengubah representasi voxel menjadi daftar poligon.

  3. Yang dengan segitiga paling sedikit akan memberikan yang tercepat: 3

  4. Algoritma fraktal seperti Perlin noise dapat digunakan untuk membuat lanskap dengan banyak
    detail. Permukaan parametrik seperti nurbs dapat digunakan untuk membuat medan yang halus dengan sedikit persyaratan penyimpanan permanen.

  5. Delta Force adalah game lama yang menggunakan voxel. Minecraft dapat menggunakan penyimpanan voxel untuk mewakili lanskap (tidak pasti). Sacrifice by Shiny adalah gim yang menggunakan pemetaan ketinggian untuk efek yang baik. Sebagian besar game dengan lanskap menggunakan medan geometri.


1
Satu catatan, pada poin 3, sementara GPU hanya peduli tentang jumlah poligon, masih ada sisi generasi geometri. Menghasilkan geometri untuk bidang voxel biasanya merupakan proses yang lebih lambat (blok / kubus kubus keduanya merupakan proses yang lebih kompleks) daripada dataran tinggi peta (yang merupakan proses sederhana), atau berbasis poligon (yang jelas sudah merupakan data geometri). Sunting: ini juga tergantung pada apakah Anda ingin medan dapat dideformasi.
Michael

Untuk poin ke-3 ... Nah, heightmap masih harus diproses dan baru kemudian itu bentuk menjadi geometri, kan? Mengingat hal itu, mesh poligon akan sedikit lebih cepat? Bisakah Anda menunjukkan beberapa teknik yang digunakan untuk membuat voxels?
joltmode

2
Anda bisa menggunakan geometri shader untuk menghasilkan mesh dari peta ketinggian. Dengan cara ini Anda hanya menyimpan peta ketinggian dan parameter seperti posisi dan resolusi saat geometri dihasilkan setiap frame dalam pipa shader. Ini lebih cepat daripada berbaris kubus dan lebih lambat dari jaring poligon. Keuntungan dari heighmaps adalah konsumsi memori yang rendah: hanya sedikit lebih dari 1/3 dari apa yang dibutuhkan mesh. The downside adalah bahwa itu tidak fleksibel (tidak ada detail kecil, tidak ada overhang). Anda dapat secara dinamis menyesuaikan detail dari mesh yang dihasilkan, tetapi ini menyebabkan pergeseran geometri.
Tamschi

@Tamschi, kalau saja Anda memberikan jawaban itu, persis apa yang saya cari. :)
joltmode

@ Tom, saya akan lihat apakah saya bisa mendapatkan format ini dan menemukan beberapa contoh lagi.
Tamschi
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.