|
| 1 | +using System; |
| 2 | +using UnityEngine.Rendering; |
| 3 | + |
| 4 | +namespace UnityEngine.PostProcessing |
| 5 | +{ |
| 6 | + public sealed class FogComponent : PostProcessingComponentCommandBuffer<FogModel> |
| 7 | + { |
| 8 | + static class Uniforms |
| 9 | + { |
| 10 | + internal static readonly int _FogColor = Shader.PropertyToID("_FogColor"); |
| 11 | + internal static readonly int _Density = Shader.PropertyToID("_Density"); |
| 12 | + internal static readonly int _Start = Shader.PropertyToID("_Start"); |
| 13 | + internal static readonly int _End = Shader.PropertyToID("_End"); |
| 14 | + internal static readonly int _TempRT = Shader.PropertyToID("_TempRT"); |
| 15 | + } |
| 16 | + |
| 17 | + const string k_ShaderString = "Hidden/Post FX/Fog"; |
| 18 | + |
| 19 | + public override bool active |
| 20 | + { |
| 21 | + get |
| 22 | + { |
| 23 | + return model.enabled |
| 24 | + && context.isGBufferAvailable // In forward fog is already done at shader level |
| 25 | + && !context.interrupted; |
| 26 | + } |
| 27 | + } |
| 28 | + |
| 29 | + public override string GetName() |
| 30 | + { |
| 31 | + return "Fog"; |
| 32 | + } |
| 33 | + |
| 34 | + public override DepthTextureMode GetCameraFlags() |
| 35 | + { |
| 36 | + return DepthTextureMode.Depth; |
| 37 | + } |
| 38 | + |
| 39 | + public override CameraEvent GetCameraEvent() |
| 40 | + { |
| 41 | + return CameraEvent.BeforeImageEffectsOpaque; |
| 42 | + } |
| 43 | + |
| 44 | + public override void Init(PostProcessingContext pcontext, FogModel pmodel) |
| 45 | + { |
| 46 | + base.Init(pcontext, pmodel); |
| 47 | + |
| 48 | + var settings = model.settings; |
| 49 | + RenderSettings.fog = model.enabled; |
| 50 | + RenderSettings.fogColor = settings.color; |
| 51 | + RenderSettings.fogMode = settings.mode; |
| 52 | + RenderSettings.fogDensity = settings.density; |
| 53 | + RenderSettings.fogStartDistance = settings.start; |
| 54 | + RenderSettings.fogEndDistance = settings.end; |
| 55 | + } |
| 56 | + |
| 57 | + public override void PopulateCommandBuffer(CommandBuffer cb) |
| 58 | + { |
| 59 | + var settings = model.settings; |
| 60 | + |
| 61 | + var material = context.materialFactory.Get(k_ShaderString); |
| 62 | + material.shaderKeywords = null; |
| 63 | + material.SetColor(Uniforms._FogColor, settings.color); |
| 64 | + material.SetFloat(Uniforms._Density, settings.density); |
| 65 | + material.SetFloat(Uniforms._Start, settings.start); |
| 66 | + material.SetFloat(Uniforms._End, settings.end); |
| 67 | + |
| 68 | + switch (settings.mode) |
| 69 | + { |
| 70 | + case FogMode.Linear: |
| 71 | + material.EnableKeyword("FOG_LINEAR"); |
| 72 | + break; |
| 73 | + case FogMode.Exponential: |
| 74 | + material.EnableKeyword("FOG_EXP"); |
| 75 | + break; |
| 76 | + case FogMode.ExponentialSquared: |
| 77 | + material.EnableKeyword("FOG_EXP2"); |
| 78 | + break; |
| 79 | + } |
| 80 | + |
| 81 | + var fbFormat = context.isHdr |
| 82 | + ? RenderTextureFormat.DefaultHDR |
| 83 | + : RenderTextureFormat.Default; |
| 84 | + |
| 85 | + cb.GetTemporaryRT(Uniforms._TempRT, context.width, context.height, 24, FilterMode.Bilinear, fbFormat); |
| 86 | + cb.Blit(BuiltinRenderTextureType.CameraTarget, Uniforms._TempRT); |
| 87 | + cb.Blit(Uniforms._TempRT, BuiltinRenderTextureType.CameraTarget, material, settings.excludeSkybox ? 1 : 0); |
| 88 | + cb.ReleaseTemporaryRT(Uniforms._TempRT); |
| 89 | + } |
| 90 | + } |
| 91 | +} |
0 commit comments