163 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C#
		
	
	
	
| //using UnityEngine.Rendering;
 | |
| 
 | |
| //namespace UnityEngine.PostProcessing
 | |
| //{
 | |
| //    using DebugMode = BuiltinDebugViewsModel.Mode;
 | |
| 
 | |
| //    public sealed class AmbientOcclusionComponent : PostProcessingComponentCommandBuffer<AmbientOcclusionModel>
 | |
| //    {
 | |
| //        static class Uniforms
 | |
| //        {
 | |
| //            internal static readonly int _Intensity         = Shader.PropertyToID("_Intensity");
 | |
| //            internal static readonly int _Radius            = Shader.PropertyToID("_Radius");
 | |
| //            internal static readonly int _Downsample        = Shader.PropertyToID("_Downsample");
 | |
| //            internal static readonly int _SampleCount       = Shader.PropertyToID("_SampleCount");
 | |
| //            internal static readonly int _OcclusionTexture1 = Shader.PropertyToID("_OcclusionTexture1");
 | |
| //            internal static readonly int _OcclusionTexture2 = Shader.PropertyToID("_OcclusionTexture2");
 | |
| //            internal static readonly int _OcclusionTexture  = Shader.PropertyToID("_OcclusionTexture");
 | |
| //            internal static readonly int _MainTex           = Shader.PropertyToID("_MainTex");
 | |
| //            internal static readonly int _TempRT            = Shader.PropertyToID("_TempRT");
 | |
| //        }
 | |
| 
 | |
| //        const string k_BlitShaderString = "Hidden/Post FX/Blit";
 | |
| //        const string k_ShaderString = "Hidden/Post FX/Ambient Occlusion";
 | |
| 
 | |
| //        readonly RenderTargetIdentifier[] m_MRT =
 | |
| //        {
 | |
| //            BuiltinRenderTextureType.GBuffer0, // Albedo, Occ
 | |
| //            BuiltinRenderTextureType.CameraTarget // Ambient
 | |
| //        };
 | |
| 
 | |
| //        enum OcclusionSource
 | |
| //        {
 | |
| //            DepthTexture,
 | |
| //            DepthNormalsTexture,
 | |
| //            GBuffer
 | |
| //        }
 | |
| 
 | |
| //        OcclusionSource occlusionSource
 | |
| //        {
 | |
| //            get
 | |
| //            {
 | |
| //                if (context.isGBufferAvailable && !model.settings.forceForwardCompatibility)
 | |
| //                    return OcclusionSource.GBuffer;
 | |
| 
 | |
| //                if (model.settings.highPrecision && !context.isGBufferAvailable)
 | |
| //                    return OcclusionSource.DepthTexture;
 | |
| 
 | |
| //                return OcclusionSource.DepthNormalsTexture;
 | |
| //            }
 | |
| //        }
 | |
| 
 | |
| //        bool ambientOnlySupported
 | |
| //        {
 | |
| //            get { return context.isHdr && model.settings.ambientOnly && context.isGBufferAvailable && !model.settings.forceForwardCompatibility; }
 | |
| //        }
 | |
| 
 | |
| //        public override bool active
 | |
| //        {
 | |
| //            get
 | |
| //            {
 | |
| //                return model.enabled
 | |
| //                       && model.settings.intensity > 0f
 | |
| //                       && !context.interrupted;
 | |
| //            }
 | |
| //        }
 | |
| 
 | |
| //        public override DepthTextureMode GetCameraFlags()
 | |
| //        {
 | |
| //            var flags = DepthTextureMode.None;
 | |
| 
 | |
| //            if (occlusionSource == OcclusionSource.DepthTexture)
 | |
| //                flags |= DepthTextureMode.Depth;
 | |
| 
 | |
| //            if (occlusionSource != OcclusionSource.GBuffer)
 | |
| //                flags |= DepthTextureMode.DepthNormals;
 | |
| 
 | |
| //            return flags;
 | |
| //        }
 | |
| 
 | |
| //        public override string GetName()
 | |
| //        {
 | |
| //            return "Ambient Occlusion";
 | |
| //        }
 | |
| 
 | |
| //        public override CameraEvent GetCameraEvent()
 | |
| //        {
 | |
| //            return ambientOnlySupported && !context.profile.debugViews.IsModeActive(DebugMode.AmbientOcclusion)
 | |
| //                   ? CameraEvent.BeforeReflections
 | |
| //                   : CameraEvent.BeforeImageEffectsOpaque;
 | |
| //        }
 | |
| 
 | |
