204 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C#
		
	
	
	
| //using UnityEngine.Rendering;
 | |
| 
 | |
| //namespace UnityEngine.PostProcessing
 | |
| //{
 | |
| //    public sealed class TaaComponent : PostProcessingComponentRenderTexture<AntialiasingModel>
 | |
| //    {
 | |
| //        static class Uniforms
 | |
| //        {
 | |
| //            internal static int _Jitter               = Shader.PropertyToID("_Jitter");
 | |
| //            internal static int _SharpenParameters    = Shader.PropertyToID("_SharpenParameters");
 | |
| //            internal static int _FinalBlendParameters = Shader.PropertyToID("_FinalBlendParameters");
 | |
| //            internal static int _HistoryTex           = Shader.PropertyToID("_HistoryTex");
 | |
| //            internal static int _MainTex              = Shader.PropertyToID("_MainTex");
 | |
| //        }
 | |
| 
 | |
| //        const string k_ShaderString = "Hidden/Post FX/Temporal Anti-aliasing";
 | |
| //        const int k_SampleCount = 8;
 | |
| 
 | |
| //        readonly RenderBuffer[] m_MRT = new RenderBuffer[2];
 | |
| 
 | |
| //        int m_SampleIndex;
 | |
| //        bool m_ResetHistory;
 | |
| 
 | |
| //        RenderTexture m_HistoryTexture;
 | |
| 
 | |
| //        public override bool active
 | |
| //        {
 | |
| //            get
 | |
| //            {
 | |
| //                return model.enabled
 | |
| //                       && model.settings.method == AntialiasingModel.Method.Taa
 | |
| //                       && SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf)
 | |
| //                       && SystemInfo.supportsMotionVectors
 | |
| //                       && !context.interrupted;
 | |
| //            }
 | |
| //        }
 | |
| 
 | |
| //        public override DepthTextureMode GetCameraFlags()
 | |
| //        {
 | |
| //            return DepthTextureMode.Depth | DepthTextureMode.MotionVectors;
 | |
| //        }
 | |
| 
 | |
| //        public void ResetHistory()
 | |
| //        {
 | |
| //            m_ResetHistory = true;
 | |
| //        }
 | |
| 
 | |
| //        public void SetProjectionMatrix()
 | |
| //        {
 | |
| //            var settings = model.settings.taaSettings;
 | |
| 
 | |
| //            var jitter = GenerateRandomOffset();
 | |
| //            jitter *= settings.jitterSpread;
 | |
| 
 | |
| //            context.camera.nonJitteredProjectionMatrix = context.camera.projectionMatrix;
 | |
| //            context.camera.projectionMatrix = context.camera.orthographic
 | |
| //                ? GetOrthographicProjectionMatrix(jitter)
 | |
| //                : GetPerspectiveProjectionMatrix(jitter);
 | |
| 
 | |
| //#if UNITY_5_5_OR_NEWER
 | |
| //            context.camera.useJitteredProjectionMatrixForTransparentRendering = false;
 | |
| //#endif
 | |
| 
 | |
| //            jitter.x /= context.width;
 | |
| //            jitter.y /= context.height;
 | |
| 
 | |
| //            var material = context.materialFactory.Get(k_ShaderString);
 | |
| //            material.SetVector(Uniforms._Jitter, jitter);
 | |
| //        }
 | |
| 
 | |
| //        public void Render(RenderTexture source, RenderTexture destination)
 | |
| //        {
 | |
| //            var material = context.materialFactory.Get(k_ShaderString);
 | |
| //            material.shaderKeywords = null;
 | |
| 
 | |
| //            var settings = model.settings.taaSettings;
 | |
| 
 | |
| //            if (m_ResetHistory || m_HistoryTexture == null || m_HistoryTexture.width != source.width || m_HistoryTexture.height != source.height)
 | |
| //            {
 | |
| //                if (m_HistoryTexture)
 | |
| //                    RenderTexture.ReleaseTemporary(m_HistoryTexture);
 | |
| 
 | |
| //                m_HistoryTexture = RenderTexture.GetTemporary(source.width, source.height, 0, source.format);
 | |
| //                m_HistoryTexture.name = "TAA History";
 | |
| 
 | |
| //                Graphics.Blit(source, m_HistoryTexture, material, 2);
 | |
| //            }
 | |
| 
 | |
| //            const float kMotionAmplification = 100f * 60f;
 | |
| //            material.SetVector(Uniforms._SharpenParameters, new Vector4(settings.sharpen, 0f, 0f, 0f));
 | |
| //            material.SetVector(Uniforms._FinalBlendParameters, new Vector4(settings.stationaryBlending, settings.motionBlending, kMotionAmplification, 0f));
 | |
| //            material.SetTexture(Uniforms._MainTex, source);
 | |
| //            material.SetTexture(Uniforms._HistoryTex, m_HistoryTexture);
 | |
| 
 | |
| //            var tempHistory = RenderTexture.GetTemporary(source.width, source.height, 0, source.format);
 | |
| //            tempHistory.name = "TAA History";
 | |
| 
 | |
| //            m_MRT[0] = destination.colorBuffer;
 | |
| //            m_MRT[1] = tempHistory.colorBuffer;
 | |
| 
 | |
| //            Graphics.SetRenderTarget(m_MRT, source.depthBuffer);
 | |
