Salam pembaca! Nama saya Sergey, saya adalah pengembang game komputer indie. Saya sudah memiliki beberapa proyek indie dalam portofolio saya, beberapa di antaranya dirilis sendiri di Steam. Game Light or The Light, yang dirilis pada tahun 2012, adalah pena dan pelopor pertama saya dalam dunia pengembangan game. Proyek ini didistribusikan secara gratis, tetapi reaksi publik dan umpan balik dari para pemain memberi saya motivasi yang serius untuk pekerjaan selanjutnya. "The Light" bagi saya menjadi semacam perumpamaan filosofis tentang kemanusiaan dan takdirnya. Plotnya abstrak dan tidak mengejar tujuan tertentu, ini hanya kesempatan untuk merefleksikan topik yang luas.
Karena game aslinya tidak pernah dirilis di Steam, saya memutuskan untuk memperbaiki kelalaian ini dan pada bulan Juni 2019 memulai pengerjaan ulang skala besar dari proyek tersebut sehingga dapat menyamai gameplay-nya dan secara visual dan dianggap sebagai game yang lengkap.
Apa yang kita bicarakan?
Artikel ini akan berfokus secara khusus pada proyek "Light" dan pada pekerjaan yang dilakukan terkait dengan porting game ke versi terbaru dari mesin Unity. Ini menyiratkan banyak nuansa teknis. Artikel tersebut akan disajikan dalam dua bagian.
Bagian 1
Versi asli gim ini dibangun di Unity 4.2 pada tahun 2012. Kemudian di bidang informasi saya masih belum ada pembicaraan tentang materi PBR, tes refleks dan metode lain yang saat ini relevan. Shader dasar di Unity sangat sederhana dan tidak terlalu realistis. Tentu saja, dimungkinkan untuk menambahkan banyak elemen tambahan, seperti refleksi Fresnel, tetapi pemrograman shader bagi saya adalah rahasia di balik tujuh segel. Shader utama yang digunakan adalah Normal Bumped Specular dan AlphaTest diffuse untuk objek dengan transparansi (daun pohon, kisi logam keriting).
Tidak ada bayangan waktu, hampir semua pencahayaan dipanggang menjadi tekstur dan resolusi bayangan ini sangat rendah di beberapa tempat. Memanggang cahaya di atas segala sesuatu mengurangi efek benjolan dari shader Bumped Specular menjadi mendekati nol, membuat objek lebih terlihat seperti karton datar pada pemeriksaan lebih dekat.
Gambar diubah secara signifikan oleh efek pasca pada kamera, khususnya Bloom dan Koreksi Warna. Mereka menambahkan warna dan variasi, meskipun terlalu mengganggu di beberapa tempat.
Pada saat membuat proyek ini, saya masih memiliki ide yang tidak jelas tentang pengoptimalan, pengelompokan (menggabungkan menjadi satu mesh), oklusi - pemusnahan (memotong objek yang tidak terlihat), dll. Namun karena secara teknis pemandangan tidak sarat dengan sesuatu yang rumit, tidak memiliki pencahayaan riltime, rumput dengan saluran alfa, dll. - permainan keluar dengan cukup optimal dan bekerja dengan baik pada perangkat keras yang lemah, memberikan gambaran yang menyenangkan untuk tahun 2012.
Setelah 7 tahun, Anda melihat salah satu kreasi Anda dengan mata yang berbeda. Teknologi telah berkembang pesat, alat telah berubah, versi terbaru mesin Unity sangat berbeda dari pendahulunya. Sehubungan dengan semua hal di atas, mentransfer proyek dari versi 4 ke versi 2017 (saya memutuskan untuk berhenti karena sejumlah alasan) adalah pekerjaan yang agak panjang dan melelahkan. Selain itu, mengingat fakta bahwa proyek asli tidak dapat disebut sebagai game penuh (sebagian besar tindakan dalam game dilakukan menggunakan satu skrip dengan fungsi pemicu), perlu untuk menulis semua logika dari awal, interaksi dengan objek, inventaris, sistem menu, sistem menyimpan, pencapaian, pengaturan, dll. Secara umum, sejumlah besar pekerjaan menunggu saya!
Mulailah. Peneduh dan cahaya
Hal pertama yang mendemoralisasi saat membuka proyek di mesin baru adalah keseluruhan visual rusak. Banyak shader dan efek pasca yang diimpor dari sumber pihak ketiga berhenti bekerja. Peneduh yang terus bekerja terlihat sedikit berbeda. Pencahayaan dalam pemandangan berubah, peta cahaya terbang, semuanya perlu dihitung ulang.
Standart Baru
Diputuskan untuk memulai dengan mengganti shader lama dengan PBR Standart baru. Di artikel sebelumnyapada pengembangan 35MM, saya telah menyebutkan jenis baru PBR shader (Rendering Berbasis Fisik), yang menyiratkan rendering fisik yang benar. Standar material baru tidak lagi memiliki o.Gloss dan o.Specular biasa dari versi sebelumnya, di sini kami memiliki peta metalisitas (o Metalik) dan Kehalusan. Juga, ada lebih banyak slot untuk tekstur dari berbagai kategori. Misalnya, kami memiliki opsi untuk menambahkan peta Oklusi untuk bayangan lembut. Efek ini sangat berguna karena memungkinkan Anda untuk menekankan volume dan bayangan di area model yang cahayanya lebih sedikit. Tanpa peta dan peta cahaya ini - tekstur, objek terlihat datar dan tidak realistis.
Ada Detail Albedo dan Detail Normal yang sama - peta ini menambahkan detail pada tekstur yang ada, misalnya, Anda dapat menempatkan peta normal tambahan dengan retakan kecil dan mewarnai dengan menyesuaikan tingkat pengaruh. Hasilnya, tekstur benjolan asli beresolusi rendah akan tampak lebih detail. Untuk beberapa materi, saya menggunakan teknik ini, sementara yang lain tidak diubah.
Vegetasi
Setelah mengganti bahan dasar, saya beralih ke tanaman. Build asli game menggunakan shader Uji Alfa standar tanpa spekulan dan Peta Normal. Tentu saja, keadaan tahun 2019 ini tidak cocok untuk saya. Anda dapat membeli atau menemukan solusi yang sudah jadi di Internet, ada paket lengkap dengan shader dan model siap pakai dengan banyak fitur, tiruan bergoyang tertiup angin, dll. Tetapi secara tradisional, saya mencoba mencari tahu masalah seperti itu sendiri dan bereksperimen. Ini adalah minat olahraga. Shader Vegetable baru saya didasarkan pada referensi Toon Ramp dari tutorial Unity.
Model pencahayaan LightingRamp yang disajikan memungkinkan untuk menggambar siluet bayangan baik pada sisi poligon yang diterangi, dan sebaliknya. Ini meniru kemampuan dedaunan untuk mengirimkan cahaya - tembus cahaya.
Shader serupa juga dapat digunakan untuk membuat kain transparan seperti tirai.
Sayangnya, pada mode ini, rendering otomatis dari sisi belakang poligon menggunakan metode Cull Off tidak memberikan hasil yang sangat benar, sehingga Backface harus ditambahkan secara manual di editor. Selanjutnya, peta Normal dan Specular ditambahkan ke shader. Saya tidak dapat menggunakan model pencahayaan shader PBR dan menghubungkan Reflection Probes, tetapi dengan bantuan topeng dan peta Emisi, simulasi Ambient Occlusion telah ditambahkan. Dan akhirnya, sangat penting untuk menghidupkan kembali semuanya dan memberikan gerakan vegetasi. Dengan fungsi Vertex dan topeng yang sama, area pelat dedaunan yang diinginkan menjadi hidup. Vertex offset didasarkan pada contoh Ekstrusi Normal dengan Pengubah Vertex dari manual Unity.
Anda dapat mengatur kecepatan dan amplitudo. Ngomong-ngomong, dalam eksperimen ini, fungsi baru untuk mengelola variabel global shader sangat berguna ... Anda dapat dengan mudah menetapkan variabel atau tekstur apa pun ke semua shader yang diperlukan dari skrip.
Bersinar
Pendekatan perangkat pencahayaan di tempat kejadian telah berubah secara signifikan. Dalam aslinya, semua cahaya dipanggang menjadi lightmap, dan rendering bekerja dalam mode Teruskan. Dalam pembuatan ulang, aspek penting adalah penggunaan cahaya real-time untuk dapat mengubah waktu. Mode render telah diubah menjadi Ditunda. Cahaya utama (matahari) digunakan dalam mode Campuran, pencahayaan terarah dan bayangan digambar dalam waktu nyata, dan iluminasi global dimasukkan ke dalam tekstur. Hal ini memungkinkan untuk mengubah arah dan tingkat cahaya, tetapi pada saat yang sama mempertahankan efek iluminasi dan pantulan global yang lembut, yang selalu memberikan gambar realisme ekstra. Tekstur lightmap tidak dibuat untuk semua objek, terutama untuk objek yang besar dan lebih atau kurang sederhana. Kecil dan sulit untuk membuat sapuan tetap dinamis dan disorot baik dengan probe cahaya,tes refleksi, atau hanya cahaya ambient dasar (yang ditentukan dalam pengaturan pencahayaan utama). Baking dilakukan dengan lightmapper Progresif.
Siang dan Malam
Untuk mengubah waktu, skybox shader dibuat dengan dua tekstur: siang dan malam. Kedua opsi tersebut dilengkapi dengan fungsi offset untuk mensimulasikan pergerakan cloud. Tekstur langit malam dan cahaya anomali untuk adegan penerbangan rudal tempur juga ditambahkan. Semua aib ini dikendalikan oleh naskah khusus yang memutar skybox dan matahari, pada posisi tertentu matahari, warna skybox berubah, tekstur dicampur menggunakan metode Lerp dan langit malam serta bintang-bintang terungkap dengan mulus. Efek cahaya langit setelah meluncurkan rudal juga ditambahkan pada lapisan terpisah.
Untuk pengoptimalan pada tingkat cahaya minimum (sekitar 0,1-0,2), bayangan dimatikan dengan mulus. Untuk mengubah waktu, perlu mempertimbangkan beberapa poin yang lebih penting. Di atas panggung ada partikel - bulu poplar. Bahannya tidak bereaksi terhadap cahaya (saat itu saya belum menemukan shader yang cocok), jadi warna bahan bulu harus diubah dengan skrip tergantung pada waktu hari.
Selain itu, saat mengubah waktu, skrip menyesuaikan warna yang diinginkan untuk efek pasca-Kabut Global, karena pada siang hari kabut akan tampak seperti kabut biru keabu-abuan, dan pada malam hari akan memiliki warna yang lebih gelap, hampir hitam.
Model dan konten baru
Bagian utama lokasi dan model dasar: model bangunan utama, pohon, bangku, tiang lampu tetap asli. Banyak alat peraga lainnya telah dikerjakan ulang seluruhnya atau sebagian. Model lampu minyak tanah didesain ulang, generator diesel baru dengan elemen animasi terpisah dibuat, model proyektor bioskop baru, dll.
Bangunan terdekat yang sebelumnya tidak bisa dimasuki telah didesain ulang dan tersedia untuk pemain. Tata ruang interior bangunan utama juga diubah. Selain pengerjaan ulang konten lama, yang baru juga ditambahkan, misalnya model bus PAZ, mesin game, mesin penjual soda, puzzle - panel listrik, pintu kedap udara di ruang bawah tanah, barang inventaris, dll. Beberapa konten dibuat secara independen, beberapa model dialihdayakan.
Untuk hampir semua objek yang peta cahaya dipanggang, pemindaian UV2 dibuat secara manual, dengan lokasi fragmen yang paling optimal untuk penghematan. Misalnya, untuk bangunan, semua area yang sulit dijangkau (misalnya, langit-langit dan dinding lantai atas), yang praktis tidak akan dilihat oleh pemain, menggunakan sedikit ruang pada pemindaian.
Efek dan shader kustom.
Air
Dengan setiap proyek baru, saya ingin mempertimbangkan nuansa yang sebelumnya kami tutup mata. Gambar keseluruhan dibuat dari detail terpisah dan bahkan elemen yang tidak terlalu penting dapat memengaruhi persepsi. Plus, ini semacam tantangan - setiap kali meningkatkan sesuatu yang telah saya kerjakan. Sangat memuaskan untuk menemukan solusi sendiri, daripada menggunakan aset yang sudah jadi. Di semua proyek sebelumnya, saya telah bekerja dengan air. Biasanya, itu adalah shader vertex yang cukup sederhana yang tidak bereaksi terhadap pemain dan pencahayaan di tempat kejadian. Ini didasarkan pada Mirror Reflection dari Unity Wiki, yang merupakan contoh implementasi cermin.
Permukaannya dinamis karena perpindahan simpul (tiruan gelombang), tetapi selalu terlalu monoton dan agak membosankan. Melalui trial and error untuk proyek Light, saya berhasil membuat versi Surface dari shader serupa, yang, seperti sampel, dapat: menerima tekstur refleksi spekuler dari skrip Mirror, mengubah bentuk verteks untuk mensimulasikan gelombang, menulis layar menjadi tekstur Grabpass untuk membuat refraksi di bawah air, memiliki tepi Alpha yang lembut saat berpotongan dengan geometri (depth fade). Juga, untuk efek reaksi terhadap pemain, informasi tentang koordinat posisi pemain dikirimkan ke shader. Sebuah titik dinamis digambar pada titik koordinat, yang mensimulasikan percikan ketika karakter berada langsung di kolom air. Hal terpenting yang diizinkan Surface shader adalah menerima pencahayaan dari sumber cahaya apa pun. Dengan cara ini air tampak lebih nyata,zat volumetrik dan memungkinkan Anda bermain dengannya menggunakan efek pencahayaan.
Caustics
Detail penting lainnya adalah penciptaan efek kaustik - pantulan cahaya yang jatuh ke permukaan. Dalam kegelapan terowongan bawah tanah yang terendam air, teknik ini sangat penting. Efeknya dibuat menggunakan objek Proyektor dan bahan bercahaya dengan tekstur animasi. Shader mencampur 2 tekstur kaustik, yang dipindahkan ke berbagai arah, menghasilkan efek dinamis. Di sebagian besar shader saya, untuk menghemat uang, saya biasanya menggunakan masker tekstur yang berisi 4 saluran (RGBA) - masing-masing untuk tujuan tertentu. Saluran R dapat memiliki tekstur dasar, saluran G memiliki titik cahaya yang lebih lembut, dan saluran B memiliki tekstur noise untuk mengubah pola kaustik.
Permukaan air memiliki collider dengan tag khusus. Begitu karakter memasuki air, skrip mendeteksi ini menggunakan metode raycast, dan menyalakan kaustik dengan lancar. Dalam hal ini, beberapa kondisi juga dijabarkan, seperti adanya korek api, senter, atau lampu minyak tanah di dekat tangan.
Partikel
Efek menarik telah diterapkan untuk partikel kecil di udara yang terlihat dalam cahaya. Idenya sendiri terinspirasi dari proyek Homesick, di mana saya pernah melihat hal serupa. Pada jarak tertentu, partikel memiliki tekstur yang teratur, seperti tekstur bulu poplar. Namun saat kamera mendekat, tekstur di shader dengan mulus berubah ke versi kedua, mengingatkan pada efek pengaburan. Secara dinamika, ini terlihat cukup bagus dan partikelnya tampak lebih nyata.
Seperti disebutkan di atas, hampir semua permukaan dasar dalam pemandangan menggunakan versi shader PBR Standart yang dimodifikasi. Beberapa telah menambahkan topeng dengan opsi tempat berbeda untuk detail tambahan pada tekstur Albedo. Menambahkan masker tempat untuk menyimulasikan genangan air hujan di permukaan seperti aspal atau batu paving. Shader ubin lantai di gedung utama memiliki peta tambahan untuk refleksi, yang ditampilkan oleh skrip Mirror mirip dengan permukaan air. Untuk pengoptimalan, hanya objek dasar dan besar yang disertakan dalam rendering refleksi, dan pada jarak tertentu rendering refleksi dimatikan.
Kabut / asap
Detail penting yang ingin saya pertimbangkan saat membuat pembuatan ulang adalah kabut dinamis dan efek pencahayaan padanya, khususnya cahaya lentera. Dalam karya sebelumnya, shader utama untuk asap dan kabut adalah campuran Partikel standar dan modifikasinya. Ini adalah shader vertex yang bagus dalam hal kinerja, tetapi tidak bereaksi terhadap cahaya sama sekali. Tampilan kabut dengan bahan seperti itu akan selalu sama di tempat teduh dan dalam cahaya tidak dapat diterangi dengan lentera dan tidak selalu terlihat menarik dan alami. Di katakombe bawah tanah yang saya bayangkan, kabut seharusnya disorot oleh lentera dari kegelapan, yang ditekankan oleh pencahayaan dinamis. Untuk mengatasi masalah ini, shader dari Aset gratis digunakan . Shader tidak dapat membanggakan kinerja tinggi, tetapi secara visual dapat mengatasi tugasnya dengan sempurna.
Decals
Poin penting lainnya adalah menemukan shader yang cocok untuk decals. Gim ini merencanakan banyak jenis grafiti, yang paling sering dipasang menggunakan plugin sistem stiker lama (sejak versi lama Unity 4.6). Untuk coretan, prasasti, dan tanda, telah dibuat atlas besar 4096 x 4096. Gambar pada stiker tembus cahaya dan ditampilkan dalam mode alfa Transparan, jadi untuk pencahayaan dinamis, gambar tersebut tidak selalu terlihat memadai, karena bayangan alfa standar tidak dapat menerima bayangan.
Untuk mengatasi masalah ini, shader dua jalur khusus telah dibuat. Lintasan pertama menggambar bagian gelap gambar, yang kedua bagian terang menggunakan metode pencampuran Blend DstColor One. Saya mungkin tidak sepenuhnya memahami metode menggambar dengan benar, jadi saya akan menahan diri dari penjelasan mendetail, tetapi saya berhasil mencapai hasil yang diinginkan: dalam bayangan, gambar terkubur dalam kegelapan, dan dalam cahaya tampak dan bahkan bermain-main dengan warna. Shader two-pass tidak berpengaruh pada performa, karena sistem Decal awalnya menggabungkan semua stiker menjadi satu jaring besar. Mungkin ada cara yang lebih baik, tetapi opsi ini sangat cocok untuk saya.
Tanah / rumput
Shader dua jalur lainnya dibuat untuk permukaan tanah. Wilayah di lokasi dibuat oleh geometri dalam 3d max. Tapi untuk merender rumput, medan tambahan telah dibuat. Saya harus menyesuaikan ketinggian medan secara manual di tempat yang tepat agar sesuai dengan medan. Kemudian rendering medan itu sendiri dimatikan dan beberapa varian jaring rumput yang disiapkan diaplikasikan ke permukaan dengan kuas. Rumput asli di medan sangat berat di tempat kejadian dalam hal kinerja, karena tidak menumpuk dan setiap elemen membuat panggilan imbang tambahan (mungkin seseorang akan mengoreksi saya jika saya salah), tetapi metode ini sangat nyaman dalam hal pekerjaan. Kepadatan rumput tidak tinggi dan di tempat-tempat yang tidak, kesederhanaan permukaannya sangat mencolok. Sehubungan dengan ini, sebagai percobaan, saya menggunakan shader dua jalur,yang telah disebutkan di atas. Lintasan pertama adalah geometri buram biasa, lintasan kedua adalah duplikat permukaan yang sedikit terangkat dalam mode uji Alfa. Secara kasar, salinan permukaan tanah / rumput juga digambar dengan transparansi keras dan simpul digeser ke atas. Metode ini melengkapi rumput datar dan menciptakan ilusi detail dan volume tambahan.
Cahaya di luar jendela
Sprite tembus satu sisi ditempatkan di beberapa tempat di luar jendela bangunan utama untuk mensimulasikan sorotan. Selain itu, efek pasca Kabut Global memiliki parameter kabut putih terang, yang diaktifkan saat pahlawan bergerak lebih dalam ke dalam gedung. Artinya, saat karakter berada di koridor gelap lambung, lingkungan di luar secara mulus mendapatkan cahaya keputihan. Ini menciptakan efek artistik yang cukup indah dan memungkinkan Anda untuk menekankan denah dekat dan jauh.
Ini menyimpulkan bagian pertama dari artikel. Tautkan ke bagian kedua. Terima kasih atas perhatiannya!