123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #if ENVIRO_URP
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.Rendering.Universal;
- using UnityEngine.Rendering;
- namespace Enviro
- {
- public class EnviroURPRenderPass : ScriptableRenderPass
- {
- public ScriptableRenderer scriptableRenderer { get; set; }
-
- private Material blitThroughMat;
- private string passName;
- private List<EnviroVolumetricCloudRenderer> volumetricCloudsRender = new List<EnviroVolumetricCloudRenderer>();
- public EnviroURPRenderPass (string name)
- {
- renderPassEvent = RenderPassEvent.BeforeRenderingTransparents;
- passName = name;
- }
-
- public void CustomBlit(CommandBuffer cmd,Matrix4x4 matrix, RenderTargetIdentifier source, RenderTargetIdentifier target, Material mat, int pass)
- {
-
- cmd.SetGlobalTexture("_MainTex", source);
- cmd.SetRenderTarget(target, 0, CubemapFace.Unknown, -1);
- cmd.DrawMesh(RenderingUtils.fullscreenMesh, matrix, mat,0, pass);
-
- //Blit(cmd,source,target,mat,pass);
- }
-
- public void CustomBlit(CommandBuffer cmd,Matrix4x4 matrix, RenderTargetIdentifier source, RenderTargetIdentifier target, Material mat)
- {
-
- cmd.SetGlobalTexture("_MainTex", source);
- cmd.SetRenderTarget(target, 0, CubemapFace.Unknown, -1);
- cmd.DrawMesh(RenderingUtils.fullscreenMesh, matrix, mat,0);
-
- //Blit(cmd,source,target,mat);
- }
- public void CustomBlit(CommandBuffer cmd,Matrix4x4 matrix, RenderTargetIdentifier source, RenderTargetIdentifier target)
- {
- if(blitThroughMat == null)
- blitThroughMat = new Material(Shader.Find("Hidden/EnviroBlitThrough"));
-
- cmd.SetGlobalTexture("_MainTex", source);
- cmd.SetRenderTarget(target, 0, CubemapFace.Unknown, -1);
- cmd.DrawMesh(RenderingUtils.fullscreenMesh, matrix, blitThroughMat);
-
- //Blit(cmd,source,target);
- }
-
- public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
- {
- ConfigureTarget(scriptableRenderer.cameraColorTarget);
- ConfigureInput(ScriptableRenderPassInput.Depth);
- }
- public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
- {
- if(GetCloudsRenderer(renderingData.cameraData.camera) == null)
- {
- CreateCloudsRenderer(renderingData.cameraData.camera);
- }
- }
-
- private EnviroVolumetricCloudRenderer CreateCloudsRenderer(Camera cam)
- {
- EnviroVolumetricCloudRenderer r = new EnviroVolumetricCloudRenderer();
- r.camera = cam;
- volumetricCloudsRender.Add(r);
- return r;
- }
- private EnviroVolumetricCloudRenderer GetCloudsRenderer(Camera cam)
- {
- for (int i = 0; i < volumetricCloudsRender.Count; i++)
- {
- if(volumetricCloudsRender[i].camera == cam)
- return volumetricCloudsRender[i];
- }
- return CreateCloudsRenderer(cam);
- }
- private void SetMatrix(Camera myCam)
- {
- if (UnityEngine.XR.XRSettings.enabled && UnityEngine.XR.XRSettings.stereoRenderingMode == UnityEngine.XR.XRSettings.StereoRenderingMode.SinglePassInstanced)
- {
- // Both stereo eye inverse view matrices
- Matrix4x4 left_world_from_view = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Left).inverse;
- Matrix4x4 right_world_from_view = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Right).inverse;
- // Both stereo eye inverse projection matrices, plumbed through GetGPUProjectionMatrix to compensate for render texture
- Matrix4x4 left_screen_from_view = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left);
- Matrix4x4 right_screen_from_view = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right);
- Matrix4x4 left_view_from_screen = GL.GetGPUProjectionMatrix(left_screen_from_view, true).inverse;
- Matrix4x4 right_view_from_screen = GL.GetGPUProjectionMatrix(right_screen_from_view, true).inverse;
- // Negate [1,1] to reflect Unity's CBuffer state
- if (SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLCore && SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3)
- {
- left_view_from_screen[1, 1] *= -1;
- right_view_from_screen[1, 1] *= -1;
- }
- Shader.SetGlobalMatrix("_LeftWorldFromView", left_world_from_view);
- Shader.SetGlobalMatrix("_RightWorldFromView", right_world_from_view);
- Shader.SetGlobalMatrix("_LeftViewFromScreen", left_view_from_screen);
- Shader.SetGlobalMatrix("_RightViewFromScreen", right_view_from_screen);
- }
- else
- {
- // Main eye inverse view matrix
- Matrix4x4 left_world_from_view = myCam.cameraToWorldMatrix;
- // Inverse projection matrices, plumbed through GetGPUProjectionMatrix to compensate for render texture
- Matrix4x4 screen_from_view = myCam.projectionMatrix;
- Matrix4x4 left_view_from_screen = GL.GetGPUProjectionMatrix(screen_from_view, true).inverse;
- // Negate [1,1] to reflect Unity's CBuffer state
- if (SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLCore && SystemInfo.graphicsDeviceType != UnityEngine.Rendering.GraphicsDeviceType.OpenGLES3)
- left_view_from_screen[1, 1] *= -1;
- // Store matrices
- Shader.SetGlobalMatrix("_LeftWorldFromView", left_world_from_view);
- Shader.SetGlobalMatrix("_LeftViewFromScreen", left_view_from_screen);
- }
- }
- public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
- {
- if(EnviroManager.instance == null)
- return;
-
- CommandBuffer cmd = CommandBufferPool.Get(passName);
-
- //Set what to render on this camera.
- bool renderVolumetricClouds = false;
- bool renderFog = false;
- if(EnviroManager.instance.VolumetricClouds != null)
- renderVolumetricClouds = EnviroManager.instance.VolumetricClouds.settingsQuality.volumetricClouds;
- if(EnviroManager.instance.Fog != null)
- renderFog = EnviroManager.instance.Fog.Settings.fog;
- //Set some global matrixes used for all the enviro effects.
- SetMatrix(renderingData.cameraData.camera);
-
- //Create temporary texture and blit the camera content.
- RenderTexture sourceTemp = RenderTexture.GetTemporary(renderingData.cameraData.cameraTargetDescriptor);
- CustomBlit(cmd, Matrix4x4.identity,scriptableRenderer.cameraColorTarget, new RenderTargetIdentifier(sourceTemp));
- //Render volumetrics mask first
- if(EnviroManager.instance.Fog != null && renderFog)
- EnviroManager.instance.Fog.RenderVolumetricsURP(renderingData.cameraData.camera,this,cmd,sourceTemp);
- if(EnviroManager.instance.Fog != null && EnviroManager.instance.VolumetricClouds != null && renderVolumetricClouds && renderFog)
- {
- RenderTexture temp1 = RenderTexture.GetTemporary(renderingData.cameraData.cameraTargetDescriptor);
- if(renderingData.cameraData.camera.transform.position.y < EnviroManager.instance.VolumetricClouds.settingsLayer1.bottomCloudsHeight)
- {
- EnviroVolumetricCloudRenderer renderer = GetCloudsRenderer(renderingData.cameraData.camera);
- EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsURP(renderingData,this,cmd, sourceTemp, temp1, renderer, null);
- if(EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadows && renderingData.cameraData.camera.cameraType != CameraType.Reflection)
- {
- RenderTexture temp2 = RenderTexture.GetTemporary(renderingData.cameraData.cameraTargetDescriptor);
- EnviroManager.instance.VolumetricClouds.RenderCloudsShadowsURP(this,renderingData.cameraData.camera,cmd,temp1,temp2,renderer);
- EnviroManager.instance.Fog.RenderHeightFogURP(renderingData.cameraData.camera,this,cmd,temp2,scriptableRenderer.cameraColorTarget);
- RenderTexture.ReleaseTemporary(temp2);
- }
- else
- {
- EnviroManager.instance.Fog.RenderHeightFogURP(renderingData.cameraData.camera,this,cmd,temp1,scriptableRenderer.cameraColorTarget);
- }
- }
- else
- {
- EnviroManager.instance.Fog.RenderHeightFogURP(renderingData.cameraData.camera,this,cmd,sourceTemp,temp1);
- EnviroVolumetricCloudRenderer renderer = GetCloudsRenderer(renderingData.cameraData.camera);
- EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsURP(renderingData,this,cmd, temp1, scriptableRenderer.cameraColorTarget, renderer, null);
- }
- context.ExecuteCommandBuffer(cmd);
- RenderTexture.ReleaseTemporary(temp1);
- }
- else if(EnviroManager.instance.VolumetricClouds != null && renderVolumetricClouds && !renderFog)
- {
- EnviroVolumetricCloudRenderer renderer = GetCloudsRenderer(renderingData.cameraData.camera);
-
- if(EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadows && renderingData.cameraData.camera.cameraType != CameraType.Reflection)
- {
- RenderTexture temp1 = RenderTexture.GetTemporary(renderingData.cameraData.cameraTargetDescriptor);
- EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsURP(renderingData,this,cmd, sourceTemp, temp1, renderer, null);
- EnviroManager.instance.VolumetricClouds.RenderCloudsShadowsURP(this,renderingData.cameraData.camera,cmd,temp1,scriptableRenderer.cameraColorTarget,renderer);
- RenderTexture.ReleaseTemporary(temp1);
- }
- else
- {
- EnviroManager.instance.VolumetricClouds.RenderVolumetricCloudsURP(renderingData,this,cmd, sourceTemp, scriptableRenderer.cameraColorTarget, renderer, null);
- }
- context.ExecuteCommandBuffer(cmd);
-
- }
- else if (Enviro.EnviroManager.instance.Fog != null && renderFog)
- {
- EnviroManager.instance.Fog.RenderHeightFogURP(renderingData.cameraData.camera,this,cmd,sourceTemp,scriptableRenderer.cameraColorTarget);
- context.ExecuteCommandBuffer(cmd);
- }
- else
- {
- //Render Nothing
- }
- //Release source temp render texture
- CommandBufferPool.Release(cmd);
- RenderTexture.ReleaseTemporary(sourceTemp);
- }
- }
- }
- #endif
|