////////////////////////////////////////////////////// // MK Glow Mip Buffer // // // // Created by Michael Kremmel // // www.michaelkremmel.de // // Copyright © 2021 All rights reserved. // ////////////////////////////////////////////////////// using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; namespace MK.Glow { /// /// Renderbuffer based on a mip setup /// internal sealed class MipBuffer { private RenderTarget[] _renderTargets = new RenderTarget[PipelineProperties.renderBufferSize]; internal RenderTarget[] renderTargets { get { return _renderTargets; } } public MipBuffer(string name, RenderPipeline renderPipeline) { if(renderPipeline == RenderPipeline.SRP) { for(int i = 0; i < PipelineProperties.renderBufferSize; i++) { _renderTargets[i].identifier = Shader.PropertyToID(name + i); #if UNITY_2018_2_OR_NEWER _renderTargets[i].renderTargetIdentifier = new RenderTargetIdentifier(renderTargets[i].identifier, 0, CubemapFace.Unknown, -1); #else _renderTargets[i].renderTargetIdentifier = new RenderTargetIdentifier(renderTargets[i].identifier); #endif } } else { for(int i = 0; i < PipelineProperties.renderBufferSize; i++) { renderTargets[i].identifier = Shader.PropertyToID(name + i); } } } /// /// Create a specific level of the the buffer /// /// /// /// /// /// internal void CreateTemporary(RenderContext[] renderContext, int level, CommandBuffer cmd, RenderTextureFormat format, bool useComputeShaders, RenderPipeline renderPipeline) { if(renderPipeline == RenderPipeline.SRP) { #if UNITY_2017_1_OR_NEWER cmd.GetTemporaryRT(renderTargets[level].identifier, renderContext[level].descriptor, FilterMode.Bilinear); #else cmd.GetTemporaryRT(renderTargets[level].identifier, renderContext[level].width, renderContext[level].height, 0, FilterMode.Bilinear, format, RenderTextureReadWrite.Default, 1, useComputeShaders); #endif } else { renderTargets[level].renderTexture = PipelineExtensions.GetTemporary(renderContext[level], format); } } /// /// Clear a specific level of the buffer /// /// /// internal void ClearTemporary(CommandBuffer cmd, int level, RenderPipeline renderPipeline) { if(renderPipeline == RenderPipeline.SRP) cmd.ReleaseTemporaryRT(renderTargets[level].identifier); else RenderTexture.ReleaseTemporary(renderTargets[level].renderTexture); } } }