Pencahayaan untuk game seluler dengan Unity

Pencahayaan adalah salah satu aspek terpenting dalam game. Pencahayaan dapat mengatur mood, mengarahkan pemain, mengidentifikasi ancaman atau tujuan, dan lainnya. Pencahayaan dapat memperindah atau merusak visual game. Misalnya, pencahayaan yang baik dapat membuat model yang buruk terlihat lebih baik dalam game, sementara pencahayaan yang buruk dapat membuat model yang bagus terlihat lebih buruk.

Panduan ini memberikan informasi untuk memperoleh performa pencahayaan yang lebih baik dalam game seluler. Cara penggunaan pencahayaan yang Anda pilih akan memengaruhi performa game seluler. Penting untuk menggunakan pencahayaan secara efisien untuk memastikan game Anda berjalan selancar mungkin.

Beberapa bagian dari artikel ini didasarkan pada karya hasil kontribusi berhak cipta dari Arm Limited.

Opsi pipeline render

Pipeline Render Lama Unity mencakup jalur render berikut:

  • Rendering maju
  • Bayangan tertunda

Rendering maju

Dengan rendering maju, cahaya real-time sangat mahal. Jika mengurangi jumlah cahaya yang ada per piksel, Anda dapat menutupi biaya ini.

Bayangan tertunda

Bayangan tertunda memerlukan dukungan GPU. Di hardware yang kompatibel, bayangan tertunda dapat merender sejumlah besar cahaya real-time dengan tingkat fidelitas pencahayaan tinggi. Sayangnya, bayangan tertunda tidak berperforma baik pada GPU perangkat seluler karena memiliki bandwidth yang lebih rendah.

Saat Anda membuat game perangkat seluler, game harus berjalan lancar di sebanyak mungkin perangkat.

Pipeline Render Universal

Unity telah mengembangkan URP (Pipeline Render Universal). Sebaiknya gunakan URP untuk game seluler Anda.

Mode cahaya

Mode cahaya yang berbeda digunakan berdasarkan gerakan atau penggunaan cahaya di Scene. Jenis mode cahaya memiliki karakteristik performa yang berbeda. Saat Anda mengimplementasikan cahaya, pertimbangkan hal berikut:

  • Gunakan baked untuk pencahayaan statis. Ini paling baik untuk objek yang tidak mengubah pencahayaannya selama runtime. Merekam cahaya adalah proses pra-penghitungan dan penyimpanan data pencahayaan dalam peta tekstur yang disebut peta cahaya.
    • Pencahayaan terekam tidak dapat diubah saat runtime. Cahaya dan bayangan dalam peta cahaya bersifat statis. Semua pencahayaan sudah diproses sebelumnya di Unity, sehingga tidak ada penghitungan pencahayaan saat runtime yang memengaruhi performa.
    • Bayangan dinamis tidak dapat dibuat dengan cahaya terekam. Cahaya ini mungkin terlihat aneh dengan objek yang dinamis atau bergerak.
  • Gunakan mixed untuk cahaya statis yang ingin Anda gunakan untuk berinteraksi dengan objek. Misalnya, senter yang memancarkan cahaya pada pemain dan menghasilkan bayangan saat pemain bergerak.
    • Pencahayaan campuran menciptakan cahaya dan bayangan langsung yang dinamis.
    • Anda dapat menyertakan pencahayaan campuran dalam penghitungan peta cahaya untuk objek statis.
    • Anda dapat mengubah intensitas saat runtime. Hanya cahaya langsung yang diperbarui.
    • Mahal.
  • Gunakan real time untuk cahaya yang dinamis atau dapat dipindahkan, seperti cahaya yang terpancar dari bola api yang muncul dari tanah dan meledak.
    • Properti cahaya dan bayangan dinamis dapat diubah saat runtime.
    • Cahaya real-time tidak direkam ke dalam peta cahaya.
    • Sangat mahal.

Untuk informasi selengkapnya, baca Pipeline Pencahayaan Unity.

Jika memungkinkan, gunakan cahaya statis dan hindari cahaya dinamis

Pencahayaan dinamis, atau real-time, dihitung dan diperbarui setiap frame. Ini sangat bagus untuk objek bergerak, interaktivitas, dan menciptakan emosi.

Sebaliknya, informasi cahaya statis direkam ke dalam peta cahaya. Penggunaan tekstur peta cahaya memungkinkan objek menghindari penghitungan pencahayaan per-sudut atau per-piksel yang mahal. Biaya rendering tekstur peta cahaya selalu jauh lebih murah daripada pencahayaan dinamis. Sebaiknya jadikan pencahayaan terekam sebagai pilihan pertama untuk implementasi ke game seluler.

Perekaman peta cahaya

