| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 | using System.Collections;using System.Collections.Generic;using UnityEngine;namespace Enviro{    [ExecuteInEditMode]     [ImageEffectAllowedInSceneView]    public class EnviroRenderer : MonoBehaviour    {        [Tooltip("Assign a quality here if you want to use different settings for this camera. Otherwise it takes settings from Enviro Manager.")]        public EnviroQuality myQuality;        private Camera myCam;        private EnviroVolumetricCloudRenderer volumetricCloudsRender;        void OnEnable()        {            myCam = GetComponent<Camera>();        }        void OnDisable ()        {             CleanupVolumetricRenderer();        }        private void CleanupVolumetricRenderer()        {            if(volumetricCloudsRender != null)            {                if(volumetricCloudsRender.raymarchMat != null)                    DestroyImmediate(volumetricCloudsRender.raymarchMat);                if(volumetricCloudsRender.blendAndLightingMat != null)                    DestroyImmediate(volumetricCloudsRender.blendAndLightingMat);                if(volumetricCloudsRender.reprojectMat != null)                    DestroyImmediate(volumetricCloudsRender.reprojectMat);                if(volumetricCloudsRender.undersampleBuffer != null)                    DestroyImmediate(volumetricCloudsRender.undersampleBuffer);                                if(volumetricCloudsRender.fullBuffer != null && volumetricCloudsRender.fullBuffer.Length > 0)                    {                         for (int i = 0; i < volumetricCloudsRender.fullBuffer.Length; i++)                        {                            if(volumetricCloudsRender.fullBuffer[i] != null)                                DestroyImmediate(volumetricCloudsRender.fullBuffer[i]);                        }                                         }                        }         }        private void SetMatrix()        {            if (myCam.stereoEnabled)            {                // 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);            }        }         private Material shadowMat;        [ImageEffectOpaque]        private void OnRenderImage(RenderTexture src, RenderTexture dest)         {               if(EnviroManager.instance == null)            {                Graphics.Blit(src,dest);                return;            }            if(myCam == null)               myCam = GetComponent<Camera>();            if (myCam.actualRenderingPath == RenderingPath.Forward)                myCam.depthTextureMode |= DepthTextureMode.Depth;              //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;            ////////Rendering//////////            SetMatrix();              if(volumetricCloudsRender == null)               volumetricCloudsRender = new EnviroVolumetricCloudRenderer();            //Render volumetrics mask first            if(EnviroManager.instance.Fog != null && renderFog)               EnviroManager.instance.Fog.RenderVolumetrics(myCam, src);            if(EnviroManager.instance.Fog != null && EnviroManager.instance.VolumetricClouds != null && renderVolumetricClouds && renderFog)            {                 //Change the order of clouds and fog                RenderTexture temp = RenderTexture.GetTemporary(src.descriptor);                RenderTexture temp2 = RenderTexture.GetTemporary(src.descriptor);                if(myCam.transform.position.y < EnviroManager.instance.VolumetricClouds.settingsLayer1.bottomCloudsHeight)                {                    EnviroManager.instance.VolumetricClouds.RenderVolumetricClouds(myCam, src, temp, volumetricCloudsRender, myQuality);                                        if(EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadows && myCam.cameraType != CameraType.Reflection)                    {                        EnviroManager.instance.VolumetricClouds.RenderCloudsShadows(temp,temp2,volumetricCloudsRender);                        EnviroManager.instance.Fog.RenderHeightFog(myCam,temp2,dest);                    }                    else                     {                        EnviroManager.instance.Fog.RenderHeightFog(myCam,temp,dest);                    }                }                else                {                    EnviroManager.instance.Fog.RenderHeightFog(myCam,src,temp);                    EnviroManager.instance.VolumetricClouds.RenderVolumetricClouds(myCam,temp,dest,volumetricCloudsRender,myQuality);                    }                RenderTexture.ReleaseTemporary(temp);                RenderTexture.ReleaseTemporary(temp2);            }            else if(EnviroManager.instance.VolumetricClouds != null && renderVolumetricClouds && !renderFog)            {                if(EnviroManager.instance.VolumetricClouds.settingsGlobal.cloudShadows && myCam.cameraType != CameraType.Reflection)                {                    RenderTexture temp = RenderTexture.GetTemporary(src.descriptor);                    EnviroManager.instance.VolumetricClouds.RenderVolumetricClouds(myCam,src,temp,volumetricCloudsRender, myQuality);                    EnviroManager.instance.VolumetricClouds.RenderCloudsShadows(temp,dest,volumetricCloudsRender);                    RenderTexture.ReleaseTemporary(temp);                }                else                {                    EnviroManager.instance.VolumetricClouds.RenderVolumetricClouds(myCam,src,dest,volumetricCloudsRender, myQuality);                }                            }             else if (Enviro.EnviroManager.instance.Fog != null && renderFog)            {                EnviroManager.instance.Fog.RenderHeightFog(myCam,src,dest);            }            else            {                Graphics.Blit(src,dest);            }        }    }}
 |