OutlineCustomPass.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using EPOOutline;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using UnityEngine.Rendering;
  7. #if HDRP_OUTLINE
  8. using UnityEngine.Rendering.HighDefinition;
  9. [VolumeComponentMenu("EPO/Outline")]
  10. public class OutlineCustomPass : CustomPass
  11. {
  12. private List<Outlinable> tempOutlinables = new List<Outlinable>();
  13. private Queue<OutlineParameters> pool = new Queue<OutlineParameters>();
  14. private Queue<OutlineParameters> parametersInUse = new Queue<OutlineParameters>();
  15. private List<Outliner> outliners = new List<Outliner>();
  16. [SerializeField]
  17. [HideInInspector]
  18. private Camera lastSelectedCamera = null;
  19. protected override void Execute(ScriptableRenderContext renderContext, CommandBuffer cmd, HDCamera hdCamera, CullingResults cullingResult)
  20. {
  21. var camera = hdCamera.camera;
  22. if (outliners == null)
  23. outliners = new List<Outliner>();
  24. outliners.Clear();
  25. #if UNITY_EDITOR
  26. if (camera.cameraType == CameraType.SceneView)
  27. {
  28. if (lastSelectedCamera == null)
  29. {
  30. foreach (var obj in UnityEditor.Selection.gameObjects)
  31. {
  32. lastSelectedCamera = obj.GetComponent<Camera>();
  33. if (lastSelectedCamera != null)
  34. lastSelectedCamera.GetComponents(outliners);
  35. if (outliners.Count != 0)
  36. break;
  37. else
  38. lastSelectedCamera = null;
  39. }
  40. }
  41. outliners.Clear();
  42. if (lastSelectedCamera != null)
  43. lastSelectedCamera.GetComponents(outliners);
  44. }
  45. else
  46. #endif
  47. camera.GetComponents(outliners);
  48. foreach (var outliner in outliners)
  49. UpdateOutliner(renderContext, cmd, camera, outliner, hdCamera);
  50. if (parametersInUse != null)
  51. {
  52. foreach (var param in parametersInUse)
  53. pool.Enqueue(param);
  54. parametersInUse.Clear();
  55. }
  56. }
  57. private void SetViewport(RTHandle buffer, OutlineParameters parameters)
  58. {
  59. var dynamicScale = 1.0f;
  60. if (parameters.Camera.allowDynamicResolution && DynamicResolutionHandler.instance != null && DynamicResolutionHandler.instance.DynamicResolutionEnabled())
  61. dynamicScale = DynamicResolutionHandler.instance.GetCurrentScale();
  62. var scaled = buffer.GetScaledSize(buffer.rtHandleProperties.currentViewportSize);
  63. parameters.CustomViewport = buffer.useScaling ?
  64. new Rect(Vector2.zero, scaled) :
  65. (Rect?)null;
  66. }
  67. private void UpdateOutliner(ScriptableRenderContext renderContext, CommandBuffer cmd, Camera camera, Outliner outlineEffect, HDCamera hdCamera)
  68. {
  69. if (outlineEffect == null || !outlineEffect.enabled)
  70. return;
  71. if (pool == null)
  72. pool = new Queue<OutlineParameters>();
  73. if (parametersInUse == null)
  74. parametersInUse = new Queue<OutlineParameters>();
  75. if (pool.Count == 0)
  76. pool.Enqueue(new OutlineParameters());
  77. var parameters = pool.Dequeue();
  78. parametersInUse.Enqueue(parameters);
  79. parameters.Buffer = cmd;
  80. outlineEffect.UpdateSharedParameters(parameters, camera, camera.cameraType == CameraType.SceneView);
  81. Outlinable.GetAllActiveOutlinables(parameters.Camera, parameters.OutlinablesToRender);
  82. RendererFilteringUtility.Filter(parameters.Camera, parameters);
  83. parameters.Buffer.EnableShaderKeyword("EPO_HDRP");
  84. var historyProperties = hdCamera.historyRTHandleProperties;
  85. var scale = new Vector4(
  86. (float)historyProperties.currentViewportSize.x - (float)historyProperties.currentRenderTargetSize.x,
  87. (float)historyProperties.currentViewportSize.y - (float)historyProperties.currentRenderTargetSize.y,
  88. (float)historyProperties.currentViewportSize.x / (float)historyProperties.currentRenderTargetSize.x,
  89. (float)historyProperties.currentViewportSize.y / (float)historyProperties.currentRenderTargetSize.y);
  90. parameters.Buffer.SetGlobalVector(OutlineEffect.ScaleHash, scale);
  91. if (outlineEffect.RenderingStrategy == OutlineRenderingStrategy.Default)
  92. {
  93. outlineEffect.UpdateSharedParameters(parameters, camera, camera.cameraType == CameraType.SceneView);
  94. parameters.PrimaryBufferScale = 1.0f;
  95. RTHandle colorTarget;
  96. RTHandle depthTarget;
  97. GetCameraBuffers(out colorTarget, out depthTarget);
  98. parameters.Scale = colorTarget.rtHandleProperties.rtHandleScale;
  99. SetViewport(colorTarget, parameters);
  100. parameters.Target = colorTarget;
  101. parameters.DepthTarget = depthTarget;
  102. parameters.TargetWidth = colorTarget.rt.width;
  103. parameters.TargetHeight = colorTarget.rt.height;
  104. parameters.Antialiasing = colorTarget.rt.antiAliasing;
  105. parameters.Prepare();
  106. OutlineEffect.SetupOutline(parameters);
  107. renderContext.ExecuteCommandBuffer(parameters.Buffer);
  108. parameters.Buffer.Clear();
  109. }
  110. else
  111. {
  112. if (tempOutlinables == null)
  113. tempOutlinables = new List<Outlinable>();
  114. tempOutlinables.Clear();
  115. tempOutlinables.AddRange(parameters.OutlinablesToRender);
  116. foreach (var outlinable in tempOutlinables)
  117. {
  118. outlineEffect.UpdateSharedParameters(parameters, camera, camera.cameraType == CameraType.SceneView);
  119. RTHandle colorTarget;
  120. RTHandle depthTarget;
  121. GetCameraBuffers(out colorTarget, out depthTarget);
  122. parameters.Scale = colorTarget.rtHandleProperties.rtHandleScale;
  123. SetViewport(colorTarget, parameters);
  124. parameters.Target = colorTarget;
  125. parameters.DepthTarget = depthTarget;
  126. parameters.TargetWidth = colorTarget.rt.width;
  127. parameters.TargetHeight = colorTarget.rt.height;
  128. parameters.Antialiasing = colorTarget.rt.antiAliasing;
  129. parameters.OutlinablesToRender.Clear();
  130. parameters.OutlinablesToRender.Add(outlinable);
  131. parameters.BlitMesh = null;
  132. parameters.Prepare();
  133. cmd.SetViewport(new Rect(Vector2.zero, colorTarget.rtHandleProperties.currentViewportSize));
  134. OutlineEffect.SetupOutline(parameters);
  135. renderContext.ExecuteCommandBuffer(parameters.Buffer);
  136. parameters.Buffer.Clear();
  137. }
  138. parameters.MeshPool.ReleaseAllMeshes();
  139. }
  140. parameters.Buffer.Clear();
  141. }
  142. }
  143. #endif