using UnityEngine; using UnityEngine.Rendering.PostProcessing; public sealed class VolumeFogSM_SRPRenderer : PostProcessEffectRenderer { [SerializeField] private bool _useRadialDistance; [SerializeField] private bool _fadeToSkybox = true; public override void Render(PostProcessRenderContext context) { PropertySheet propertySheet = context.propertySheets.Get(Shader.Find("Hidden/InverseProjectVFogLWRP")); propertySheet.properties.SetFloat("_DistanceOffset", base.settings._startDistance); propertySheet.properties.SetFloat("_Height", base.settings._fogHeight); propertySheet.properties.SetFloat("_cameraRoll", base.settings._cameraRoll); propertySheet.properties.SetVector("_cameraDiff", base.settings._cameraDiff); propertySheet.properties.SetFloat("_cameraTiltSign", base.settings._cameraTiltSign); switch (RenderSettings.fogMode) { case FogMode.Linear: { float fogStartDistance = RenderSettings.fogStartDistance; float fogEndDistance = RenderSettings.fogEndDistance; float num = 1f / Mathf.Max(fogEndDistance - fogStartDistance, 1E-06f); propertySheet.properties.SetFloat("_LinearGrad", 0f - num); propertySheet.properties.SetFloat("_LinearOffs", fogEndDistance * num); propertySheet.DisableKeyword("FOG_EXP"); propertySheet.DisableKeyword("FOG_EXP2"); break; } case FogMode.Exponential: { float fogDensity2 = RenderSettings.fogDensity; propertySheet.properties.SetFloat("_Density", 1.442695f * fogDensity2 * (float)base.settings._fogDensity); propertySheet.EnableKeyword("FOG_EXP"); propertySheet.DisableKeyword("FOG_EXP2"); break; } default: { float fogDensity = RenderSettings.fogDensity; propertySheet.properties.SetFloat("_Density", 1.2011224f * fogDensity * (float)base.settings._fogDensity); propertySheet.DisableKeyword("FOG_EXP"); propertySheet.EnableKeyword("FOG_EXP2"); break; } } if (_useRadialDistance) { propertySheet.EnableKeyword("RADIAL_DIST"); } else { propertySheet.DisableKeyword("RADIAL_DIST"); } if (_fadeToSkybox) { propertySheet.DisableKeyword("USE_SKYBOX"); propertySheet.properties.SetColor("_FogColor", base.settings._FogColor); } else { propertySheet.DisableKeyword("USE_SKYBOX"); propertySheet.properties.SetColor("_FogColor", base.settings._FogColor); } if (base.settings.noiseTexture.value == null) { base.settings.noiseTexture.value = new Texture2D(1280, 720); } if (propertySheet != null && base.settings.noiseTexture != null) { if (base.settings.noiseTexture.value == null) { base.settings.noiseTexture.value = new Texture2D(1280, 720); } propertySheet.properties.SetTexture("_NoiseTex", base.settings.noiseTexture.value); } Camera main = Camera.main; Vector3 position = main.transform.position; float num2 = position.y - (float)base.settings._fogHeight; float z = ((num2 <= 0f) ? 1f : 0f); propertySheet.properties.SetVector("_CameraWS", position); propertySheet.properties.SetVector("_HeightParams", new Vector4(base.settings._fogHeight, num2, z, (float)base.settings.heightDensity * 0.5f)); propertySheet.properties.SetVector("_DistanceParams", new Vector4(0f - Mathf.Max(base.settings.startDistance, 0f), 0f, 0f, 0f)); propertySheet.properties.SetFloat("_NoiseDensity", base.settings.noiseDensity); propertySheet.properties.SetFloat("_NoiseScale", base.settings.noiseScale); propertySheet.properties.SetFloat("_NoiseThickness", base.settings.noiseThickness); propertySheet.properties.SetVector("_NoiseSpeed", base.settings.noiseSpeed); propertySheet.properties.SetFloat("_OcclusionDrop", base.settings.occlusionDrop); propertySheet.properties.SetFloat("_OcclusionExp", base.settings.occlusionExp); propertySheet.properties.SetInt("noise3D", base.settings.noise3D); propertySheet.properties.SetFloat("luminance", base.settings.luminance); propertySheet.properties.SetFloat("lumFac", base.settings.lumFac); propertySheet.properties.SetFloat("Multiplier1", base.settings.ScatterFac); propertySheet.properties.SetFloat("Multiplier2", base.settings.TurbFac); propertySheet.properties.SetFloat("Multiplier3", base.settings.HorizFac); propertySheet.properties.SetFloat("turbidity", base.settings.turbidity); propertySheet.properties.SetFloat("reileigh", base.settings.reileigh); propertySheet.properties.SetFloat("mieCoefficient", base.settings.mieCoefficient); propertySheet.properties.SetFloat("mieDirectionalG", base.settings.mieDirectionalG); propertySheet.properties.SetFloat("bias", base.settings.bias); propertySheet.properties.SetFloat("contrast", base.settings.contrast); propertySheet.properties.SetVector("v3LightDir", base.settings.Sun); propertySheet.properties.SetVector("_TintColor", new Vector4(base.settings.TintColor.value.r, base.settings.TintColor.value.g, base.settings.TintColor.value.b, 1f)); float value = 0f; if ((bool)base.settings.FogSky) { value = 1f; } propertySheet.properties.SetFloat("FogSky", value); propertySheet.properties.SetFloat("ClearSkyFac", base.settings.ClearSkyFac); propertySheet.properties.SetVector("localLightPos", new Vector4(base.settings.PointL.value.x, base.settings.PointL.value.y, base.settings.PointL.value.z, base.settings.PointL.value.w)); propertySheet.properties.SetVector("localLightColor", new Vector4(base.settings.PointLParams.value.x, base.settings.PointLParams.value.y, base.settings.PointLParams.value.z, base.settings.PointLParams.value.w)); RenderTextureFormat format = (main.allowHDR ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default); RenderTexture renderTexture = (RenderTexture.active = RenderTexture.GetTemporary(context.width, context.height, 0, format)); GL.ClearWithSkybox(clearDepth: false, main); context.command.BlitFullscreenTriangle(context.source, renderTexture); propertySheet.properties.SetTexture("_MainTex", renderTexture); Matrix4x4 cameraToWorldMatrix = context.camera.cameraToWorldMatrix; propertySheet.properties.SetMatrix("_InverseView", cameraToWorldMatrix); context.command.BlitFullscreenTriangle(context.source, context.destination, propertySheet, 0); RenderTexture.ReleaseTemporary(renderTexture); } }