protected override void UpdateMaterial()
        {
            base.UpdateMaterial();

            Bounds  b        = _renderer.bounds;
            Vector3 shrinker = b.size * -(1.0f - FogBoxPercentage);

            b.Expand(shrinker);
            FogMaterial.SetVector("_FogBoxMin", b.min);
            FogMaterial.SetVector("_FogBoxMax", b.max);
        }
        protected override void UpdateMaterial()
        {
            base.UpdateMaterial();

            if (FogHeight > 0.0f)
            {
                FogMaterial.SetFloat("_FogHeight", FogHeight);
                if (FogNoiseHeightScale > 0.0f && FogNoiseHeight != null)
                {
                    FogMaterial.SetTexture("_FogNoiseHeight", FogNoiseHeight);
                    FogMaterial.EnableKeyword("ENABLE_FOG_HEIGHT_WITH_NOISE");
                    FogMaterial.DisableKeyword("ENABLE_FOG_HEIGHT");
                }
                else
                {
                    FogMaterial.EnableKeyword("ENABLE_FOG_HEIGHT");
                    FogMaterial.DisableKeyword("ENABLE_FOG_HEIGHT_WITH_NOISE");
                }
            }
            else
            {
                FogMaterial.DisableKeyword("ENABLE_FOG_HEIGHT");
                FogMaterial.DisableKeyword("ENABLE_FOG_HEIGHT_WITH_NOISE");
            }

            if (Sun == null)
            {
                FogMaterial.DisableKeyword("ENABLE_SUN");
            }
            else
            {
                if (Sun.intensity == 0.0f || !SunEnabled || (Sun.color.r == 0.0f && Sun.color.g == 0.0f && Sun.color.b == 0.0f))
                {
                    FogMaterial.DisableKeyword("ENABLE_SUN");
                }
                else
                {
                    FogMaterial.EnableKeyword("ENABLE_SUN");
                }
            }
        }
        private void UpdateCommandBuffer()
        {
            if (commandBuffer == null)
            {
                commandBuffer = new CommandBuffer();
                Camera.AddCommandBuffer(CameraEvent.AfterForwardAlpha, commandBuffer);
            }
            else
            {
                commandBuffer.Clear();
            }

            lastDownSampleScale = DownSampleScale;
            lastBlurShader      = BlurShader;

            float scale = Mathf.Clamp(DownSampleScale, 0.25f, 1.0f);

            if (scale < 0.99f)
            {
                // scale is less than 1, create scaled down textures for depth and fog
                int width  = (int)(Screen.width * scale);
                int height = (int)(Screen.height * scale);

                // render depth buffer to low res texture
                int depthRenderTargetId          = Shader.PropertyToID("_CameraDepthTextureScaled");
                RenderTargetIdentifier downDepth = new RenderTargetIdentifier(depthRenderTargetId);
                commandBuffer.GetTemporaryRT(depthRenderTargetId, width, height, 0, FilterMode.Point, RenderTextureFormat.RFloat);
                commandBuffer.Blit((Texture2D)null, downDepth, FogDepthSampleMaterial);

                // render depth normals to low res texture
                //int depthNormalsRenderTargetId = Shader.PropertyToID("_CameraDepthNormalsTextureScaled");
                //RenderTargetIdentifier downDepthNormals = new RenderTargetIdentifier(depthNormalsRenderTargetId);
                //commandBuffer.GetTemporaryRT(depthNormalsRenderTargetId, width, height, 0, FilterMode.Point, RenderTextureFormat.ARGB32);
                //commandBuffer.Blit((Texture2D)null, downDepthNormals, fogDepthNormalSampleMaterial);

                // render fog to low res texture, disable alpha blend
                int fogRenderTargetId = Shader.PropertyToID("_MainTex");
                RenderTargetIdentifier downScaledFog = new RenderTargetIdentifier(fogRenderTargetId);
                commandBuffer.GetTemporaryRT(fogRenderTargetId, width, height, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);
                FogMaterial.SetInt("_SrcBlendMode", (int)BlendMode.One);
                FogMaterial.SetInt("_DstBlendMode", (int)BlendMode.Zero);
                commandBuffer.Blit((Texture2D)null, downScaledFog, FogMaterial);

                // blur fog texture if scaled down
                if (FogBlurMaterial != null && BlurShader != BlurShaderType.None)
                {
                    // render fog on top of camera using alpha blend + blur
                    commandBuffer.Blit(downScaledFog, BuiltinRenderTextureType.CameraTarget, FogBlurMaterial);
                }
                else
                {
                    // render fog on top of camera using alpha blend
                    commandBuffer.Blit(downScaledFog, BuiltinRenderTextureType.CameraTarget, FogFullScreenMaterial);
                }

                // cleanup
                commandBuffer.ReleaseTemporaryRT(depthRenderTargetId);
                //commandBuffer.ReleaseTemporaryRT(depthNormalsRenderTargetId);
                commandBuffer.ReleaseTemporaryRT(fogRenderTargetId);
            }
            else if (FogBlurMaterial != null && BlurShader != BlurShaderType.None)
            {
                // render fog into render texture, then blur that to final result

                // create fog render target, draw fog to that
                int fogRenderTargetId = Shader.PropertyToID("_MainTex");
                RenderTargetIdentifier fogRenderTarget = new RenderTargetIdentifier(fogRenderTargetId);
                commandBuffer.GetTemporaryRT(fogRenderTargetId, Screen.width, Screen.height, 0, FilterMode.Bilinear, RenderTextureFormat.ARGB32);
                FogMaterial.SetInt("_SrcBlendMode", (int)BlendMode.One);
                FogMaterial.SetInt("_DstBlendMode", (int)BlendMode.Zero);

                // draw fog into fog render texture at full scale
                commandBuffer.Blit((Texture2D)null, fogRenderTarget, FogMaterial);

                // render final result with alpha blend + blur on top of camera texture
                commandBuffer.Blit(fogRenderTarget, BuiltinRenderTextureType.CameraTarget, FogBlurMaterial);

                // cleanup
                commandBuffer.ReleaseTemporaryRT(fogRenderTargetId);
            }
            else
            {
                // render final image to camera target using transparent overlay
                FogMaterial.SetInt("_SrcBlendMode", (int)BlendMode.SrcAlpha);
                FogMaterial.SetInt("_DstBlendMode", (int)BlendMode.OneMinusSrcAlpha);
                commandBuffer.Blit((Texture2D)null, BuiltinRenderTextureType.CameraTarget, FogMaterial);
            }
        }