using UnityEngine.Rendering; 
 | 
  
 | 
namespace UnityEngine.PostProcessing 
 | 
{ 
 | 
    public sealed class FogComponent : PostProcessingComponentCommandBuffer<FogModel> 
 | 
    { 
 | 
        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); 
 | 
        } 
 | 
    } 
 | 
} 
 |