Pra-penghitungan efek cahaya dikenal sebagai perekaman peta cahaya. Efek cahaya disimpan dalam tekstur terpisah, yang disebut peta cahaya. Peta cahaya dapat digunakan untuk memperbesar tampilan objek. Perekaman peta cahaya hanya perlu dilakukan sekali per iterasi Scene. Jika Anda mengubah geometri Scene, atau mengubah parameter cahaya terekam, Anda harus merekam ulang peta cahaya. Selain biaya overhead tekstur peta cahaya, tidak ada biaya performa tambahan saat runtime. Ini adalah pendekatan awal terbaik untuk pencahayaan di platform seluler.

Cahaya terekam tidak terpengaruh oleh aspek dinamis atau bergerak dari Scene. Pencahayaan terekam mencakup Iluminasi Global Terekam untuk semua elemen statis. Ini berarti penghitungan peta cahaya mencakup cahaya tidak langsung yang memantul dari objek statis lainnya serta cahaya terekam yang langsung mengenai objek.

Gambar 1. Penyiapan pencahayaan terekam yang digunakan dalam demo teknologi Armies.

Untuk merekam cahaya, lakukan tiga langkah berikut.

Langkah 1: Setel cahaya ke Mixed atau Baked

Setel Mode cahaya ke Mixed atau Baked. Untuk game seluler, sebaiknya gunakan cahaya Baked, bukan Mixed. Baked adalah cara paling murah untuk merender cahaya.

Gambar 2. Setelan Mode cahaya di Unity.

Langkah 2. Buat objek bersifat statis

Buat objek yang dipengaruhi oleh cahaya terekam bersifat Static. Ada banyak pengoptimalan untuk objek yang ditandai sebagai statis, tetapi biasanya yang terbaik adalah memilih Everything di menu drop-down Static. Karena objek ditandai sebagai Static, Unity akan tahu dan menyertakannya dalam perekaman cahaya.

Gambar 3. Contoh menu statis.

Langkah 3. Rekam cahaya

Anda dapat merekam cahaya dengan menu Lighting yang ada di Window > Rendering > Lighting Settings.

Saat Anda merekam cahaya, data yang disimpan akan didasarkan pada Scene apa pun yang aktif saat Anda memulai perekaman. Folder dibuat dengan nama yang sama seperti Scene yang direkam. Folder ini menyimpan semua komponen untuk data pencahayaan. Jika project Anda memuat beberapa Scene sekaligus, Anda harus merekam cahaya untuk setiap Scene. Jika menyesuaikan Scene, Anda harus merekam ulang cahaya.

Gambar 4. Contoh peta cahaya terekam.

Mengoptimalkan peta cahaya

Setelah cahaya siap untuk direkam, pastikan peta yang terekam dioptimalkan. Ukuran peta cahaya bervariasi berdasarkan setelannya saat direkam. Anda harus menjaga agar penggunaan memori di perangkat seluler tetap rendah, sehingga ukuran peta cahaya harus dipantau.

Pada contoh berikut dari demo Armies, ada tujuh peta cahaya 1024x1024 piksel. Dalam pratinjau peta tersebut, Anda dapat melihat mesh yang ditempatkan di peta cahaya. Mesh yang dipilih ditandai.

Gambar 5. Ini adalah contoh peta cahaya. Bagian berwarna biru adalah mesh yang dipilih.

Ada banyak setelan di Lightmapping Settings, beserta ukuran peta, yang menentukan banyaknya memori dan ruang penyimpanan yang digunakan setiap peta. Bagian berikut menyoroti beberapa setelan penting.

Lightmapper

Unity menawarkan tiga metode berikut untuk merekam cahaya di Scene:

  • Enlighten: Hanya didukung hingga rilis dukungan jangka panjang (LTS) 2020. Jangan gunakan metode ini untuk project baru.
  • Progressive CPU: Menghemat banyak waktu karena membuat peta cahaya secara inkremental. Jika Prioritize View dipilih, area dalam tampilan Scene akan diprioritaskan. Metode ini dapat mengurangi waktu iterasi untuk menyiapkan cahaya Scene Anda.
  • Progressive GPU: Cara kerjanya sama seperti CPU Progresif, tetapi menghasilkan peta cahaya di GPU, bukan CPU. Di hardware yang didukung, metode ini dapat mengurangi waktu perekaman secara signifikan dibandingkan menggunakan CPU. Ada persyaratan tambahan untuk menyiapkan GPU Progresif. Pelajari persyaratannya lebih lanjut di halaman Lightmapper GPU Progresif.

Gambar 6. Lightmapper Settings memungkinkan Anda mengubah metode perekaman untuk Scene.

Texel

