Blit.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.Rendering.Universal;
  4. // Saved in Blit.cs
  5. public class Blit : ScriptableRendererFeature {
  6. public class BlitPass : ScriptableRenderPass {
  7. public enum RenderTarget {
  8. Color,
  9. RenderTexture,
  10. }
  11. public Material blitMaterial = null;
  12. public int blitShaderPassIndex = 0;
  13. public FilterMode filterMode { get; set; }
  14. private RenderTargetIdentifier source { get; set; }
  15. private RenderTargetHandle destination { get; set; }
  16. RenderTargetHandle m_TemporaryColorTexture;
  17. string m_ProfilerTag;
  18. public BlitPass(RenderPassEvent renderPassEvent, Material blitMaterial, int blitShaderPassIndex, string tag) {
  19. this.renderPassEvent = renderPassEvent;
  20. this.blitMaterial = blitMaterial;
  21. this.blitShaderPassIndex = blitShaderPassIndex;
  22. m_ProfilerTag = tag;
  23. m_TemporaryColorTexture.Init("_TemporaryColorTexture");
  24. }
  25. public void Setup(RenderTargetIdentifier source, RenderTargetHandle destination) {
  26. this.source = source;
  27. this.destination = destination;
  28. }
  29. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) {
  30. CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
  31. RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor;
  32. opaqueDesc.depthBufferBits = 0;
  33. // Can't read and write to same color target, use a TemporaryRT
  34. if (destination == RenderTargetHandle.CameraTarget) {
  35. cmd.GetTemporaryRT(m_TemporaryColorTexture.id, opaqueDesc, filterMode);
  36. Blit(cmd, source, m_TemporaryColorTexture.Identifier(), blitMaterial, blitShaderPassIndex);
  37. Blit(cmd, m_TemporaryColorTexture.Identifier(), source);
  38. } else {
  39. Blit(cmd, source, destination.Identifier(), blitMaterial, blitShaderPassIndex);
  40. }
  41. context.ExecuteCommandBuffer(cmd);
  42. CommandBufferPool.Release(cmd);
  43. }
  44. public override void FrameCleanup(CommandBuffer cmd) {
  45. if (destination == RenderTargetHandle.CameraTarget)
  46. cmd.ReleaseTemporaryRT(m_TemporaryColorTexture.id);
  47. }
  48. }
  49. [System.Serializable]
  50. public class BlitSettings {
  51. public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques;
  52. public Material blitMaterial = null;
  53. public int blitMaterialPassIndex = -1;
  54. public Target destination = Target.Color;
  55. public string textureId = "_BlitPassTexture";
  56. }
  57. public enum Target {
  58. Color,
  59. Texture
  60. }
  61. public BlitSettings settings = new BlitSettings();
  62. RenderTargetHandle m_RenderTextureHandle;
  63. BlitPass blitPass;
  64. public override void Create() {
  65. var passIndex = settings.blitMaterial != null ? settings.blitMaterial.passCount - 1 : 1;
  66. settings.blitMaterialPassIndex = Mathf.Clamp(settings.blitMaterialPassIndex, -1, passIndex);
  67. blitPass = new BlitPass(settings.Event, settings.blitMaterial, settings.blitMaterialPassIndex, name);
  68. m_RenderTextureHandle.Init(settings.textureId);
  69. }
  70. public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
  71. {
  72. var src = renderer.cameraColorTargetHandle;
  73. var dest = (settings.destination == Target.Color) ? RenderTargetHandle.CameraTarget : m_RenderTextureHandle;
  74. blitPass.Setup(src, dest);
  75. }
  76. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) {
  77. if (settings.blitMaterial == null) {
  78. Debug.LogWarningFormat("Missing Blit Material. {0} blit pass will not execute. Check for missing reference in the assigned renderer.", GetType().Name);
  79. return;
  80. }
  81. if (!renderingData.cameraData.camera.tag.Equals("MainCamera"))
  82. {
  83. return;
  84. }
  85. renderer.EnqueuePass(blitPass);
  86. }
  87. }