Cleanup and Customizable Blur Passes.

This commit is contained in:
Bronson Zgeb 2021-03-08 16:30:58 -05:00
parent b9df4d5f55
commit 1dd88de7c3
3 changed files with 57 additions and 79 deletions

View File

@ -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<ShaderTagId> m_ShaderTagIdList = new List<ShaderTagId>();
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;
/// <inheritdoc/>
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
};
}

View File

@ -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

View File

@ -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