Поэтому я недавно попробовал свои силы в этом и столкнулся с множеством тех же проблем, что и у вас, ребята. Решение для рендеринга текстуры - это немного красной сельди. Я смог решить эту проблему, используя многопоточную обработку пикселей в отдельном потоке.
https://www.youtube.com/watch?v=T_zpFk1mdCI
Поэтому обычно можно использовать graphics.blit()
и передавать текстуру рендеринга куда угодно, но данные карты освещения не поддерживают текстуры, им требуются texture2ds. Следующий логический шаг - скопировать данные в texture2d, а затем передать их в данные карты освещения. Этот метод разрушает частоту кадров, потому что он останавливает GPU для отправки данных в CPU, а не просто для ссылки на данные.
Решение состоит в том, чтобы не использовать графический процессор.
Переходы карты освещения происходят в течение длительного периода времени, поэтому необязательно обновлять карту освещения каждый кадр. На самом деле, игроки, вероятно, не заметят, если световые карты будут обновляться каждые 20-40 минут во время игры.
Итак, что вы делаете, вы запускаете задачу в ЦП в отдельных потоках для каждой карты освещения.
Обычно Unity не поддерживает многопоточность. Но это нормально, C # делает. Этот парень делает феноменальную работу по объяснению многопоточности в Unity, поэтому, если вы никогда не слышали об этом или никогда не знали, как многопоточность в Unity, это видео:
https://www.youtube.com/watch?v=ja63QO1Imck
Все, что вам нужно сделать, это создать класс рабочего потока, который изменяет копии данных пикселей карты освещения в цветовых массивах, а затем создать функцию наложения.
Подойдет простой переход от одного цвета к другому.
Затем создайте поток, запустите его, и когда все световые карты будут закончены в отдельных потоках, вы сможете скопировать данные пикселей обратно в данные карты освещения texture2d.
Я разместил пример кода ниже. Это, конечно, не полностью реализованная версия, но она показывает вам основные концепции создания класса, создания потока, а затем установки lightdata.
Другие вещи, которые вам нужно будет делать, это вызывать функцию время от времени, чтобы вызвать обновление световых карт. Также вы должны скопировать все данные пикселей в рабочий класс при запуске или во время компиляции. Удачи всем, кто найдет это. Я полагаю, что работа продолжалась с их жизнью, но я знаю, что другие люди с подобными проблемами могут наткнуться на это.
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;
}