using UnityEngine.Rendering; namespace UnityEngine.PostProcessing { public sealed class FogComponent : PostProcessingComponentCommandBuffer { static class Uniforms { internal static readonly int _FogColor = Shader.PropertyToID("_FogColor"); internal static readonly int _Density = Shader.PropertyToID("_Density"); internal static readonly int _Start = Shader.PropertyToID("_Start"); internal static readonly int _End = Shader.PropertyToID("_End"); internal static readonly int _TempRT = Shader.PropertyToID("_TempRT"); } const string k_ShaderString = "Hidden/Post FX/Fog"; public override bool active { get { return model.enabled && context.isGBufferAvailable // In forward fog is already done at shader level && RenderSettings.fog && !context.interrupted; } } public override string GetName() { return "Fog"; } public override DepthTextureMode GetCameraFlags() { return DepthTextureMode.Depth; } public override CameraEvent GetCameraEvent() { return CameraEvent.AfterImageEffectsOpaque; } public override void PopulateCommandBuffer(CommandBuffer cb) { var settings = model.settings; var material = context.materialFactory.Get(k_ShaderString); material.shaderKeywords = null; var fogColor = GraphicsUtils.isLinearColorSpace ? RenderSettings.fogColor.linear : RenderSettings.fogColor; material.SetColor(Uniforms._FogColor, fogColor); material.SetFloat(Uniforms._Density, RenderSettings.fogDensity); material.SetFloat(Uniforms._Start, RenderSettings.fogStartDistance); material.SetFloat(Uniforms._End, RenderSettings.fogEndDistance); switch (RenderSettings.fogMode) { case FogMode.Linear: material.EnableKeyword("FOG_LINEAR"); break; case FogMode.Exponential: material.EnableKeyword("FOG_EXP"); break; case FogMode.ExponentialSquared: material.EnableKeyword("FOG_EXP2"); break; } var fbFormat = context.isHdr ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default; cb.GetTemporaryRT(Uniforms._TempRT, context.width, context.height, 24, FilterMode.Bilinear, fbFormat); cb.Blit(BuiltinRenderTextureType.CameraTarget, Uniforms._TempRT); cb.Blit(Uniforms._TempRT, BuiltinRenderTextureType.CameraTarget, material, settings.excludeSkybox ? 1 : 0); cb.ReleaseTemporaryRT(Uniforms._TempRT); } } }