Files
2025-11-30 08:35:03 +02:00

63 lines
1.7 KiB
C#

using System.Collections.Generic;
using UnityEngine;
[ExecuteAlways, ImageEffectAllowedInSceneView]
public class RoughRefraction : MonoBehaviour
{
private readonly Dictionary<Camera, RenderTexture> renderTextureCache = new Dictionary<Camera, RenderTexture>();
private static readonly int CameraOpaqueTexture = Shader.PropertyToID("_CameraOpaqueTexture");
private void OnDisable()
{
if (renderTextureCache != null) {
foreach(var kvp in renderTextureCache)
RenderTexture.ReleaseTemporary(kvp.Value);
}
renderTextureCache?.Clear();
}
private void OnPreRender()
{
SetTexture();
}
private void SetTexture()
{
var current = Camera.current;
if (!renderTextureCache.ContainsKey(current))
{
Shader.SetGlobalTexture(CameraOpaqueTexture, Texture2D.blackTexture);
return;
}
Shader.SetGlobalTexture(CameraOpaqueTexture, renderTextureCache[current]);
}
[ImageEffectOpaque]
private void OnRenderImage(RenderTexture src, RenderTexture dest)
{
var dsc = src.descriptor;
dsc.useMipMap = true;
dsc.autoGenerateMips = false;
dsc.msaaSamples = 1;
dsc.width = Mathf.ClosestPowerOfTwo(dsc.width);
dsc.height = Mathf.ClosestPowerOfTwo(dsc.height);
var current = Camera.current;
if (!renderTextureCache.ContainsKey(current))
renderTextureCache.Add(current, null);
if(renderTextureCache[current])
RenderTexture.ReleaseTemporary(renderTextureCache[current]);
renderTextureCache[current] = RenderTexture.GetTemporary(dsc);
renderTextureCache[current].filterMode = FilterMode.Trilinear;
// temp[current].useMipMap = true;
Graphics.Blit(src, renderTextureCache[current]);
renderTextureCache[current].GenerateMips();
Graphics.Blit(src, dest);
SetTexture();
}
}