Texel, atau piksel tekstur, adalah piksel individual dalam peta tekstur. Texel menyimpan informasi cahaya dalam peta cahaya untuk setiap titik cahaya yang mengenai sebuah objek. Banyaknya texel yang digunakan per unit ruang akan memengaruhi kualitas pencahayaan, waktu penghitungan untuk merekam, biaya penyimpanan disk, dan biaya VRAM peta cahaya Anda.

Untuk mengurangi jumlah data peta cahaya yang diperlukan, sesuaikan jumlah texel per unit perekaman di Lightmapping Settings.

Gambar 7. Setelan yang tersedia untuk peta cahaya.

Di Lightmapping Settings, parameter Lightmap Resolution mengontrol jumlah texel yang digunakan per unit dalam peta cahaya. Berikut adalah contoh kubus dengan setelan Lightmap Resolution yang berbeda. Anda dapat melihat bahwa resolusi yang lebih tinggi dengan cepat meningkatkan jumlah tugas yang diperlukan.

Gambar 8. Kubus pertama memiliki Lightmap Resolution bernilai 1. Kubus kedua memiliki Lightmap Resolution bernilai 2. Kubus ketiga memiliki Lightmap Resolution bernilai 5.

Untuk melihat penempatan texel dalam Scene, pilih menu drop-down Draw Mode pada tampilan Scene, lalu pilih Baked Lightmap.

Objek yang direkam tertutup oleh overlay kotak-kotak. Pola kotak-kotak menunjukkan distribusi texel saat Anda merekam cahaya.

Pada contoh berikut, pengurangan Lightmap Resolution dari 15 menjadi 12 dalam demo Armies mengurangi jumlah peta cahaya yang diperlukan dari tujuh menjadi empat.

Gambar 9. Demo Armies dengan Lightmap Resolution bernilai 12.

Penggunaan texel

Meskipun Anda dapat menetapkan jumlah texel per unit di seluruh Scene, sering kali ada beberapa objek yang tidak memerlukan begitu banyak texel.

Unity memungkinkan Anda mengontrol jumlah texel yang digunakan setiap objek. Di Inspector > Mesh Renderer untuk objek, nilai parameter Scale In Lightmap mengontrol jumlah texel yang digunakan objek dalam peta cahaya.

Pada contoh berikut, kubus di sebelah kiri memiliki lima texel informasi cahaya per unit perekaman. Kotak di sebelah kanan memiliki Scale In Lightmap yang disetel ke 0,5. Setelan tersebut mengubah skala texel cahaya menjadi 2,5, yang memerlukan lebih sedikit ruang dalam peta cahaya dibandingkan kotak di sebelah kiri.

Gambar 10. Dua kubus dengan resolusi peta cahaya berbeda.

Gambar 11. Anda dapat mengubah setelan Scale In Lightmap sehingga objek memiliki lebih sedikit texel.

Coba untuk tidak menghabiskan texel pada hal berikut:

  • Permukaan dan objek yang tidak akan dilihat pemain. Hal ini mencegah penggunaan memori secara percuma pada peta cahaya untuk detail yang tidak ditampilkan di layar.
  • Permukaan dengan sedikit variasi cahaya. Misalnya, objek dalam bayangan atau yang tersentuh satu sumber cahaya.
  • Objek kecil atau tipis. Jumlah pencahayaan yang diterima objek ini tidak akan banyak menambah render akhir Scene.

Pencahayaan palsu sebanyak mungkin

Untuk mengurangi persyaratan pemrosesan, Anda dapat memalsukan elemen tertentu. Hal ini dapat membuat konten Anda tampak menggunakan cahaya, tetapi sebenarnya menggunakan metode yang lebih efisien.

Bayangan palsu

Bayangan real-time berbiaya mahal. Bayangan tersebut dibuat dengan teknik yang disebut pemetaan bayangan. Biaya untuk merender geometri Scene ke peta bayangan sebanding dengan jumlah sudut berbayangan yang digambar. Sebaiknya Anda membatasi jumlah geometri yang memunculkan bayangan dan jumlah bayangan real-time yang memunculkan cahaya.

Anda dapat mengimplementasikan bayangan palsu untuk bayangan pada objek dinamis tanpa cahaya dinamis. Hal ini membuat biaya rendering tetap rendah dan dapat menghasilkan efek yang serupa dengan bayangan dinamis. Berikut adalah beberapa cara untuk mengimplementasikan bayangan palsu:

  • Gunakan mesh 3D, seperti bidang atau segi empat, ditempatkan di bawah karakter, lalu terapkan tekstur buram pada karakter tersebut.
  • Anda dapat menulis shader kustom sendiri untuk mendapatkan bayangan blob yang lebih canggih.

Contoh berikut menampilkan hasil jika Anda menggunakan mesh 3D untuk bayangan:

