123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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);
- }
- }
|