| | 1 | | using System.Collections; |
| | 2 | | using System.Collections.Generic; |
| | 3 | | using UnityEngine; |
| | 4 | | using UnityEngine.Rendering; |
| | 5 | | using UnityEngine.Rendering.Universal; |
| | 6 | |
|
| | 7 | | public class GaussianBlurHandler : ScriptableRendererFeature |
| | 8 | | { |
| | 9 | | [System.Serializable] |
| | 10 | | public class GaussianBlurSettings |
| | 11 | | { |
| 0 | 12 | | public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingTransparents; |
| | 13 | | public Material blurMaterial = null; |
| | 14 | |
|
| | 15 | | [Range(1,25)] |
| 0 | 16 | | public int blurPasses = 1; |
| | 17 | |
|
| | 18 | | [Range(1, 10)] |
| 0 | 19 | | public int downsample = 1; |
| | 20 | |
|
| 0 | 21 | | public string targetName = "_blurTexture"; |
| | 22 | | } |
| | 23 | |
|
| | 24 | | [SerializeField] |
| 0 | 25 | | public GaussianBlurSettings settings = new GaussianBlurSettings(); |
| | 26 | | public class GaussianBlurPass : ScriptableRenderPass |
| | 27 | | { |
| | 28 | | public Material blurMat; |
| | 29 | | public int passes; |
| | 30 | | public int downsample; |
| | 31 | | public string targetName; |
| | 32 | | string profilerTag; |
| | 33 | |
|
| | 34 | | int tmpID1; |
| | 35 | | int tmpID2; |
| | 36 | |
|
| | 37 | | RenderTargetIdentifier tmpRT1; |
| | 38 | | RenderTargetIdentifier tmpRT2; |
| | 39 | |
|
| 0 | 40 | | private RenderTargetIdentifier source {get; set;} |
| | 41 | |
|
| | 42 | | public void Setup(RenderTargetIdentifier source) |
| | 43 | | { |
| 0 | 44 | | this.source = source; |
| 0 | 45 | | } |
| | 46 | |
|
| 3 | 47 | | public GaussianBlurPass(string profilerTag) |
| | 48 | | { |
| 3 | 49 | | this.profilerTag = profilerTag; |
| 3 | 50 | | } |
| | 51 | |
|
| | 52 | | public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) |
| | 53 | | { |
| 0 | 54 | | var width = cameraTextureDescriptor.width / downsample; |
| 0 | 55 | | var height = cameraTextureDescriptor.height / downsample; |
| | 56 | |
|
| 0 | 57 | | tmpID1 = Shader.PropertyToID("tmpBlurRT1"); |
| 0 | 58 | | tmpID2 = Shader.PropertyToID("tmpBlurRT2"); |
| | 59 | |
|
| 0 | 60 | | cmd.GetTemporaryRT(tmpID1, width, height, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32); |
| 0 | 61 | | cmd.GetTemporaryRT(tmpID2, width, height, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32); |
| | 62 | |
|
| 0 | 63 | | tmpRT1 = new RenderTargetIdentifier(tmpID1); |
| 0 | 64 | | tmpRT2 = new RenderTargetIdentifier(tmpID2); |
| | 65 | |
|
| 0 | 66 | | ConfigureTarget(tmpRT1); |
| 0 | 67 | | ConfigureTarget(tmpRT2); |
| 0 | 68 | | } |
| | 69 | |
|
| | 70 | | public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) |
| | 71 | | { |
| 0 | 72 | | CommandBuffer cmd = CommandBufferPool.Get(profilerTag); |
| | 73 | |
|
| 0 | 74 | | RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor; |
| 0 | 75 | | opaqueDesc.depthBufferBits = 0; |
| | 76 | |
|
| | 77 | |
|
| | 78 | | //first pass |
| 0 | 79 | | cmd.SetGlobalFloat("_offset", 1.5f); |
| 0 | 80 | | cmd.Blit(source, tmpRT1, blurMat); |
| | 81 | |
|
| 0 | 82 | | for (int i = 1; i < passes - 1; i++) |
| | 83 | | { |
| 0 | 84 | | cmd.SetGlobalFloat("_offset", 0.5f + i); |
| 0 | 85 | | cmd.Blit(tmpRT1, tmpRT2, blurMat); |
| | 86 | |
|
| 0 | 87 | | var RTtmp = tmpRT1; |
| 0 | 88 | | tmpRT1 = tmpRT2; |
| 0 | 89 | | tmpRT2 = RTtmp; |
| | 90 | | } |
| | 91 | |
|
| | 92 | | //final pass |
| 0 | 93 | | cmd.SetGlobalFloat("_offset", 0.5f + passes - 1); |
| 0 | 94 | | cmd.Blit(tmpRT1, tmpRT2, blurMat); |
| 0 | 95 | | cmd.SetGlobalTexture(targetName, tmpRT2); |
| | 96 | |
|
| 0 | 97 | | context.ExecuteCommandBuffer(cmd); |
| 0 | 98 | | cmd.Clear(); |
| 0 | 99 | | CommandBufferPool.Release(cmd); |
| 0 | 100 | | } |
| | 101 | |
|
| | 102 | | public override void FrameCleanup(CommandBuffer cmd) |
| | 103 | | { |
| 0 | 104 | | } |
| | 105 | | } |
| | 106 | |
|
| | 107 | | GaussianBlurPass scriptablePass; |
| | 108 | |
|
| | 109 | | public override void Create() |
| | 110 | | { |
| 3 | 111 | | scriptablePass = new GaussianBlurPass("GaussianBlur"); |
| 3 | 112 | | scriptablePass.blurMat = settings.blurMaterial; |
| 3 | 113 | | scriptablePass.passes = settings.blurPasses; |
| 3 | 114 | | scriptablePass.downsample = settings.downsample; |
| 3 | 115 | | scriptablePass.targetName = settings.targetName; |
| 3 | 116 | | scriptablePass.renderPassEvent = settings.renderPassEvent; |
| 3 | 117 | | } |
| | 118 | |
|
| | 119 | | public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) |
| | 120 | | { |
| 0 | 121 | | var src = renderer.cameraColorTarget; |
| 0 | 122 | | scriptablePass.Setup(src); |
| 0 | 123 | | renderer.EnqueuePass(scriptablePass); |
| 0 | 124 | | } |
| | 125 | | } |