From 1dd88de7c35ef98ed2500de38e2f34607f8dafe9 Mon Sep 17 00:00:00 2001 From: Bronson Zgeb Date: Mon, 8 Mar 2021 16:30:58 -0500 Subject: [PATCH] Cleanup and Customizable Blur Passes. --- .../RenderMetaballsScreenSpace.cs | 72 +++++++++++-------- Assets/Metaballs/Shaders/KawaseBlur.shader | 27 ++----- .../Settings/CustomForwardRendererData.asset | 37 +++------- 3 files changed, 57 insertions(+), 79 deletions(-) diff --git a/Assets/Metaballs/RendererFeatures/RenderMetaballsScreenSpace.cs b/Assets/Metaballs/RendererFeatures/RenderMetaballsScreenSpace.cs index 7023435..1aac06d 100644 --- a/Assets/Metaballs/RendererFeatures/RenderMetaballsScreenSpace.cs +++ b/Assets/Metaballs/RendererFeatures/RenderMetaballsScreenSpace.cs @@ -18,6 +18,8 @@ public class RenderMetaballsScreenSpace : ScriptableRendererFeature public Material BlurMaterial; public Material BlitCopyDepthMaterial; + public int BlurPasses; + RenderTargetIdentifier _metaballRT; RenderTargetIdentifier _metaballRT2; RenderTargetIdentifier _cameraTargetId; @@ -25,26 +27,20 @@ public class RenderMetaballsScreenSpace : ScriptableRendererFeature RenderQueueType renderQueueType; FilteringSettings m_FilteringSettings; - RenderObjects.CustomCameraSettings m_CameraSettings; ProfilingSampler m_ProfilingSampler; - public Material overrideMaterial { get; set; } - public int overrideMaterialPassIndex { get; set; } - List m_ShaderTagIdList = new List(); RenderStateBlock m_RenderStateBlock; public RenderMetaballsScreenSpacePass(string profilerTag, RenderPassEvent renderPassEvent, string[] shaderTags, - RenderQueueType renderQueueType, int layerMask, RenderObjects.CustomCameraSettings cameraSettings) + RenderQueueType renderQueueType, int layerMask) { profilingSampler = new ProfilingSampler(nameof(RenderObjectsPass)); m_ProfilingSampler = new ProfilingSampler(profilerTag); this.renderPassEvent = renderPassEvent; this.renderQueueType = renderQueueType; - this.overrideMaterial = null; - this.overrideMaterialPassIndex = 0; RenderQueueRange renderQueueRange = (renderQueueType == RenderQueueType.Transparent) ? RenderQueueRange.transparent : RenderQueueRange.opaque; @@ -64,7 +60,6 @@ public class RenderMetaballsScreenSpace : ScriptableRendererFeature } m_RenderStateBlock = new RenderStateBlock(RenderStateMask.Nothing); - m_CameraSettings = cameraSettings; BlitCopyDepthMaterial = new Material(Shader.Find("Hidden/BlitToDepth")); BlurMaterial = new Material(Shader.Find("Hidden/KawaseBlur")); @@ -109,10 +104,6 @@ public class RenderMetaballsScreenSpace : ScriptableRendererFeature DrawingSettings drawingSettings = CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortingCriteria); - drawingSettings.overrideMaterial = overrideMaterial; - drawingSettings.overrideMaterialPassIndex = overrideMaterialPassIndex; - - ref CameraData cameraData = ref renderingData.cameraData; // NOTE: Do NOT mix ProfilingScope with named CommandBuffers i.e. CommandBufferPool.Get("name"). // Currently there's an issue which results in mismatched markers. @@ -133,32 +124,45 @@ public class RenderMetaballsScreenSpace : ScriptableRendererFeature context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings, ref m_RenderStateBlock); - if (m_CameraSettings.overrideCamera && m_CameraSettings.restoreCamera) + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + + float offset = 1.5f; + //Blur + cmd.SetGlobalFloat("_Offset", offset); + Blit(cmd, _metaballRT, _metaballRT2, BlurMaterial); + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + + for (int i = 1; i < BlurPasses; ++i) { - RenderingUtils.SetViewAndProjectionMatrices(cmd, cameraData.GetViewMatrix(), - cameraData.GetGPUProjectionMatrix(), false); + offset += 1.0f; + cmd.SetGlobalFloat("_Offset", offset); + Blit(cmd, _metaballRT, _metaballRT2, BlurMaterial); + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + + var tmpRT = _metaballRT; + _metaballRT = _metaballRT2; + _metaballRT2 = tmpRT; } - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - - //Blur - cmd.SetGlobalVector("_Offsets", new Vector4(1.5f, 2.0f, 2.5f, 3.0f)); - Blit(cmd, _metaballRT, _metaballRT2, BlurMaterial); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); - + /* + cmd.SetGlobalFloat("_Offset", 2.5f); Blit(cmd, _metaballRT2, _metaballRT, BlurMaterial); context.ExecuteCommandBuffer(cmd); cmd.Clear(); + cmd.SetGlobalFloat("_Offset", 3.5f); Blit(cmd, _metaballRT, _metaballRT2, BlurMaterial); context.ExecuteCommandBuffer(cmd); cmd.Clear(); + cmd.SetGlobalFloat("_Offset", 4.5f); Blit(cmd, _metaballRT2, _metaballRT, BlurMaterial); context.ExecuteCommandBuffer(cmd); cmd.Clear(); + */ //Draw to Camera Target Blit(cmd, _metaballRT, _cameraTargetId, BlitMaterial); @@ -176,19 +180,25 @@ public class RenderMetaballsScreenSpace : ScriptableRendererFeature } } - public Material blitMaterial; + public string PassTag = "RenderMetaballsScreenSpace"; + public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques; + + public RenderObjects.FilterSettings FilterSettings = new RenderObjects.FilterSettings(); + + public Material BlitMaterial; RenderMetaballsScreenSpacePass _scriptableMetaballsScreenSpacePass; - public RenderObjects.RenderObjectsSettings renderObjectsSettings = new RenderObjects.RenderObjectsSettings(); + + [Range(1, 15)] + public int BlurPasses = 1; /// public override void Create() { - RenderObjects.FilterSettings filter = renderObjectsSettings.filterSettings; - _scriptableMetaballsScreenSpacePass = new RenderMetaballsScreenSpacePass(renderObjectsSettings.passTag, - renderObjectsSettings.Event, - filter.PassNames, filter.RenderQueueType, filter.LayerMask, renderObjectsSettings.cameraSettings) + _scriptableMetaballsScreenSpacePass = new RenderMetaballsScreenSpacePass(PassTag, Event, + FilterSettings.PassNames, FilterSettings.RenderQueueType, FilterSettings.LayerMask) { - BlitMaterial = blitMaterial + BlitMaterial = BlitMaterial, + BlurPasses = BlurPasses }; } diff --git a/Assets/Metaballs/Shaders/KawaseBlur.shader b/Assets/Metaballs/Shaders/KawaseBlur.shader index 4b061ba..b4f4159 100644 --- a/Assets/Metaballs/Shaders/KawaseBlur.shader +++ b/Assets/Metaballs/Shaders/KawaseBlur.shader @@ -30,7 +30,7 @@ Shader "Hidden/KawaseBlur" float4 vertex : SV_POSITION; }; - half4 _Offsets; + float _Offset; sampler2D _MainTex; float4 _MainTex_ST; @@ -48,10 +48,10 @@ Shader "Hidden/KawaseBlur" { fixed4 result = color; - result += tex2D(_MainTex, uv + half2( offset + 0.5, offset + 0.5) * texelResolution); - result += tex2D(_MainTex, uv + half2(-offset - 0.5, offset + 0.5) * texelResolution); - result += tex2D(_MainTex, uv + half2(-offset - 0.5, -offset - 0.5) * texelResolution); - result += tex2D(_MainTex, uv + half2( offset + 0.5, -offset - 0.5) * texelResolution); + result += tex2D(_MainTex, uv + half2( offset, offset) * texelResolution); + result += tex2D(_MainTex, uv + half2(-offset, offset) * texelResolution); + result += tex2D(_MainTex, uv + half2(-offset, -offset) * texelResolution); + result += tex2D(_MainTex, uv + half2( offset, -offset) * texelResolution); result /= 5.0h; return result; @@ -76,22 +76,7 @@ Shader "Hidden/KawaseBlur" const half2 uv = input.uv; fixed4 color = tex2D(_MainTex, uv); - color = applyBlur(color, uv, texelResolution, 1); - color = applyBlur(color, uv, texelResolution, 2); - //color = applyBlur(color, uv, texelResolution, 2); - //color = applyBlur(color, uv, texelResolution, 2); - //color = applyBlur(color, uv, texelResolution, 3); - //color = applyBlur(color, uv, texelResolution, 2); - //color = applyBlur(color, uv, texelResolution, 3); - - /* - color = applyBlur(color, uv, texelResolution, _Offsets.x + _Offsets.w); - color = applyBlur(color, uv, texelResolution, _Offsets.y + _Offsets.w); - color = applyBlur(color, uv, texelResolution, _Offsets.z + _Offsets.w); - color = applyBlur(color, uv, texelResolution, _Offsets.w + _Offsets.w); - */ - - //color = saturate(smoothstep(0, 0.4, color)); + color = applyBlur(color, uv, texelResolution, _Offset); return color; } ENDCG diff --git a/Assets/Settings/CustomForwardRendererData.asset b/Assets/Settings/CustomForwardRendererData.asset index fdb3b00..21bd45b 100644 --- a/Assets/Settings/CustomForwardRendererData.asset +++ b/Assets/Settings/CustomForwardRendererData.asset @@ -56,30 +56,13 @@ MonoBehaviour: m_Name: RenderMetaballsScreenSpace m_EditorClassIdentifier: m_Active: 1 - blitMaterial: {fileID: 2100000, guid: 95391282e3f31ef4dada9756b388d99d, type: 2} - renderObjectsSettings: - passTag: RenderMetaballsScreenSpace - Event: 350 - filterSettings: - RenderQueueType: 1 - LayerMask: - serializedVersion: 2 - m_Bits: 16 - PassNames: [] - overrideMaterial: {fileID: 0} - overrideMaterialPassIndex: 0 - overrideDepthState: 0 - depthCompareFunction: 4 - enableWrite: 1 - stencilSettings: - overrideStencilState: 0 - stencilReference: 0 - stencilCompareFunction: 8 - passOperation: 0 - failOperation: 0 - zFailOperation: 0 - cameraSettings: - overrideCamera: 0 - restoreCamera: 1 - offset: {x: 0, y: 0, z: 0, w: 0} - cameraFieldOfView: 60 + PassTag: RenderMetaballsScreenSpace + Event: 300 + FilterSettings: + RenderQueueType: 1 + LayerMask: + serializedVersion: 2 + m_Bits: 16 + PassNames: [] + BlitMaterial: {fileID: 2100000, guid: 95391282e3f31ef4dada9756b388d99d, type: 2} + BlurPasses: 2