Así que recientemente probé con esto y me encontré con muchos de los mismos problemas que ustedes tienen. La solución de textura de render es un poco de arenque rojo. Pude resolverlo usando la manipulación de píxeles de subprocesos múltiples en un hilo separado.
https://www.youtube.com/watch?v=T_zpFk1mdCI
Por lo general, uno usaría graphics.blit()
y pasaría la textura de renderizado a donde sea necesario, pero los datos del mapa de luz no admiten texturas, requieren texture2ds. El siguiente paso lógico sería copiar los datos a una texture2d y luego alimentarlos a los datos del mapa de luz. Esta técnica arruina las velocidades de cuadros porque está deteniendo la GPU para enviar datos a la CPU, en lugar de solo una referencia a los datos.
La solución es no utilizar la GPU.
Las transiciones del mapa de luz ocurren durante un largo período de tiempo, por lo que no es necesariamente importante actualizar el mapa de luz cada fotograma. De hecho, los jugadores probablemente no se darían cuenta si los mapas de luz solo se actualizan cada 20-40 minutos en el tiempo de juego.
Entonces, lo que haces es enviar la tarea a la CPU en subprocesos separados para cada mapa de luz.
Por lo general, Unity no admite subprocesos múltiples. Pero está bien, C # sí. Este tipo hace un trabajo fenomenal explicando el subproceso múltiple en Unity, por lo que si nunca has oído hablar de él o nunca has sabido cómo multiprocesar en Unity, este es el video:
https://www.youtube.com/watch?v=ja63QO1Imck
Todo lo que necesita hacer es crear una clase de subproceso de trabajo que varíe las copias de los datos de píxeles del mapa de luz en matrices de colores y luego cree una función de mezcla.
Un simple salto de un color al siguiente servirá.
Luego cree el hilo, inícielo, y cuando todos los mapas de luz hayan terminado en los hilos separados, puede copiar los datos de píxeles nuevamente en la textura de datos del mapa de luz2d.
Publiqué un código de ejemplo a continuación. Ciertamente no es la versión completamente implementada, pero muestra los conceptos principales de hacer la clase, crear el hilo y luego configurar los datos de luz.
Las otras cosas que tendría que hacer es llamar a una función cada cierto tiempo para activar la actualización de los mapas de luz. También debe copiar todos los datos de píxeles en la clase de trabajo al inicio o en el momento de la compilación. Buena suerte a cualquiera que encuentre esto. Me imagino que la operación ha seguido adelante con su vida, pero sé que otras personas con problemas similares podrían tropezar con esto.
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;
}