Тому я нещодавно спробував себе в цьому і зіткнувся з багатьма тими ж проблемами, що і у вас. Текстурне рішення візуалізації - це трохи червона оселедець. Мені вдалося вирішити це за допомогою багатопотокової маніпуляції пікселями на окремій потоці.
https://www.youtube.com/watch?v=T_zpFk1mdCI
Тож зазвичай можна використовувати graphics.blit()
та передавати текстуру візуалізації туди, куди їй потрібно перейти, але дані світшоти не підтримують текстури, для них потрібні тексту2ds. Наступним логічним кроком буде скопіювати дані в text2d, а потім подати їх у дані світлого карти. Ця методика руйнує частоту кадрів, тому що вона затримує GPU для надсилання даних в процесор, а не просто посилання на дані.
Тоді рішення - не використовувати GPU.
Переходи світлих карт відбуваються протягом тривалого періоду часу, тому не обов’язково важливо оновлювати світлу карту кожного кадру. Насправді гравці, ймовірно, не помітили, якби світлі карти оновлювалися лише кожні 20-40 хвилин у ігровий час.
Отже, ви робите це завдання, яке ви подаєте на ЦП на окремі потоки для кожної легкої карти.
Зазвичай Unity не підтримує багатопотоковість. Але це нормально, C # робить. Цей хлопець виконує феноменальну роботу, пояснюючи багатопотоковість в Єдності, тому якщо ви ніколи про це не чули або ніколи не знали, як багатопоточні в Unity, це відео:
https://www.youtube.com/watch?v=ja63QO1Imck
Все, що вам потрібно зробити, - це зробити клас робочої нитки, який варіює копії даних пікселів світлого карти в кольорових масивах, а потім створити функцію змішування.
Простий лерп від одного кольору до іншого зробить.
Потім створіть потік, запустіть його, і коли всі світлові карти будуть закінчені в окремі потоки, ви зможете скопіювати дані пікселів назад у text2d дані даних про світлу карту.
Нижче я розмістив приклад коду. Це, звичайно, не повністю реалізована версія, але вона показує вам основні концепції складання класу, створення потоку та встановлення світлих даних.
Інші речі, які вам доведеться зробити, - це викликати функцію щоразу, щоб викликати оновлення світлових карт. Крім того, ви повинні або скопіювати всі дані пікселів у робочий клас під час запуску або під час компіляції. Удачі всім, хто це знайде. Я вважаю, що ОП продовжило своє життя, але я знаю, що інші люди з подібними проблемами можуть натрапити на це.
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;
}