|
@@ -0,0 +1,111 @@
|
|
|
+using UnityEngine;
|
|
|
+using UnityEngine.Rendering;
|
|
|
+using UnityEngine.Rendering.Universal;
|
|
|
+
|
|
|
+// Saved in Blit.cs
|
|
|
+public class Blit : ScriptableRendererFeature {
|
|
|
+
|
|
|
+ public class BlitPass : ScriptableRenderPass {
|
|
|
+ public enum RenderTarget {
|
|
|
+ Color,
|
|
|
+ RenderTexture,
|
|
|
+ }
|
|
|
+
|
|
|
+ public Material blitMaterial = null;
|
|
|
+ public int blitShaderPassIndex = 0;
|
|
|
+ public FilterMode filterMode { get; set; }
|
|
|
+
|
|
|
+ private RenderTargetIdentifier source { get; set; }
|
|
|
+ private RenderTargetHandle destination { get; set; }
|
|
|
+
|
|
|
+ RenderTargetHandle m_TemporaryColorTexture;
|
|
|
+ string m_ProfilerTag;
|
|
|
+
|
|
|
+ public BlitPass(RenderPassEvent renderPassEvent, Material blitMaterial, int blitShaderPassIndex, string tag) {
|
|
|
+ this.renderPassEvent = renderPassEvent;
|
|
|
+ this.blitMaterial = blitMaterial;
|
|
|
+ this.blitShaderPassIndex = blitShaderPassIndex;
|
|
|
+ m_ProfilerTag = tag;
|
|
|
+ m_TemporaryColorTexture.Init("_TemporaryColorTexture");
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Setup(RenderTargetIdentifier source, RenderTargetHandle destination) {
|
|
|
+ this.source = source;
|
|
|
+ this.destination = destination;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) {
|
|
|
+ CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
|
|
|
+
|
|
|
+ RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor;
|
|
|
+ opaqueDesc.depthBufferBits = 0;
|
|
|
+
|
|
|
+ // Can't read and write to same color target, use a TemporaryRT
|
|
|
+ if (destination == RenderTargetHandle.CameraTarget) {
|
|
|
+ cmd.GetTemporaryRT(m_TemporaryColorTexture.id, opaqueDesc, filterMode);
|
|
|
+ Blit(cmd, source, m_TemporaryColorTexture.Identifier(), blitMaterial, blitShaderPassIndex);
|
|
|
+ Blit(cmd, m_TemporaryColorTexture.Identifier(), source);
|
|
|
+ } else {
|
|
|
+ Blit(cmd, source, destination.Identifier(), blitMaterial, blitShaderPassIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ context.ExecuteCommandBuffer(cmd);
|
|
|
+ CommandBufferPool.Release(cmd);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void FrameCleanup(CommandBuffer cmd) {
|
|
|
+ if (destination == RenderTargetHandle.CameraTarget)
|
|
|
+ cmd.ReleaseTemporaryRT(m_TemporaryColorTexture.id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [System.Serializable]
|
|
|
+ public class BlitSettings {
|
|
|
+ public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques;
|
|
|
+
|
|
|
+ public Material blitMaterial = null;
|
|
|
+ public int blitMaterialPassIndex = -1;
|
|
|
+ public Target destination = Target.Color;
|
|
|
+ public string textureId = "_BlitPassTexture";
|
|
|
+ }
|
|
|
+
|
|
|
+ public enum Target {
|
|
|
+ Color,
|
|
|
+ Texture
|
|
|
+ }
|
|
|
+
|
|
|
+ public BlitSettings settings = new BlitSettings();
|
|
|
+ RenderTargetHandle m_RenderTextureHandle;
|
|
|
+
|
|
|
+ BlitPass blitPass;
|
|
|
+
|
|
|
+ public override void Create() {
|
|
|
+ var passIndex = settings.blitMaterial != null ? settings.blitMaterial.passCount - 1 : 1;
|
|
|
+ settings.blitMaterialPassIndex = Mathf.Clamp(settings.blitMaterialPassIndex, -1, passIndex);
|
|
|
+ blitPass = new BlitPass(settings.Event, settings.blitMaterial, settings.blitMaterialPassIndex, name);
|
|
|
+ m_RenderTextureHandle.Init(settings.textureId);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
|
|
|
+ {
|
|
|
+ var src = renderer.cameraColorTargetHandle;
|
|
|
+ var dest = (settings.destination == Target.Color) ? RenderTargetHandle.CameraTarget : m_RenderTextureHandle;
|
|
|
+ blitPass.Setup(src, dest);
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) {
|
|
|
+
|
|
|
+
|
|
|
+ if (settings.blitMaterial == null) {
|
|
|
+ Debug.LogWarningFormat("Missing Blit Material. {0} blit pass will not execute. Check for missing reference in the assigned renderer.", GetType().Name);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!renderingData.cameraData.camera.tag.Equals("MainCamera"))
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ renderer.EnqueuePass(blitPass);
|
|
|
+ }
|
|
|
+}
|