Beispiel #1
0
        private void CalculateAndUpdateConstantBuffer(DeviceContext context, double tick)
        {
            Matrix previousFrameViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix;

            m_ViewportCamera.TickCamera(tick);

            dynamic mcb  = m_ForwardPassBuffer;
            dynamic vcb  = m_ViewportConstantBuffer;
            dynamic ppcb = m_PostEffectsConstantBuffer;
            dynamic cvpb = m_CurrentViewportBuffer;

            m_ViewportCamera.CalculateMatrices();
            m_ShadowCamera.CalculateMatrices();

            // Temporal component of matrix
            Matrix temporalJitter = Matrix.Identity;

            if (vcb.g_TemporalAA > 0.5f)
            {
                //float translationOffset = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 0.5f : -0.5f;
                //float translationOffsetX = translationOffset;
                //float translationOffsetY = translationOffset;
                temporalJitter = Matrix.Translation((POISSON_SAMPLES[(Program.m_FrameNumber) % POISSON_SAMPLE_NUM * 2 + 0] * 2.0f - 1.0f) / (float)m_ResolutionX, (POISSON_SAMPLES[(Program.m_FrameNumber) % POISSON_SAMPLE_NUM * 2 + 1] * 2.0f - 1.0f) / (float)m_ResolutionY, 0.0f);
            }
            m_ScatterDOFPass.m_DebugBokeh = ppcb.g_DebugBokeh > 0.5f;

            Vector3 sceneMin, sceneMax;

            m_SimpleSceneWrapper.GetSceneBounds(out sceneMin, out sceneMax);

            vcb.g_ViewProjMatrixPrevFrame = previousFrameViewProjMatrix;
            cvpb.g_ProjMatrix             = m_ViewportCamera.m_ProjectionMatrix;
            cvpb.g_ViewMatrix             = m_ViewportCamera.m_WorldToView;
            cvpb.g_InvViewProjMatrix      = m_ViewportCamera.m_ViewProjectionMatrix;
            cvpb.g_InvViewProjMatrix.Invert();
            cvpb.g_ViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix * temporalJitter;

            Matrix viewToWorldMatrix = m_ViewportCamera.m_WorldToView;

            viewToWorldMatrix.Invert();

            float projWidth  = m_ViewportCamera.m_ProjectionMatrix.M11;
            float projHeight = m_ViewportCamera.m_ProjectionMatrix.M22;

            vcb.g_EyeXAxis = Vector4.Transform(new Vector4(1.0f / projWidth, 0, 0, 0), viewToWorldMatrix);
            vcb.g_EyeYAxis = Vector4.Transform(new Vector4(0, 1.0f / projHeight, 0, 0), viewToWorldMatrix);
            vcb.g_EyeZAxis = Vector4.Transform(new Vector4(0, 0, 1, 0), viewToWorldMatrix);

            vcb.g_WorldEyePos    = new Vector4(m_ViewportCamera.m_CameraPosition, 1.0f);
            vcb.g_WorldBoundsMin = new Vector4(sceneMin, 0.0f);
            vcb.g_WorldBoundsMax = new Vector4(sceneMax, 0.0f);
            Vector3 invRange = new Vector3(1.0f / (sceneMax.X - sceneMin.X), 1.0f / (sceneMax.Y - sceneMin.Y), 1.0f / (sceneMax.Z - sceneMin.Z));

            vcb.g_WorldBoundsInvRange = new Vector4(invRange, 0.0f);
            vcb.g_zNear             = m_ViewportCamera.m_NearZ;
            vcb.g_zFar              = m_ViewportCamera.m_FarZ;
            vcb.g_FrameJitter       = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 1.0f : 0.0f;
            vcb.g_ScreenSize        = new Vector4((float)m_ResolutionX, (float)m_ResolutionY, 1.0f / (float)m_ResolutionX, 1.0f / (float)m_ResolutionY);
            vcb.g_ScreenSizeHalfRes = new Vector4((float)m_ResolutionX / 2.0f, (float)m_ResolutionY / 2.0f, 2.0f / (float)m_ResolutionX, 2.0f / (float)m_ResolutionY);
            vcb.g_ReprojectInfo     = new Vector4(
                -2.0f / ((float)m_ResolutionX * m_ViewportCamera.m_ProjectionMatrix.M11),
                -2.0f / ((float)m_ResolutionY * m_ViewportCamera.m_ProjectionMatrix.M22),
                (1.0f - m_ViewportCamera.m_ProjectionMatrix.M13) / m_ViewportCamera.m_ProjectionMatrix.M11,
                (1.0f + m_ViewportCamera.m_ProjectionMatrix.M23) / m_ViewportCamera.m_ProjectionMatrix.M22);
            vcb.g_ReprojectInfoFromInt    = vcb.g_ReprojectInfo + new Vector4(0.0f, 0.0f, vcb.g_ReprojectInfo.X * 0.5f, vcb.g_ReprojectInfo.Y * 0.5f);
            mcb.g_ShadowViewProjMatrix    = m_ShadowCamera.m_ViewProjectionMatrix;
            mcb.g_ShadowInvViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix;
            mcb.g_ShadowInvViewProjMatrix.Invert();
            mcb.g_LightDir   = new Vector4(-m_ShadowCamera.m_CameraForward, 1.0f);
            mcb.g_LightColor = new Vector4(1.0f, 0.95f, 0.9f, 0.0f);

            float time = (float)Program.m_Time;

            mcb.g_LocalPointLightPosition = new Vector4((float)Math.Sin(0.05f * time) * 10.0f, 2.0f, (float)Math.Cos(time * 0.15f) * 5.8f, 0.0f);
            mcb.g_LocalPointLightColor    = new Vector4(1, 0, 0, 0);

            m_ViewportConstantBuffer.CompileAndBind(context);
            m_ForwardPassBuffer.CompileAndBind(context);
            m_CurrentViewportBuffer.CompileAndBind(context);
            m_PostEffectsConstantBuffer.CompileAndBind(context);
        }