| //            GraphicsUtils.Blit(material, context.camera.orthographic ? 1 : 0);
 | |
| 
 | |
| //            RenderTexture.ReleaseTemporary(m_HistoryTexture);
 | |
| //            m_HistoryTexture = tempHistory;
 | |
| 
 | |
| //            m_ResetHistory = false;
 | |
| //        }
 | |
| 
 | |
| //        float GetHaltonValue(int index, int radix)
 | |
| //        {
 | |
| //            float result = 0f;
 | |
| //            float fraction = 1f / (float)radix;
 | |
| 
 | |
| //            while (index > 0)
 | |
| //            {
 | |
| //                result += (float)(index % radix) * fraction;
 | |
| 
 | |
| //                index /= radix;
 | |
| //                fraction /= (float)radix;
 | |
| //            }
 | |
| 
 | |
| //            return result;
 | |
| //        }
 | |
| 
 | |
| //        Vector2 GenerateRandomOffset()
 | |
| //        {
 | |
| //            var offset = new Vector2(
 | |
| //                    GetHaltonValue(m_SampleIndex & 1023, 2),
 | |
| //                    GetHaltonValue(m_SampleIndex & 1023, 3));
 | |
| 
 | |
| //            if (++m_SampleIndex >= k_SampleCount)
 | |
| //                m_SampleIndex = 0;
 | |
| 
 | |
| //            return offset;
 | |
| //        }
 | |
| 
 | |
| //        // Adapted heavily from PlayDead's TAA code
 | |
| //        // https://github.com/playdeadgames/temporal/blob/master/Assets/Scripts/Extensions.cs
 | |
| //        Matrix4x4 GetPerspectiveProjectionMatrix(Vector2 offset)
 | |
| //        {
 | |
| //            float vertical = Mathf.Tan(0.5f * Mathf.Deg2Rad * context.camera.fieldOfView);
 | |
| //            float horizontal = vertical * context.camera.aspect;
 | |
| 
 | |
| //            offset.x *= horizontal / (0.5f * context.width);
 | |
| //            offset.y *= vertical / (0.5f * context.height);
 | |
| 
 | |
| //            float left = (offset.x - horizontal) * context.camera.nearClipPlane;
 | |
| //            float right = (offset.x + horizontal) * context.camera.nearClipPlane;
 | |
| //            float top = (offset.y + vertical) * context.camera.nearClipPlane;
 | |
| //            float bottom = (offset.y - vertical) * context.camera.nearClipPlane;
 | |
| 
 | |
| //            var matrix = new Matrix4x4();
 | |
| 
 | |
| //            matrix[0, 0] = (2f * context.camera.nearClipPlane) / (right - left);
 | |
| //            matrix[0, 1] = 0f;
 | |
| //            matrix[0, 2] = (right + left) / (right - left);
 | |
| //            matrix[0, 3] = 0f;
 | |
| 
 | |
| //            matrix[1, 0] = 0f;
 | |
| //            matrix[1, 1] = (2f * context.camera.nearClipPlane) / (top - bottom);
 | |
| //            matrix[1, 2] = (top + bottom) / (top - bottom);
 | |
| //            matrix[1, 3] = 0f;
 | |
| 
 | |
| //            matrix[2, 0] = 0f;
 | |
| //            matrix[2, 1] = 0f;
 | |
| //            matrix[2, 2] = -(context.camera.farClipPlane + context.camera.nearClipPlane) / (context.camera.farClipPlane - context.camera.nearClipPlane);
 | |
| //            matrix[2, 3] = -(2f * context.camera.farClipPlane * context.camera.nearClipPlane) / (context.camera.farClipPlane - context.camera.nearClipPlane);
 | |
| 
 | |
| //            matrix[3, 0] = 0f;
 | |
| //            matrix[3, 1] = 0f;
 | |
| //            matrix[3, 2] = -1f;
 | |
| //            matrix[3, 3] = 0f;
 | |
| 
 | |
| //            return matrix;
 | |
| //        }
 | |
| 
 | |
| //        Matrix4x4 GetOrthographicProjectionMatrix(Vector2 offset)
 | |
| //        {
 | |
| //            float vertical = context.camera.orthographicSize;
 | |
| //            float horizontal = vertical * context.camera.aspect;
 | |
| 
 | |
| //            offset.x *= horizontal / (0.5f * context.width);
 | |
| //            offset.y *= vertical / (0.5f * context.height);
 | |
| 
 | |
| //            float left = offset.x - horizontal;
 | |
| //            float right = offset.x + horizontal;
 | |
| //            float top = offset.y + vertical;
 | |
| //            float bottom = offset.y - vertical;
 | |
| 
 | |
| //            return Matrix4x4.Ortho(left, right, bottom, top, context.camera.nearClipPlane, context.camera.farClipPlane);
 | |
| //        }
 | |
| 
 | |
| //        public override void OnDisable()
 | |
| //        {
 | |
| //            if (m_HistoryTexture != null)
 | |
| //                RenderTexture.ReleaseTemporary(m_HistoryTexture);
 | |
| 
 | |
| //            m_HistoryTexture = null;
 | |
| //            m_SampleIndex = 0;
 | |
| //        }
 | |
| //    }
 | |
| //}
 |