69 lines
1.9 KiB
C#

using UnityEngine;
namespace Beautify.Universal {
[ExecuteInEditMode]
public class LUTBlending : MonoBehaviour {
public Texture2D LUT1, LUT2;
[Range(0, 1)]
public float LUT1Intensity = 1f;
[Range(0, 1)]
public float LUT2Intensity = 1f;
[Range(0, 1)]
public float phase;
public Shader lerpShader;
float oldPhase = -1;
RenderTexture rt;
Material lerpMat;
static class ShaderParams {
public static int LUT2 = Shader.PropertyToID("_LUT2");
public static int Phase = Shader.PropertyToID("_Phase");
}
void OnEnable() {
UpdateBeautifyLUT();
}
void OnValidate() {
oldPhase = -1;
UpdateBeautifyLUT();
}
private void OnDestroy() {
if (rt != null) {
rt.Release();
}
}
void LateUpdate() {
UpdateBeautifyLUT();
}
void UpdateBeautifyLUT() {
if (oldPhase == phase || LUT1 == null || LUT2 == null || lerpShader == null) return;
oldPhase = phase;
if (rt == null) {
rt = new RenderTexture(LUT1.width, LUT1.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
rt.filterMode = FilterMode.Point;
}
if (lerpMat == null) {
lerpMat = new Material(lerpShader);
}
lerpMat.SetTexture(ShaderParams.LUT2, LUT2);
lerpMat.SetFloat(ShaderParams.Phase, phase);
Graphics.Blit(LUT1, rt, lerpMat);
BeautifySettings.settings.lut.Override(true);
float intensity = Mathf.Lerp(LUT1Intensity, LUT2Intensity, phase);
BeautifySettings.settings.lutIntensity.Override(intensity);
BeautifySettings.settings.lutTexture.Override(rt);
}
}
}