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); }
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); }