EnviroHDRPRenderer.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #if ENVIRO_HDRP
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4. using UnityEngine.Rendering.HighDefinition;
  5. using System;
  6. using System.Collections.Generic;
  7. namespace Enviro
  8. {
  9. [Serializable, VolumeComponentMenu("Post-processing/Enviro/Effects Renderer")]
  10. public class EnviroHDRPRenderer : CustomPostProcessVolumeComponent, IPostProcessComponent
  11. {
  12. public bool IsActive() => EnviroManager.instance != null;
  13. public override CustomPostProcessInjectionPoint injectionPoint => (CustomPostProcessInjectionPoint)0;
  14. private Material blitTrough;
  15. private List<EnviroVolumetricCloudRenderer> volumetricCloudsRender = new List<EnviroVolumetricCloudRenderer>();
  16. public override void Setup()
  17. {
  18. if (blitTrough == null)
  19. blitTrough = new Material(Shader.Find("Hidden/Enviro/BlitTroughHDRP"));
  20. }
  21. public override void Cleanup()
  22. {
  23. if (blitTrough != null)
  24. CoreUtils.Destroy(blitTrough);
  25. }
  26. public override void Render(CommandBuffer cmd, HDCamera camera, RTHandle source, RTHandle destination)
  27. {
  28. //Do nothing
  29. if (!EnviroHelper.CanRenderOnCamera(camera.camera) || camera.camera.cameraType == CameraType.Preview)
  30. {
  31. blitTrough.SetTexture("_InputTexture", source);
  32. CoreUtils.DrawFullScreen(cmd, blitTrough);
  33. return;
  34. }
  35. //Set what to render on this camera.
  36. bool renderVolumetricClouds = false;
  37. bool renderFog = false;
  38. if(EnviroManager.instance.VolumetricClouds != null)
  39. renderVolumetricClouds = EnviroManager.instance.VolumetricClouds.settingsQuality.volumetricClouds;
  40. if(EnviroManager.instance.Fog != null)
  41. renderFog = EnviroManager.instance.Fog.Settings.fog;
  42. if (renderVolumetricClouds)
  43. {
  44. //Create us a volumetric clouds renderer if null.
  45. if(GetCloudsRenderer(camera.camera) == null)
  46. {
  47. CreateCloudsRenderer(camera.camera);
  48. }
  49. }
  50. //Set some global matrixes used for all the enviro effects.
  51. SetMatrix(camera.camera);
  52. //Clouds
  53. if(EnviroManager.instance.Fog != null && EnviroManager.instance.VolumetricClouds != null && renderVolumetricClouds && renderFog)
  54. {
  55. RenderTexture temp1 = RenderTexture.GetTemporary(source.rt.descriptor);
  56. RTHandle temp1Handle = RTHandles.Alloc(temp1);
  57. if(camera.camera.transform.position.y < EnviroManager.instance.VolumetricClouds.settingsLayer1.bottomCloudsHeight)
  58. {
  59. EnviroVolumetricCloudRenderer renderer = GetCloudsRenderer(camera.camera);
  60. EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsHDRP(camera.camera,cmd, source, temp1Handle, renderer, null);
  61. if(EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadows && camera.camera.cameraType != CameraType.Reflection)
  62. {
  63. RenderTexture temp2 = RenderTexture.GetTemporary(source.rt.descriptor);
  64. RTHandle temp2Handle = RTHandles.Alloc(temp2);
  65. EnviroManager.instance.VolumetricClouds.RenderCloudsShadowsHDRP(camera.camera,cmd,temp1Handle,temp2Handle,renderer);
  66. EnviroManager.instance.Fog.RenderHeightFogHDRP(camera.camera,cmd,temp2Handle,destination);
  67. RenderTexture.ReleaseTemporary(temp2);
  68. //temp2.Release();
  69. }
  70. else
  71. {
  72. EnviroManager.instance.Fog.RenderHeightFogHDRP(camera.camera,cmd,temp1Handle,destination);
  73. }
  74. }
  75. else
  76. {
  77. EnviroManager.instance.Fog.RenderHeightFogHDRP(camera.camera,cmd,source,temp1Handle);
  78. EnviroVolumetricCloudRenderer renderer = GetCloudsRenderer(camera.camera);
  79. EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsHDRP(camera.camera,cmd, temp1Handle, destination, renderer, null);
  80. }
  81. RenderTexture.ReleaseTemporary(temp1);
  82. //temp1Handle.Release();
  83. }
  84. else if(EnviroManager.instance.VolumetricClouds != null && renderVolumetricClouds && !renderFog)
  85. {
  86. EnviroVolumetricCloudRenderer renderer = GetCloudsRenderer(camera.camera);
  87. if(EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadows && camera.camera.cameraType != CameraType.Reflection)
  88. {
  89. RenderTexture temp1 = RenderTexture.GetTemporary(source.rt.descriptor);
  90. RTHandle temp1Handle = RTHandles.Alloc(temp1);
  91. EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsHDRP(camera.camera,cmd, source, temp1Handle, renderer, null);
  92. EnviroManager.instance.VolumetricClouds.RenderCloudsShadowsHDRP(camera.camera,cmd,temp1Handle,destination,renderer);
  93. RenderTexture.ReleaseTemporary(temp1);
  94. //temp1Handle.Release();
  95. }
  96. else
  97. {
  98. EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsHDRP(camera.camera,cmd, source, destination, renderer, null);
  99. }
  100. }
  101. else if (Enviro.EnviroManager.instance.Fog != null && renderFog)
  102. {
  103. EnviroManager.instance.Fog.RenderHeightFogHDRP(camera.camera,cmd,source,destination);
  104. }
  105. else
  106. {
  107. blitTrough.SetTexture("_InputTexture", source);
  108. CoreUtils.DrawFullScreen(cmd, blitTrough);
  109. }
  110. }
  111. private EnviroVolumetricCloudRenderer CreateCloudsRenderer(Camera cam)
  112. {
  113. EnviroVolumetricCloudRenderer r = new EnviroVolumetricCloudRenderer();
  114. r.camera = cam;
  115. volumetricCloudsRender.Add(r);
  116. return r;
  117. }
  118. private EnviroVolumetricCloudRenderer GetCloudsRenderer(Camera cam)
  119. {
  120. for (int i = 0; i < volumetricCloudsRender.Count; i++)
  121. {
  122. if(volumetricCloudsRender[i].camera == cam)
  123. return volumetricCloudsRender[i];
  124. }
  125. return CreateCloudsRenderer(cam);
  126. }
  127. private void SetMatrix(Camera myCam)
  128. {
  129. if (UnityEngine.XR.XRSettings.enabled && UnityEngine.XR.XRSettings.stereoRenderingMode == UnityEngine.XR.XRSettings.StereoRenderingMode.SinglePassInstanced)
  130. {
  131. // Both stereo eye inverse view matrices
  132. Matrix4x4 left_world_from_view = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Left).inverse;
  133. Matrix4x4 right_world_from_view = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Right).inverse;
  134. // Both stereo eye inverse projection matrices, plumbed through GetGPUProjectionMatrix to compensate for render texture
  135. Matrix4x4 left_screen_from_view = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left);
  136. Matrix4x4 right_screen_from_view = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right);
  137. Matrix4x4 left_view_from_screen = GL.GetGPUProjectionMatrix(left_screen_from_view, true).inverse;
  138. Matrix4x4 right_view_from_screen = GL.GetGPUProjectionMatrix(right_screen_from_view, true).inverse;
  139. // Negate [1,1] to reflect Unity's CBuffer state
  140. if (SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLCore && SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3)
  141. {
  142. left_view_from_screen[1, 1] *= -1;
  143. right_view_from_screen[1, 1] *= -1;
  144. }
  145. Shader.SetGlobalMatrix("_LeftWorldFromView", left_world_from_view);
  146. Shader.SetGlobalMatrix("_RightWorldFromView", right_world_from_view);
  147. Shader.SetGlobalMatrix("_LeftViewFromScreen", left_view_from_screen);
  148. Shader.SetGlobalMatrix("_RightViewFromScreen", right_view_from_screen);
  149. }
  150. else
  151. {
  152. // Main eye inverse view matrix
  153. Matrix4x4 left_world_from_view = myCam.cameraToWorldMatrix;
  154. // Inverse projection matrices, plumbed through GetGPUProjectionMatrix to compensate for render texture
  155. Matrix4x4 screen_from_view = myCam.projectionMatrix;
  156. Matrix4x4 left_view_from_screen = GL.GetGPUProjectionMatrix(screen_from_view, true).inverse;
  157. // Negate [1,1] to reflect Unity's CBuffer state
  158. if (SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLCore && SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3)
  159. left_view_from_screen[1, 1] *= -1;
  160. // Store matrices
  161. Shader.SetGlobalMatrix("_LeftWorldFromView", left_world_from_view);
  162. Shader.SetGlobalMatrix("_LeftViewFromScreen", left_view_from_screen);
  163. }
  164. }
  165. }
  166. }
  167. #endif