Beispiel #2
0
        private void CalculateAndUpdateConstantBuffer(DeviceContext context)
        {
            Matrix previousFrameViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix;

            m_ViewportCamera.TickCamera(0.1f);

            dynamic mcb  = m_ForwardPassBuffer;
            dynamic vcb  = m_ViewportConstantBuffer;
            dynamic ppcb = m_PostEffectsConstantBuffer;
            dynamic cvpb = m_CurrentViewportBuffer;

            m_ViewportCamera.CalculateMatrices();
            m_ShadowCamera.CalculateMatrices();

            // Temporal component of matrix
            Matrix temporalJitter = Matrix.Identity;

            if (vcb.temporalAA > 0.5f)
            {
                System.Random rand = new System.Random();
                float         translationOffset  = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 0.5f : -0.5f;
                float         translationOffsetX = translationOffset;
                float         translationOffsetY = translationOffset;
                temporalJitter = Matrix.Translation(translationOffsetX / (float)m_ResolutionX, translationOffsetY / (float)m_ResolutionY, 0.0f);
            }
            m_ScatterDOFPass.m_DebugBokeh = ppcb.debugBokeh > 0.5f;

            Vector3 sceneMin, sceneMax;

            m_SimpleSceneWrapper.GetSceneBounds(out sceneMin, out sceneMax);

            vcb.viewProjMatrixPrevFrame = previousFrameViewProjMatrix;
            cvpb.projMatrix             = m_ViewportCamera.m_ProjectionMatrix;
            cvpb.viewMatrix             = m_ViewportCamera.m_WorldToView;
            cvpb.invViewProjMatrix      = m_ViewportCamera.m_ViewProjectionMatrix;
            cvpb.invViewProjMatrix.Invert();
            cvpb.viewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix * temporalJitter;
            vcb.worldEyePos     = new Vector4(m_ViewportCamera.m_CameraPosition, 1.0f);
            vcb.worldBoundsMin  = new Vector4(sceneMin, 0.0f);
            vcb.worldBoundsMax  = new Vector4(sceneMax, 0.0f);
            Vector3 invRange = new Vector3(1.0f / (sceneMax.X - sceneMin.X), 1.0f / (sceneMax.Y - sceneMin.Y), 1.0f / (sceneMax.Z - sceneMin.Z));

            vcb.worldBoundsInvRange = new Vector4(invRange, 0.0f);
            vcb.zNear             = m_ViewportCamera.m_NearZ;
            vcb.zFar              = m_ViewportCamera.m_FarZ;
            vcb.screenSize        = new Vector4((float)m_ResolutionX, (float)m_ResolutionY, 1.0f / (float)m_ResolutionX, 1.0f / (float)m_ResolutionY);
            vcb.screenSizeHalfRes = new Vector4((float)m_ResolutionX / 2.0f, (float)m_ResolutionY / 2.0f, 2.0f / (float)m_ResolutionX, 2.0f / (float)m_ResolutionY);
            vcb.reprojectInfo     = new Vector4(
                -2.0f / ((float)m_ResolutionX * m_ViewportCamera.m_ProjectionMatrix.M11),
                -2.0f / ((float)m_ResolutionY * m_ViewportCamera.m_ProjectionMatrix.M22),
                (1.0f - m_ViewportCamera.m_ProjectionMatrix.M13) / m_ViewportCamera.m_ProjectionMatrix.M11,
                (1.0f + m_ViewportCamera.m_ProjectionMatrix.M23) / m_ViewportCamera.m_ProjectionMatrix.M22);
            vcb.reprojectInfoFromInt    = vcb.reprojectInfo + new Vector4(0.0f, 0.0f, vcb.reprojectInfo.X * 0.5f, vcb.reprojectInfo.Y * 0.5f);
            mcb.shadowViewProjMatrix    = m_ShadowCamera.m_ViewProjectionMatrix;
            mcb.shadowInvViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix;
            mcb.shadowInvViewProjMatrix.Invert();
            mcb.lightDir = new Vector4(-m_ShadowCamera.m_CameraForward, 1.0f);

            m_ViewportConstantBuffer.CompileAndBind(context);
            m_ForwardPassBuffer.CompileAndBind(context);
            m_CurrentViewportBuffer.CompileAndBind(context);
            m_PostEffectsConstantBuffer.CompileAndBind(context);
        }