Jadi saya baru-baru ini mencoba tangan saya di ini dan mengalami banyak masalah yang sama kalian miliki. Solusi tekstur render sedikit herring merah. Saya bisa menyelesaikannya dengan menggunakan manipulasi piksel multithreading pada utas terpisah.
https://www.youtube.com/watch?v=T_zpFk1mdCI
Jadi biasanya orang akan menggunakan graphics.blit()
dan meneruskan tekstur render ke mana pun ia perlu pergi, tetapi data lightmap tidak mendukung tekstur, mereka membutuhkan tekstur2ds. Langkah logis berikutnya adalah menyalin data ke tekstur2d dan kemudian memasukkannya ke data lightmap. Teknik ini merusak frame rate karena memperlambat GPU untuk mengirim data ke CPU, bukan hanya referensi ke data.
Solusinya adalah dengan tidak menggunakan GPU.
Transisi peta cahaya terjadi dalam periode waktu yang lama sehingga tidak perlu memperbarui peta cahaya setiap frame. Sebagai soal fakta, pemain mungkin tidak akan memperhatikan jika peta cahaya hanya diperbarui setiap 20-40 menit dalam waktu permainan.
Jadi yang Anda lakukan adalah Anda mengeluarkan tugas ke CPU pada utas terpisah untuk setiap peta cahaya.
Biasanya Unity tidak mendukung multithreading. Tapi tidak apa-apa, C # tidak. Orang ini melakukan pekerjaan yang fenomenal menjelaskan multithreading di Unity, jadi jika Anda belum pernah mendengarnya, atau tidak pernah tahu cara multithread di Unity, ini videonya:
https://www.youtube.com/watch?v=ja63QO1Imck
Yang perlu Anda lakukan adalah membuat kelas utas pekerja yang memvariasikan salinan data piksel peta cahaya dalam larik Warna, lalu membuat fungsi campuran.
Lerp sederhana dari satu warna ke warna berikutnya akan berhasil.
Kemudian buat utas, mulai, dan ketika semua lightmaps selesai di utas terpisah Anda dapat menyalin data piksel kembali ke dalam tekstur data lightmap2d.
Saya memposting beberapa contoh kode di bawah ini. Ini jelas bukan versi yang sepenuhnya diimplementasikan, tetapi ini menunjukkan kepada Anda konsep utama membuat kelas, membuat utas, dan kemudian mengatur lightdata.
Hal-hal lain yang harus Anda lakukan adalah memanggil fungsi sesekali untuk memicu pembaruan lightmaps. Anda juga harus menyalin semua data piksel ke dalam kelas pekerja saat mulai atau pada waktu kompilasi. Semoga beruntung bagi siapa saja yang menemukan ini. Saya pikir op telah pindah dengan kehidupan mereka, tetapi saya tahu orang lain dengan masalah yang sama mungkin menemukan ini.
public class work
{
Color[] fromPixels;
Color[] toPixels;
public float LerpValue = 0;
public bool Finished = false;
public Color[] mixedPixels;
public work(Color[] FromPix, Color[] ToPix)
{
fromPixels= FromPix;
toPixels= ToPix;
Finished = false;
mixedPixels = new Color[FromPix.Length];
}
public void DoWork()
{
for (int x = 0; x < fromPixels.Length; x++)
{
mixedPixels[x] = Color.Lerp(fromPixels[x], toPixels[x], LerpValue);
}
Finished = true;
}
}
IEnumerator LightMapSet()
{
Thread workerThread = new Thread(someworker.DoWork);
someworker.LerpValue = lerpValue;
workerThread.Start();
yield return new WaitUntil(() => someworker.Finished);
mixedMap.SetPixels(someworker.mixedPixels);
mixedMap.Apply(true);
LightmapData someLightmapData;
someLightmapData.lightmapColor = mixedMap;
lightDatas = { someLightmapData};
LightmapSettings.lightmaps = lightDatas;
}