Bagaimana permainan modern melakukan geometri level-of-detail untuk jerat objek seperti karakter, medan, dan dedaunan? Ada dua bagian dari pertanyaan saya:
- Seperti apa tampilan pipa aset? Apakah seniman membuat model poli-tinggi yang kemudian dihancurkan? Jika demikian, algoritma penipisan apa yang paling populer? Apakah jerat LOD terkadang dilakukan dengan tangan?
- Bagaimana mesin melakukan transisi antara objek LOD yang berbeda pada saat dijalankan? Apakah ada transisi yang lancar atau progresif?
Jawabannya mungkin "studio yang berbeda menggunakan teknik yang berbeda." Jika demikian, harap identifikasi beberapa praktik yang paling umum. Akan lebih bagus jika Anda bisa mengarahkan saya ke whitepaper / slide yang mencakup contoh-contoh spesifik.
Jawaban:
Untuk LOD geometri, sebagian besar game cukup beralih di antara sejumlah jerat LOD yang telah ditentukan. Misalnya "Infamous: Second Son" menggunakan 3 jerat LOD ( Adrian Bentley - "inFAMOUS: postmortem engine Second Son", GDC 2014 ) dan "Killzone: Shadow Fall" menggunakan 7 jerat LOD per karakter ( Michal Valient - "Killzone: Shadow fall: Shadow fall demo postmortem ", Devstation2013 ). Sebagian besar dihasilkan, tetapi yang lebih penting (seperti karakter utama) dapat dibuat dengan tangan. Jerat sering dibuat menggunakan middleware Simplygon yang populer, tetapi kadang-kadang dihasilkan oleh seniman grafis dalam paket 3D favorit mereka.
Game dengan jarak pengundian besar juga menggunakan penipu untuk dedaunan, pohon, dan gedung tinggi ( Adrian Bentley - "inFAMOUS: postmortem mesin Second Son", GDC 2014 ). Mereka juga menggunakan LODs hirarkis, yang menggantikan satu set objek dengan satu. Sebagai contoh dalam "Just Cause 2" pohon pertama-tama diberikan secara individual sebagai jerat LOD normal, kemudian secara individual sebagai penipu dan akhirnya sebagai satu jaring hutan yang digabung ( Emil Persson, Joel de Vahl - "Mempopulasikan Massive Game World", Siggraph2013 ) dan dalam "Sunset Overdrive" bagian yang jauh di dunia digantikan oleh jala tunggal yang dihasilkan secara otomatis offline ( Elan Ruskin - "Streaming Sunset Opendrive's Open World", GDC2015 ).
Komponen lain dari sistem LOD adalah penyederhanaan bahan dan shader. Misalnya "Killzone: Shadow Fall" menonaktifkan ruang singgung dan pemetaan normal untuk LOD yang jauh ( Michal Valient - "Killzone: Shadow fall demo postmortem", Devstation2013 ). Ini biasanya diimplementasikan dengan menonaktifkan secara global seperangkat fitur shader per LOD, tetapi untuk mesin dengan grafik shader, di mana seniman dapat membuat custom shader, ini perlu dilakukan secara manual.
Untuk transisi LOD, beberapa permainan cukup mengganti jerat dan beberapa menggunakan dithering untuk transisi LOD yang lancar - pada saklar LOD, dua jerat dirender: pertama secara bertahap memudar dan memudar kedua di ( Blog Simon schreibt - "Assassins Creed 3 - LoD Blending" ). Teknik mesh progresif CPU klasik tidak digunakan karena membutuhkan pembaruan mesh yang mahal dan mengunggah ke GPU. Hardware Tessellation digunakan dalam beberapa judul, tetapi hanya untuk penyempurnaan LOD yang paling rinci, karena lambat dan secara umum tidak dapat menggantikan LODs geometri yang telah ditentukan.
LOD terrain ditangani secara terpisah untuk mengeksploitasi sifat spesifiknya. Terrain geometry LOD biasanya diimplementasikan menggunakan clipmaps ( Marcin Gollent - "Pembuatan lansekap dan rendering dalam REDengine 3" ). Materi terrain LOD ditangani dengan cara yang sama dengan LOD mesh atau menggunakan semacam tekstur virtual Ka Chen - "Adaptive Virtual Texture Rendering In Far Cry 4 .
Akhirnya jika Anda tertarik untuk melihat pipa LOD game nyata maka cukup telusuri dokumentasi dari salah satu mesin game modern: Unreal Engine 4 - "Menciptakan dan Menggunakan LOD " , CryEgnine - Static LOD dan Unity - LOD .
sumber
LOD (Level of Detail) berarti mengelola objek dalam skala tampilan yang berbeda, yang dapat dibagi menjadi dua bagian. Namun, Anda dapat menggunakan salah satunya dan itu sudah cukup untuk sebagian besar kasus.
Tampilkan / sembunyikan lapisan (kelompok objek dengan tipe yang sama) tergantung pada besarnya (skala tampilan).
Metode berbasis Aljabar Geomery, yang disebut Generalisasi (yang merupakan algoritma untuk menyederhanakan poligon). lihat gambar berikut
Metode yang paling terkenal dan efisien untuk menggeneralisasi (menyederhanakan) sebuah poligon dikenal sebagai teorema polyhedron Descartes-Euler (Persamaan 4.5, maaf jika saya merujuk pada sebuah buku, itu yang terbaik yang bisa saya lakukan) dan digunakan oleh sebagian besar basis data spasial misalnya modul PostGIS di PostgreSQL. Ini hanya menghilangkan sisi yang lebih kecil dari poligon dan membuat yang sangat bulat. (Gambar di atas)
Untuk menerapkan LOD dalam game, Anda perlu menyimpan dan mengelola skala peta Anda (adegan) selama operasi zoom in / out. Skala berubah dari nol hingga tak terbatas dan Anda harus membaginya menjadi sejumlah rentang tertentu, misalnya, seperti ini:
Maka Anda perlu menentukan jenis objek Anda (lapisan) yang harus terlihat atau tidak terlihat di masing-masing rentang di atas. Misalnya jenis objek kecil seperti katup hidran seharusnya tidak terlihat ketika pengguna berada di kisaran keempat karena akan sangat kecil pada skala itu dan tidak dapat didiskriminasi sehingga tidak masalah jika Anda melewatkan menggambarnya pada layar.
Jadi, ketika pengguna menggunakan zoom in dan zoom out untuk mengubah pembesaran, ia bergerak melalui batas di atas dari satu ke rentang lainnya, dan game Anda menggunakan skala tampilan ini untuk mengelola level detail dengan menunjukkan atau menyembunyikan objek di tempat kejadian. Ini membuat solusi terpisah yang tiba-tiba objek memudar selama operasi zoom out Anda, namun memiliki skala tampilan dan rentang perbesaran yang ditentukan dengan cermat, pengguna tidak akan merasakan apa-apa.
Kelompok 4 rentang di atas hanyalah sebuah contoh dan Anda perlu menemukan yang terbaik untuk kasus Anda sendiri dengan coba-coba. Tidak ada aturan untuk itu.
Kadang-kadang permainan menggunakan metode LOD mereka sendiri, Subway Surfer untuk instan, menunjukkan kecil, tanpa tekstur persegi panjang untuk menunjukkan bangunan di kejauhan, dan dengan mendekat tiba-tiba mendapat tekstur, gamer merasakannya. Anda tidak berbicara tentang sistem proyeksi Anda yang sangat penting juga tidak berbicara tentang jenis permainan yang Anda buat.
Namun misalkan Anda mengimplementasikan game 3D lengkap dengan openGl dan Anda ingin memfilter beberapa mesh sebelum mentransfernya ke perangkat keras grafis, saya yakin ini akan membantu Anda mengurangi operasi yang mengikat / tidak mengikat dengan objek buffer dan array vertex (VBO, VAO) sementara berurusan dengan OpenGl.
Dalam kebanyakan kasus, tidak perlu menerapkan algoritma generalisasi, dan memfilter objek hanya berfungsi dan membawa Anda ke efisiensi (refresh rate) yang Anda butuhkan, namun sangat tergantung, kasus per kasus. Meskipun ini adalah algoritme yang mudah yang hanya menghilangkan sisi kecil poligon, Anda perlu menentukan ambang yang merupakan produk besarnya dan angka konstan, sehingga sisi yang lebih besar bisa difilter dalam sudut pandang yang lebih jauh.
Melupakan penilaian lapisan dan hanya menerapkan algoritma generalisasi Eulers, menyediakan metode yang sangat rapi dan berkesinambungan di mana Anda hanya memeriksa setiap sisi dan garis terhadap ambang yang telah ditentukan sebelumnya dan menunjukkannya hanya jika mereka cukup besar untuk didiskriminasi di layar.
PS: perbesaran adalah angka float> 0 yang sama dengan 1 / skala dan skala biasanya <1 karena skala 1: 1 berarti Anda memiliki panjang dunia nyata dalam gim Anda.
sumber
Iman sudah menyiapkan jawaban yang lengkap tetapi saya ingin menambahkan sesuatu padanya
LOD dapat dilakukan dengan dua cara berbeda
Misalnya mipmaping adalah yang bagus, cepat tapi berat yang dimiliki grup sekursi di atas
di sini Anda dapat menemukan penjelasan yang bagus untuk mipmaping dan kode implementasi dengan OpenGl.
sumber