| //        public override void PopulateCommandBuffer(CommandBuffer cb)
 | |
| //        {
 | |
| //            var settings = model.settings;
 | |
| 
 | |
| //            // Material setup
 | |
| //            var blitMaterial = context.materialFactory.Get(k_BlitShaderString);
 | |
| 
 | |
| //            var material = context.materialFactory.Get(k_ShaderString);
 | |
| //            material.shaderKeywords = null;
 | |
| //            material.SetFloat(Uniforms._Intensity, settings.intensity);
 | |
| //            material.SetFloat(Uniforms._Radius, settings.radius);
 | |
| //            material.SetFloat(Uniforms._Downsample, settings.downsampling ? 0.5f : 1f);
 | |
| //            material.SetInt(Uniforms._SampleCount, (int)settings.sampleCount);
 | |
| 
 | |
| //            int tw = context.width;
 | |
| //            int th = context.height;
 | |
| //            int ts = settings.downsampling ? 2 : 1;
 | |
| //            const RenderTextureFormat kFormat = RenderTextureFormat.ARGB32;
 | |
| //            const RenderTextureReadWrite kRWMode = RenderTextureReadWrite.Linear;
 | |
| //            const FilterMode kFilter = FilterMode.Bilinear;
 | |
| 
 | |
| //            // AO buffer
 | |
| //            var rtMask = Uniforms._OcclusionTexture1;
 | |
| //            cb.GetTemporaryRT(rtMask, tw / ts, th / ts, 0, kFilter, kFormat, kRWMode);
 | |
| 
 | |
| //            // AO estimation
 | |
| //            cb.Blit((Texture)null, rtMask, material, (int)occlusionSource);
 | |
| 
 | |
| //            // Blur buffer
 | |
| //            var rtBlur = Uniforms._OcclusionTexture2;
 | |
| 
 | |
| //            // Separable blur (horizontal pass)
 | |
| //            cb.GetTemporaryRT(rtBlur, tw, th, 0, kFilter, kFormat, kRWMode);
 | |
| //            cb.SetGlobalTexture(Uniforms._MainTex, rtMask);
 | |
| //            cb.Blit(rtMask, rtBlur, material, occlusionSource == OcclusionSource.GBuffer ? 4 : 3);
 | |
| //            cb.ReleaseTemporaryRT(rtMask);
 | |
| 
 | |
| //            // Separable blur (vertical pass)
 | |
| //            rtMask = Uniforms._OcclusionTexture;
 | |
| //            cb.GetTemporaryRT(rtMask, tw, th, 0, kFilter, kFormat, kRWMode);
 | |
| //            cb.SetGlobalTexture(Uniforms._MainTex, rtBlur);
 | |
| //            cb.Blit(rtBlur, rtMask, material, 5);
 | |
| //            cb.ReleaseTemporaryRT(rtBlur);
 | |
| 
 | |
| //            if (context.profile.debugViews.IsModeActive(DebugMode.AmbientOcclusion))
 | |
| //            {
 | |
| //                cb.SetGlobalTexture(Uniforms._MainTex, rtMask);
 | |
| //                cb.Blit(rtMask, BuiltinRenderTextureType.CameraTarget, material, 8);
 | |
| //                context.Interrupt();
 | |
| //            }
 | |
| //            else if (ambientOnlySupported)
 | |
| //            {
 | |
| //                cb.SetRenderTarget(m_MRT, BuiltinRenderTextureType.CameraTarget);
 | |
| //                cb.DrawMesh(GraphicsUtils.quad, Matrix4x4.identity, material, 0, 7);
 | |
| //            }
 | |
| //            else
 | |
| //            {
 | |
| //                var fbFormat = context.isHdr ? RenderTextureFormat.DefaultHDR : RenderTextureFormat.Default;
 | |
| 
 | |
| //                int tempRT = Uniforms._TempRT;
 | |
| //                cb.GetTemporaryRT(tempRT, context.width, context.height, 0, FilterMode.Bilinear, fbFormat);
 | |
| //                cb.Blit(BuiltinRenderTextureType.CameraTarget, tempRT, blitMaterial, 0);
 | |
| //                cb.SetGlobalTexture(Uniforms._MainTex, tempRT);
 | |
| //                cb.Blit(tempRT, BuiltinRenderTextureType.CameraTarget, material, 6);
 | |
| //                cb.ReleaseTemporaryRT(tempRT);
 | |
| //            }
 | |
| 
 | |
| //            cb.ReleaseTemporaryRT(rtMask);
 | |
| //        }
 | |
| //    }
 | |
| //}
 |