#if ENVIRO_LWRP && ENVIRO_HD namespace UnityEngine.Rendering.LWRP { /// /// Copy the given color buffer to the given destination color buffer. /// /// You can use this pass to copy a color buffer to the destination, /// so you can use it later in rendering. For example, you can copy /// the opaque texture to use it for distortion effects. /// internal class EnviroBlitPassVolumeClouds : UnityEngine.Rendering.Universal.ScriptableRenderPass { private Camera myCam; public Material cloudsMat = null; public Material blitMat = null; private Material compose; private Material downsample; private Material blitThrough; public FilterMode filterMode { get; set; } private UnityEngine.Rendering.Universal.ScriptableRenderer renderer { get; set; } private UnityEngine.Rendering.Universal.RenderTargetHandle destination { get; set; } #region Clouds Var private EnviroHaltonSequence sequence = new EnviroHaltonSequence() { radix = 3 }; private RenderTexture subFrameTex; private RenderTexture prevFrameTex; private Matrix4x4 projection; private Matrix4x4 projectionSPVR; private Matrix4x4 inverseRotation; private Matrix4x4 inverseRotationSPVR; private Matrix4x4 rotation; private Matrix4x4 rotationSPVR; private Matrix4x4 previousRotation; private Matrix4x4 previousRotationSPVR; [HideInInspector] public EnviroVolumeCloudsQualitySettings.ReprojectionPixelSize currentReprojectionPixelSize; private int reprojectionPixelSize; private bool isFirstFrame; private int subFrameNumber; private int[] frameList; private int renderingCounter; private int subFrameWidth; private int subFrameHeight; private int frameWidth; private int frameHeight; private bool textureDimensionChanged; #endregion UnityEngine.Rendering.Universal.RenderTargetHandle m_TemporaryColorTexture; string m_ProfilerTag; public void CustomBlit(CommandBuffer cmd, RenderTargetIdentifier source, RenderTargetIdentifier target, Material mat) { cmd.SetGlobalTexture("_MainTex", source); cmd.SetRenderTarget(target, 0, CubemapFace.Unknown, -1); cmd.DrawMesh(UnityEngine.Rendering.Universal.RenderingUtils.fullscreenMesh, Matrix4x4.identity, mat); } public void CustomBlit(CommandBuffer cmd, RenderTargetIdentifier source, RenderTargetIdentifier target, Material mat, int pass) { cmd.SetGlobalTexture("_MainTex", source); cmd.SetRenderTarget(target, 0, CubemapFace.Unknown, -1); cmd.DrawMesh(UnityEngine.Rendering.Universal.RenderingUtils.fullscreenMesh, Matrix4x4.identity, mat,0,pass); } public void CustomBlit(CommandBuffer cmd, RenderTargetIdentifier source, RenderTargetIdentifier target) { if(blitThrough == null) blitThrough = new Material(Shader.Find("Hidden/EnviroBlitThrough")); cmd.SetGlobalTexture("_MainTex", source); cmd.SetRenderTarget(target, 0, CubemapFace.Unknown, -1); cmd.DrawMesh(UnityEngine.Rendering.Universal.RenderingUtils.fullscreenMesh, Matrix4x4.identity, blitThrough); } public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { ConfigureTarget(renderer.cameraColorTarget); ConfigureInput(UnityEngine.Rendering.Universal.ScriptableRenderPassInput.Depth); } /// /// Create the CopyColorPass /// public EnviroBlitPassVolumeClouds(UnityEngine.Rendering.Universal.RenderPassEvent renderPassEvent,Material cloudsMaterial, Material blitMaterial,Material composeMaterial, Material downsampleMaterial, string tag) { this.renderPassEvent = renderPassEvent; this.blitMat = blitMaterial; this.cloudsMat = cloudsMaterial; this.compose = composeMaterial; this.downsample = downsampleMaterial; m_ProfilerTag = tag; m_TemporaryColorTexture.Init("_TemporaryColorTexture"); if (EnviroSky.instance != null) SetReprojectionPixelSize(EnviroSky.instance.cloudsSettings.cloudsQualitySettings.reprojectionPixelSize); } /// /// Configure the pass with the source and destination to execute on. /// /// Source Render Target /// Destination Render Target public void Setup(UnityEngine.Rendering.Universal.ScriptableRenderer renderer, UnityEngine.Rendering.Universal.RenderTargetHandle destination, Camera cam) { this.renderer = renderer; this.destination = destination; this.myCam = cam; } #region Volume Clouds Functions ////////// Clouds Functions /////////////// private void SetCloudProperties(UnityEngine.Rendering.Universal.RenderingData renderingData) { if (EnviroSky.instance.cloudsSettings.cloudsQualitySettings.baseQuality == EnviroVolumeCloudsQualitySettings.CloudDetailQuality.Low) cloudsMat.SetTexture("_Noise", EnviroSky.instance.ressources.noiseTexture); else cloudsMat.SetTexture("_Noise", EnviroSky.instance.ressources.noiseTextureHigh); if (EnviroSky.instance.cloudsSettings.cloudsQualitySettings.detailQuality == EnviroVolumeCloudsQualitySettings.CloudDetailQuality.Low) cloudsMat.SetTexture("_DetailNoise", EnviroSky.instance.ressources.detailNoiseTexture); else cloudsMat.SetTexture("_DetailNoise", EnviroSky.instance.ressources.detailNoiseTextureHigh); if (EnviroSky.instance.floatingPointOriginAnchor != null) EnviroSky.instance.floatingPointOriginMod = EnviroSky.instance.floatingPointOriginAnchor.position; cloudsMat.SetVector("_CameraPosition", myCam.transform.position - EnviroSky.instance.floatingPointOriginMod); if(UnityEngine.XR.XRSettings.enabled && EnviroSky.instance.singlePassInstancedVR && renderingData.cameraData.cameraType == CameraType.Game && Application.isPlaying) { projection = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left); cloudsMat.SetMatrix("_InverseProjection", projection.inverse); inverseRotation = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Left).inverse; cloudsMat.SetMatrix("_InverseRotation", inverseRotation); Matrix4x4 inverseProjectionRightSP = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right).inverse; cloudsMat.SetMatrix("_InverseProjection_SP", inverseProjectionRightSP); inverseRotationSPVR = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Right).inverse; cloudsMat.SetMatrix("_InverseRotation_SP", inverseRotationSPVR); } else { if(UnityEngine.XR.XRSettings.enabled) { projection = renderingData.cameraData.GetProjectionMatrix(); Matrix4x4 inverseProjection = projection.inverse; cloudsMat.SetMatrix("_InverseProjection", inverseProjection); inverseRotation = myCam.cameraToWorldMatrix; cloudsMat.SetMatrix("_InverseRotation", inverseRotation); } else { projection = myCam.projectionMatrix; Matrix4x4 inverseProjection = projection.inverse; cloudsMat.SetMatrix("_InverseProjection", inverseProjection); inverseRotation = myCam.cameraToWorldMatrix; cloudsMat.SetMatrix("_InverseRotation", inverseRotation); } } //Weather Map if (EnviroSky.instance.cloudsSettings.customWeatherMap == null) cloudsMat.SetTexture("_WeatherMap", EnviroSky.instance.weatherMap); else cloudsMat.SetTexture("_WeatherMap", EnviroSky.instance.cloudsSettings.customWeatherMap); //Curl Noise if (EnviroSky.instance.cloudsSettings.cloudsQualitySettings.useCurlNoise) { cloudsMat.EnableKeyword("ENVIRO_CURLNOISE"); cloudsMat.SetTexture("_CurlNoise", EnviroSky.instance.ressources.curlMap); } else { cloudsMat.DisableKeyword("ENVIRO_CURLNOISE"); } //Optimizations if (EnviroSky.instance.cloudsSettings.useHaltonRaymarchOffset) { cloudsMat.EnableKeyword("ENVIRO_HALTONOFFSET"); cloudsMat.SetFloat("_RaymarchOffset", sequence.Get()); cloudsMat.SetVector("_TexelSize", subFrameTex.texelSize); } else { cloudsMat.DisableKeyword("ENVIRO_HALTONOFFSET"); } //RaymarchOffset if (!EnviroSky.instance.cloudsSettings.useLessSteps) cloudsMat.SetVector("_Steps", new Vector4(EnviroSky.instance.cloudsSettings.cloudsQualitySettings.raymarchSteps * EnviroSky.instance.cloudsConfig.raymarchingScale, EnviroSky.instance.cloudsSettings.cloudsQualitySettings.raymarchSteps * EnviroSky.instance.cloudsConfig.raymarchingScale, 0.0f, 0.0f)); else cloudsMat.SetVector("_Steps", new Vector4((EnviroSky.instance.cloudsSettings.cloudsQualitySettings.raymarchSteps * EnviroSky.instance.cloudsConfig.raymarchingScale) * 0.75f, (EnviroSky.instance.cloudsSettings.cloudsQualitySettings.raymarchSteps * EnviroSky.instance.cloudsConfig.raymarchingScale) * 0.75f, 0.0f, 0.0f)); cloudsMat.SetFloat("_BaseNoiseUV", EnviroSky.instance.cloudsSettings.cloudsQualitySettings.baseNoiseUV); cloudsMat.SetFloat("_DetailNoiseUV", EnviroSky.instance.cloudsSettings.cloudsQualitySettings.detailNoiseUV); cloudsMat.SetFloat("_AmbientSkyColorIntensity", EnviroSky.instance.cloudsSettings.ambientLightIntensity.Evaluate(EnviroSky.instance.GameTime.solarTime)); cloudsMat.SetVector("_CloudsLighting", new Vector4(EnviroSky.instance.cloudsConfig.scatteringCoef, EnviroSky.instance.cloudsSettings.hgPhase, EnviroSky.instance.cloudsSettings.silverLiningIntensity, EnviroSky.instance.cloudsSettings.silverLiningSpread.Evaluate(EnviroSky.instance.GameTime.solarTime))); cloudsMat.SetVector("_CloudsLightingExtended", new Vector4(EnviroSky.instance.cloudsConfig.edgeDarkness, EnviroSky.instance.cloudsConfig.ambientSkyColorIntensity, EnviroSky.instance.tonemapping ? 0f : 1f, EnviroSky.instance.cloudsSettings.cloudsExposure)); cloudsMat.SetColor("_AmbientLightColor", EnviroSky.instance.cloudsSettings.volumeCloudsAmbientColor.Evaluate(EnviroSky.instance.GameTime.solarTime)); float bottomH = EnviroSky.instance.cloudsSettings.cloudsQualitySettings.bottomCloudHeight + EnviroSky.instance.cloudsSettings.cloudsHeightMod; float topH = EnviroSky.instance.cloudsSettings.cloudsQualitySettings.topCloudHeight + EnviroSky.instance.cloudsSettings.cloudsHeightMod; cloudsMat.SetVector("_CloudsParameter", new Vector4(bottomH, topH, 1 / (topH - bottomH), EnviroSky.instance.cloudsSettings.cloudsWorldScale * 10)); if (EnviroSky.instance.cloudsSettings.useLessSteps) cloudsMat.SetVector("_CloudDensityScale", new Vector4(EnviroSky.instance.cloudsConfig.density * 1.5f, EnviroSky.instance.cloudsConfig.lightStepModifier, EnviroSky.instance.GameTime.dayNightSwitch, EnviroSky.instance.GameTime.solarTime)); else cloudsMat.SetVector("_CloudDensityScale", new Vector4(EnviroSky.instance.cloudsConfig.density, EnviroSky.instance.cloudsConfig.lightStepModifier, EnviroSky.instance.GameTime.dayNightSwitch, EnviroSky.instance.GameTime.solarTime)); cloudsMat.SetFloat("_CloudsType", EnviroSky.instance.cloudsConfig.cloudType); cloudsMat.SetVector("_CloudsCoverageSettings", new Vector4(EnviroSky.instance.cloudsConfig.coverage * EnviroSky.instance.cloudsSettings.globalCloudCoverage, EnviroSky.instance.cloudsConfig.lightAbsorbtion, EnviroSky.instance.cloudsSettings.cloudsQualitySettings.transmissionToExit, 0f)); cloudsMat.SetVector("_CloudsAnimation", new Vector4(EnviroSky.instance.cloudAnim.x, EnviroSky.instance.cloudAnim.y, EnviroSky.instance.cloudsSettings.cloudsWindDirectionX, EnviroSky.instance.cloudsSettings.cloudsWindDirectionY)); cloudsMat.SetColor("_LightColor", EnviroSky.instance.cloudsSettings.volumeCloudsColor.Evaluate(EnviroSky.instance.GameTime.solarTime)); cloudsMat.SetColor("_MoonLightColor", EnviroSky.instance.cloudsSettings.volumeCloudsMoonColor.Evaluate(EnviroSky.instance.GameTime.lunarTime)); cloudsMat.SetFloat("_stepsInDepth", EnviroSky.instance.cloudsSettings.cloudsQualitySettings.stepsInDepthModificator); cloudsMat.SetFloat("_LODDistance", EnviroSky.instance.cloudsSettings.cloudsQualitySettings.lodDistance); if (EnviroSky.instance.lightSettings.directionalLightMode == EnviroLightSettings.LightingMode.Dual) { if (EnviroSky.instance.GameTime.dayNightSwitch < EnviroSky.instance.GameTime.solarTime) cloudsMat.SetVector("_LightDir", -EnviroSky.instance.Components.DirectLight.transform.forward); else if (EnviroSky.instance.Components.AdditionalDirectLight != null) cloudsMat.SetVector("_LightDir", -EnviroSky.instance.Components.AdditionalDirectLight.transform.forward); } else cloudsMat.SetVector("_LightDir", -EnviroSky.instance.Components.DirectLight.transform.forward); cloudsMat.SetFloat("_LightIntensity", EnviroSky.instance.cloudsSettings.lightIntensity.Evaluate(EnviroSky.instance.GameTime.solarTime)); cloudsMat.SetVector("_CloudsErosionIntensity", new Vector4(1f - EnviroSky.instance.cloudsConfig.baseErosionIntensity, EnviroSky.instance.cloudsConfig.detailErosionIntensity, EnviroSky.instance.cloudsSettings.attenuationClamp.Evaluate(EnviroSky.instance.GameTime.solarTime), EnviroSky.instance.cloudAnim.z)); // cloudsMat.SetTexture("_BlueNoise", blueNoise); // cloudsMat.SetVector("_Randomness", new Vector4(UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value, UnityEngine.Random.value)); } private void SetBlitmaterialProperties() { Matrix4x4 inverseProjection = projection.inverse; blitMat.SetMatrix("_PreviousRotation", previousRotation); blitMat.SetMatrix("_Projection", projection); blitMat.SetMatrix("_InverseRotation", inverseRotation); blitMat.SetMatrix("_InverseProjection", inverseProjection); if (UnityEngine.XR.XRSettings.enabled) { Matrix4x4 inverseProjectionSPVR = projectionSPVR.inverse; blitMat.SetMatrix("_PreviousRotationSPVR", previousRotationSPVR); blitMat.SetMatrix("_ProjectionSPVR", projectionSPVR); blitMat.SetMatrix("_InverseRotationSPVR", inverseRotationSPVR); blitMat.SetMatrix("_InverseProjectionSPVR", inverseProjectionSPVR); } blitMat.SetFloat("_FrameNumber", subFrameNumber); blitMat.SetFloat("_ReprojectionPixelSize", reprojectionPixelSize); blitMat.SetVector("_SubFrameDimension", new Vector2(subFrameWidth, subFrameHeight)); blitMat.SetVector("_FrameDimension", new Vector2(frameWidth, frameHeight)); } RenderTexture DownsampleDepth(CommandBuffer cmd,RenderTextureDescriptor desc, Texture src, Material mat, int downsampleFactor) { int X = desc.width; int Y = desc.height; Vector2 offset = new Vector2(1.0f / X, 1.0f / Y); X /= downsampleFactor; Y /= downsampleFactor; RenderTextureDescriptor lowDepthDescr = desc; lowDepthDescr.width = X; lowDepthDescr.height = Y; lowDepthDescr.depthBufferBits = 0; RenderTexture lowDepth = RenderTexture.GetTemporary(lowDepthDescr); mat.SetVector("_PixelSize", offset); //Graphics.Blit(src, lowDepth, mat); RenderTargetIdentifier srcID = new RenderTargetIdentifier(src); RenderTargetIdentifier lowDepthID = new RenderTargetIdentifier(lowDepth); mat.EnableKeyword("ENVIROURP"); CustomBlit(cmd,srcID,lowDepthID,mat); return lowDepth; } private void CreateCloudsRenderTextures(RenderTextureDescriptor d) { if (subFrameTex != null) { MonoBehaviour.DestroyImmediate(subFrameTex); subFrameTex = null; } if (prevFrameTex != null) { MonoBehaviour.DestroyImmediate(prevFrameTex); prevFrameTex = null; } RenderTextureFormat format = myCam.allowHDR ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default; if (subFrameTex == null) { RenderTextureDescriptor desc = d; desc.width = subFrameWidth; desc.height = subFrameHeight; desc.depthBufferBits = 0; desc.graphicsFormat = Experimental.Rendering.GraphicsFormat.R16G16B16A16_SFloat; subFrameTex = new RenderTexture(desc); subFrameTex.filterMode = FilterMode.Bilinear; subFrameTex.hideFlags = HideFlags.HideAndDontSave; isFirstFrame = true; } if (prevFrameTex == null) { RenderTextureDescriptor desc = d; desc.width = frameWidth; desc.height = frameHeight; desc.depthBufferBits = 0; desc.graphicsFormat = Experimental.Rendering.GraphicsFormat.R16G16B16A16_SFloat; prevFrameTex = new RenderTexture(desc); prevFrameTex.filterMode = FilterMode.Bilinear; prevFrameTex.hideFlags = HideFlags.HideAndDontSave; isFirstFrame = true; } } private void SetReprojectionPixelSize(EnviroVolumeCloudsQualitySettings.ReprojectionPixelSize pSize) { switch (pSize) { case EnviroVolumeCloudsQualitySettings.ReprojectionPixelSize.Off: reprojectionPixelSize = 1; break; case EnviroVolumeCloudsQualitySettings.ReprojectionPixelSize.Low: reprojectionPixelSize = 2; break; case EnviroVolumeCloudsQualitySettings.ReprojectionPixelSize.Medium: reprojectionPixelSize = 4; break; case EnviroVolumeCloudsQualitySettings.ReprojectionPixelSize.High: reprojectionPixelSize = 8; break; } frameList = CalculateFrames(reprojectionPixelSize); } private void StartFrame(UnityEngine.Rendering.Universal.RenderingData renderingData) { textureDimensionChanged = UpdateFrameDimensions(renderingData.cameraData.cameraTargetDescriptor); switch (myCam.stereoActiveEye) { case Camera.MonoOrStereoscopicEye.Mono: if(UnityEngine.XR.XRSettings.enabled && renderingData.cameraData.cameraType == CameraType.Game && Application.isPlaying) { projection = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left); rotation = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Left); inverseRotation = rotation.inverse; projectionSPVR = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right); rotationSPVR = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Right); inverseRotationSPVR = rotationSPVR.inverse; } else { projection = myCam.projectionMatrix; rotation = myCam.worldToCameraMatrix; inverseRotation = myCam.cameraToWorldMatrix; projectionSPVR = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right); rotationSPVR = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Right); inverseRotationSPVR = myCam.cameraToWorldMatrix; } break; case Camera.MonoOrStereoscopicEye.Left: projection = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left); rotation = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Left); inverseRotation = rotation.inverse; projectionSPVR = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right); rotationSPVR = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Right); inverseRotationSPVR = rotationSPVR.inverse; break; case Camera.MonoOrStereoscopicEye.Right: projection = myCam.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right); rotation = myCam.GetStereoViewMatrix(Camera.StereoscopicEye.Right); inverseRotation = rotation.inverse; break; } //projection = renderingData.cameraData.GetGPUProjectionMatrix(); //rotation = renderingData.cameraData.GetViewMatrix(); //inverseRotation = rotation.inverse; //projectionSPVR = renderingData.cameraData.GetGPUProjectionMatrix(); //rotationSPVR = renderingData.cameraData.GetViewMatrix(); //inverseRotationSPVR = rotationSPVR.inverse; } private void FinalizeFrame() { renderingCounter++; previousRotation = rotation; previousRotationSPVR = rotationSPVR; int reproSize = reprojectionPixelSize * reprojectionPixelSize; subFrameNumber = frameList[renderingCounter % reproSize]; } private bool UpdateFrameDimensions(RenderTextureDescriptor descriptor) { //Add downsampling int newFrameWidth = descriptor.width / EnviroSky.instance.cloudsSettings.cloudsQualitySettings.cloudsRenderResolution; int newFrameHeight = descriptor.height / EnviroSky.instance.cloudsSettings.cloudsQualitySettings.cloudsRenderResolution; //Reset temporal reprojection size when zero. Needed if SkyManager starts deactivated if (EnviroSky.instance != null && reprojectionPixelSize == 0) SetReprojectionPixelSize(EnviroSky.instance.cloudsSettings.cloudsQualitySettings.reprojectionPixelSize); //Calculate new frame width and height while (newFrameWidth % reprojectionPixelSize != 0) { newFrameWidth++; } while (newFrameHeight % reprojectionPixelSize != 0) { newFrameHeight++; } int newSubFrameWidth = newFrameWidth / reprojectionPixelSize; int newSubFrameHeight = newFrameHeight / reprojectionPixelSize; //Check if diemensions changed if (newFrameWidth != frameWidth || newSubFrameWidth != subFrameWidth || newFrameHeight != frameHeight || newSubFrameHeight != subFrameHeight) { //Cache new dimensions frameWidth = newFrameWidth; frameHeight = newFrameHeight; subFrameWidth = newSubFrameWidth; subFrameHeight = newSubFrameHeight; return true; } else { //Cache new dimensions frameWidth = newFrameWidth; frameHeight = newFrameHeight; subFrameWidth = newSubFrameWidth; subFrameHeight = newSubFrameHeight; return false; } } private int[] CalculateFrames(int reproSize) { subFrameNumber = 0; int i = 0; int reproCount = reproSize * reproSize; int[] frameNumbers = new int[reproCount]; for (i = 0; i < reproCount; i++) { frameNumbers[i] = i; } while (i-- > 0) { int frame = frameNumbers[i]; int count = (int)(UnityEngine.Random.Range(0, 1) * 1000.0f) % reproCount; frameNumbers[i] = frameNumbers[count]; frameNumbers[count] = frame; } return frameNumbers; } #endregion void UpdateMatrix(UnityEngine.Rendering.Universal.RenderingData renderingData, Material mat) { if (UnityEngine.XR.XRSettings.enabled) { // 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; } mat.SetMatrix("_LeftWorldFromView", left_world_from_view); mat.SetMatrix("_RightWorldFromView", right_world_from_view); mat.SetMatrix("_LeftViewFromScreen", left_view_from_screen); mat.SetMatrix("_RightViewFromScreen", right_view_from_screen); } else { Matrix4x4 left_world_from_view = renderingData.cameraData.GetViewMatrix().inverse; // Inverse projection matrices, plumbed through GetGPUProjectionMatrix to compensate for render texture Matrix4x4 screen_from_view = renderingData.cameraData.GetProjectionMatrix(); 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 mat.SetMatrix("_LeftWorldFromView", left_world_from_view); mat.SetMatrix("_LeftViewFromScreen", left_view_from_screen); } } /// public override void Execute(ScriptableRenderContext context, ref UnityEngine.Rendering.Universal.RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag); if (currentReprojectionPixelSize != EnviroSky.instance.cloudsSettings.cloudsQualitySettings.reprojectionPixelSize) { currentReprojectionPixelSize = EnviroSky.instance.cloudsSettings.cloudsQualitySettings.reprojectionPixelSize; SetReprojectionPixelSize(EnviroSky.instance.cloudsSettings.cloudsQualitySettings.reprojectionPixelSize); } if (blitMat == null) blitMat = new Material(Shader.Find("Enviro/Standard/Blit")); StartFrame(renderingData); if (subFrameTex == null || prevFrameTex == null || textureDimensionChanged) CreateCloudsRenderTextures(renderingData.cameraData.cameraTargetDescriptor); if (cloudsMat == null) cloudsMat = new Material(Shader.Find("Enviro/Standard/RaymarchClouds")); RenderTargetIdentifier prevFrameId = new RenderTargetIdentifier(prevFrameTex); RenderTargetIdentifier subFrameId = new RenderTargetIdentifier(subFrameTex); if(EnviroSky.instance != null) EnviroSky.instance.RenderCloudMaps(); SetCloudProperties(renderingData); if(myCam != null && EnviroSky.instance.cloudsSettings.depthBlending) UpdateMatrix(renderingData, cloudsMat); cloudsMat.EnableKeyword("ENVIROURP"); CustomBlit(cmd,renderer.cameraColorTarget,subFrameId,cloudsMat); //Render Clouds with downsampling tex if (isFirstFrame) { CustomBlit(cmd,subFrameId,prevFrameId); isFirstFrame = false; } //Set blending type: if (EnviroSky.instance.cloudsSettings.depthBlending) Shader.EnableKeyword("ENVIRO_DEPTHBLENDING"); else Shader.DisableKeyword("ENVIRO_DEPTHBLENDING"); int downsampling = EnviroSky.instance.cloudsSettings.bilateralUpsampling ? reprojectionPixelSize * EnviroSky.instance.cloudsSettings.cloudsQualitySettings.cloudsRenderResolution : 1; if (downsampling > 1) { if (compose == null) compose = new Material(Shader.Find("Hidden/Enviro/Upsample")); if (downsample == null) downsample = new Material(Shader.Find("Hidden/Enviro/DepthDownsample")); RenderTexture lowDepth = DownsampleDepth(cmd,renderingData.cameraData.cameraTargetDescriptor, null, downsample, downsampling); compose.SetTexture("_CameraDepthLowRes", lowDepth); RenderTextureDescriptor upsampleDesc = renderingData.cameraData.cameraTargetDescriptor; upsampleDesc.width = myCam.pixelWidth / downsampling * 2; upsampleDesc.height = myCam.pixelHeight / downsampling * 2; upsampleDesc.depthBufferBits = 0; upsampleDesc.graphicsFormat = Experimental.Rendering.GraphicsFormat.R16G16B16A16_SFloat; RenderTexture upsampledTex = RenderTexture.GetTemporary(upsampleDesc); upsampledTex.filterMode = FilterMode.Bilinear; RenderTargetIdentifier upsampledId = new RenderTargetIdentifier(upsampledTex); // composite to screen Vector2 pixelSize = new Vector2(1.0f / lowDepth.width, 1.0f / lowDepth.height); compose.SetVector("_LowResPixelSize", pixelSize); compose.SetVector("_LowResTextureSize", new Vector2(lowDepth.width, lowDepth.height)); compose.SetFloat("_DepthMult", 32.0f); compose.SetFloat("_Threshold", 0.0005f); compose.SetTexture("_LowResTexture", subFrameTex); compose.EnableKeyword("ENVIROURP"); CustomBlit(cmd,subFrameId,upsampledId,compose); RenderTexture.ReleaseTemporary(lowDepth); //Blit clouds to final image blitMat.SetTexture("_SubFrame", upsampledTex); blitMat.SetTexture("_PrevFrame", prevFrameTex); SetBlitmaterialProperties(); RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor; opaqueDesc.depthBufferBits = 0; cmd.GetTemporaryRT(m_TemporaryColorTexture.id, opaqueDesc, filterMode); CustomBlit(cmd,renderer.cameraColorTarget,m_TemporaryColorTexture.Identifier()); CustomBlit(cmd, m_TemporaryColorTexture.Identifier(), renderer.cameraColorTarget,blitMat); cmd.ReleaseTemporaryRT(m_TemporaryColorTexture.id); CustomBlit(cmd,upsampledId,prevFrameId); RenderTexture.ReleaseTemporary(upsampledTex); } else { //Blit clouds to final image blitMat.SetTexture("_SubFrame", subFrameTex); blitMat.SetTexture("_PrevFrame", prevFrameTex); SetBlitmaterialProperties(); RenderTextureDescriptor opaqueDesc = renderingData.cameraData.cameraTargetDescriptor; opaqueDesc.depthBufferBits = 0; cmd.GetTemporaryRT(m_TemporaryColorTexture.id, opaqueDesc, filterMode); blitMat.EnableKeyword("ENVIROURP"); CustomBlit(cmd,renderer.cameraColorTarget,m_TemporaryColorTexture.Identifier()); CustomBlit(cmd, m_TemporaryColorTexture.Identifier(), renderer.cameraColorTarget, blitMat); cmd.ReleaseTemporaryRT(m_TemporaryColorTexture.id); CustomBlit(cmd,subFrameId,prevFrameId); } FinalizeFrame(); cmd.SetRenderTarget(renderer.cameraColorTarget); context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } /// public override void FrameCleanup(CommandBuffer cmd) { // if (destination == UnityEngine.Rendering.Universal.RenderTargetHandle.CameraTarget) // cmd.ReleaseTemporaryRT(m_TemporaryColorTexture.id); } } } #endif