using System; using System.Collections.Generic; namespace UnityEngine.PostProcessing { public sealed class RenderTextureFactory : IDisposable { HashSet m_TemporaryRTs; public RenderTextureFactory() { m_TemporaryRTs = new HashSet(); } public RenderTexture Get(RenderTexture baseRenderTexture) { return Get( baseRenderTexture.width, baseRenderTexture.height, baseRenderTexture.depth, baseRenderTexture.format, baseRenderTexture.sRGB ? RenderTextureReadWrite.sRGB : RenderTextureReadWrite.Linear, baseRenderTexture.filterMode, baseRenderTexture.wrapMode ); } public RenderTexture Get(int width, int height, int depthBuffer = 0, RenderTextureFormat format = RenderTextureFormat.ARGBHalf, RenderTextureReadWrite rw = RenderTextureReadWrite.Default, FilterMode filterMode = FilterMode.Bilinear, TextureWrapMode wrapMode = TextureWrapMode.Clamp, string name = "FactoryTempTexture") { var rt = RenderTexture.GetTemporary(width, height, depthBuffer, format, rw); // add forgotten param rw rt.filterMode = filterMode; rt.wrapMode = wrapMode; rt.name = name; m_TemporaryRTs.Add(rt); return rt; } public void Release(RenderTexture rt) { if (rt == null) return; if (!m_TemporaryRTs.Contains(rt)) throw new ArgumentException(string.Format("Attempting to remove a RenderTexture that was not allocated: {0}", rt)); m_TemporaryRTs.Remove(rt); RenderTexture.ReleaseTemporary(rt); } public void ReleaseAll() { var enumerator = m_TemporaryRTs.GetEnumerator(); while (enumerator.MoveNext()) RenderTexture.ReleaseTemporary(enumerator.Current); m_TemporaryRTs.Clear(); } public void Dispose() { ReleaseAll(); } } }