Gambar 12. Implementasi bayangan dalam demo teknologi Armies.

Melukiskan informasi cahaya langsung pada tekstur

Jika melukis beberapa bayangan menjadi tekstur, Anda mengurangi komputasi yang diperlukan untuk cahaya tambahan. Hal ini menghemat memori saat Anda merekam cahaya Scene, karena memerlukan lebih sedikit data peta cahaya.

Probe Cahaya

Jika Anda menggunakan objek dinamis dengan pencahayaan terekam, objek tersebut tidak akan terpengaruh oleh peta cahaya. Hal ini dapat menyebabkan objek tersebut terasa bukan bagian dari Scene.

Anda dapat menyelesaikan masalah ini dengan Probe Cahaya. Probe Cahaya memiliki manfaat yang serupa dengan peta cahaya. Probe Cahaya menyimpan data cahaya yang dapat dihitung sebelumnya dan disimpan untuk digunakan saat runtime. Dengan begitu, biaya penghitungan dapat dialihkan ke waktu pengeditan.

Peta cahaya mengenkode cahaya yang diterima dalam texel untuk permukaan, sedangkan Probe Cahaya menyimpan cahaya yang melewati ruang kosong. Anda dapat menggunakan data ini untuk menerangi objek yang bergerak. Probe Cahaya membantu mengintegrasikan objek dinamis secara visual dengan objek yang dipetakan dengan cahaya di seluruh Scene.

Probe Cahaya paling baik digunakan untuk menerangi objek yang bergerak di Scene. Probe memanfaatkan cahaya terekam, yang memungkinkan objek bergerak memiliki cahaya yang sama seperti Scene. Menerangi objek dinamis dengan Probe Cahaya lebih murah daripada cahaya real-time.

Anda dapat mempelajari halaman Pencahayaan Statis dengan Probe Cahaya dan Probe Cahaya lebih lanjut.

Gambar 13. Probe cahaya yang ditempatkan untuk menerangi kumpulan objek dinamis dalam demo teknologi Armies.

Setelan Mesh Renderer

Terlepas dari jenis cahaya yang digunakan Scene, setelan Mesh Renderer Anda benar.

Nonaktifkan apa pun yang tidak Anda gunakan. Setelan seperti Cast Shadows akan menambah biaya bila Anda merender Scene meskipun objek tidak menyala. Contoh setelan Mesh Renderer berikut adalah untuk karakter yang ditampilkan pada Gambar 13. Karakter tersebut menggunakan data probe cahaya, tetapi tidak menggunakan probe bayangan.

Setelan Blend Probe untuk Probe Cahaya memadukan informasi cahaya dari Probe Cahaya terdekat ke karakter. Saat karakter bergerak di seputar Scene, Probe Cahaya yang memengaruhi karakter tersebut akan berubah. Cast Shadows dinonaktifkan karena render menggunakan metode blob. Receive Shadows juga dinonaktifkan karena Scene direkam dan tidak ada bayangan real-time.

Gambar 14. Setelan Mesh Renderer untuk render Gambar 13.

Cahaya real-time dan jenis cahaya

Sebaiknya tangani cahaya dengan teknik pencahayaan terekam, Probe Cahaya, dan pencahayaan palsu seperti efek material shader atau tekstur pencahayaan yang dilukis. Namun, jika memerlukan cahaya real-time, Anda harus mempertimbangkan jenis cahaya yang akan digunakan.

Setiap jenis cahaya memiliki biaya yang berbeda untuk menghitung pencahayaan. Berikut adalah detail setiap jenis cahaya:

  • Directional: Cahaya ini memiliki arah yang sama dan tidak ada perbedaan kecerahan. Cahaya terarah adalah cahaya real-time yang paling murah. Anda sering kali hanya memerlukan satu cahaya terarah per Scene. Dengan rendering maju, yakni jalur rendering yang disarankan untuk perangkat seluler, Unity akan menyertakan cahaya terarah default jika tidak ada cahaya terarah di Scene.
  • Spot: Cahaya sorot menyisihkan objek di luar kerucutnya dan tidak akan menerangi objek tersebut. Hal ini membuat cahaya sorot lebih murah secara penghitungan dibandingkan cahaya titik bulat. Untuk mendapatkan performa terbaik, buat lebar kerucut tetap sempit dan arahkan hanya ke objek yang diinginkan.
  • Point: Cahaya ini memancarkan cahaya ke segala arah. Pancaran ringan di setiap arah sangat membantu, tetapi sangat mahal. Cahaya titik lebih mahal di seluruh wilayah yang luas. Selain itu, penghitungan bayangan dapat menjadi bagian pencahayaan yang paling mahal. Jika Anda memancarkan cahaya ke segala arah, akan ada lebih banyak bayangan dan penghitungan.