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