Esempio n. 1
0
        public void ExecutePass(DeviceContext context, SimpleSceneWrapper sceneWrapper, Vector3 position)
        {
            //using (new GpuProfilePoint(context, "CubemapRender"))
            {
                context.PixelShader.SetShaderResource(m_GIVolumeR.m_ShaderResourceView, 5);
                context.PixelShader.SetShaderResource(m_GIVolumeG.m_ShaderResourceView, 6);
                context.PixelShader.SetShaderResource(m_GIVolumeB.m_ShaderResourceView, 7);

                CubemapRenderHelper.RenderCubemap(context, m_CubeObject, m_CubeObjectDepth, sceneWrapper, position, 50.0f, false, new Color4(1.0f, 0.75f, 0.75f, 1.0f));
            }

            //using (new GpuProfilePoint(context, "InitSH"))
            {
                context.PixelShader.SetShaderResource(m_CubeObject.m_ShaderResourceView, 0);
                m_InitialSHSet.BindAsRenderTarget(context);
                PostEffectHelper.RenderFullscreenTriangle(context, "GIInitSH");
                RenderTargetSet.BindNull(context);

                DownsamplePass(context, m_InitialSHSet, m_Downsampled16x16SHSetR, m_Downsampled16x16SHSetG, m_Downsampled16x16SHSetB);

                m_Downsampled16x16SHSetR.BindSRV(context, 0);
                m_Downsampled4x4SHSetR.BindAsRenderTarget(context);
                PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4");
                RenderTargetSet.BindNull(context);

                m_Downsampled16x16SHSetG.BindSRV(context, 0);
                m_Downsampled4x4SHSetG.BindAsRenderTarget(context);
                PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4");
                RenderTargetSet.BindNull(context);

                m_Downsampled16x16SHSetB.BindSRV(context, 0);
                m_Downsampled4x4SHSetB.BindAsRenderTarget(context);
                PostEffectHelper.RenderFullscreenTriangle(context, "Downsample4x4");
                RenderTargetSet.BindNull(context);

                Vector3 sceneMin, sceneMax;
                sceneWrapper.GetSceneBounds(out sceneMin, out sceneMax);
                Vector3 positionInVolume = position - sceneMin;
                positionInVolume.X = positionInVolume.X / (sceneMax.X - sceneMin.X);
                positionInVolume.Y = positionInVolume.Y / (sceneMax.Y - sceneMin.Y);
                positionInVolume.Z = positionInVolume.Z / (sceneMax.Z - sceneMin.Z);
                dynamic scb = m_GIConstantBuffer;
                scb.g_InjectPosition = new Vector4(new Vector3(positionInVolume.X * (float)(m_VolumeSizeX - 1), positionInVolume.Y * (float)(m_VolumeSizeY - 1), positionInVolume.Z * (float)(m_VolumeSizeZ - 1)), 0);
                m_GIConstantBuffer.CompileAndBind(context);

                m_Downsampled4x4SHSetR.BindSRV(context, 2);
                m_Downsampled4x4SHSetG.BindSRV(context, 3);
                m_Downsampled4x4SHSetB.BindSRV(context, 4);
                context.ComputeShader.SetUnorderedAccessView(m_GIVolumeR.m_UnorderedAccessView, 0);
                context.ComputeShader.SetUnorderedAccessView(m_GIVolumeG.m_UnorderedAccessView, 1);
                context.ComputeShader.SetUnorderedAccessView(m_GIVolumeB.m_UnorderedAccessView, 2);
                ShaderManager.ExecuteComputeForSize(context, 1, 1, 1, "InjectSHIntoVolume");

                ContextHelper.ClearCSContext(context);
            }
        }
Esempio n. 2
0
        private static void UpdateGlobalConstantBuffer(DeviceContext context, CustomConstantBufferInstance globalFrameConstantBuffer, CSharpRendererMainForm form)
        {
            dynamic gfcb = globalFrameConstantBuffer;
            Random  rand = new Random();

            gfcb.g_Time         = (float)m_Time;
            gfcb.g_FrameRandoms = new Vector4((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble());
            gfcb.g_FrameNumber  = m_FrameNumber;
            gfcb.g_GPUDebugOn   = SurfaceDebugManager.m_GPUDebugOn ? 1.0f : 0.0f;
            gfcb.g_GPUDebugOverridePositionEnable = form.GetGPUDebuggingOverridePos() ? 1.0f : 0.0f;
            gfcb.g_GPUDebugOverridePositionXYZ    = new Vector4((float)form.GetGPUDebuggingOverridePosX(), (float)form.GetGPUDebuggingOverridePosY(), (float)form.GetGPUDebuggingOverridePosZ(), 0.0f);
            globalFrameConstantBuffer.CompileAndBind(context);
        }
Esempio n. 3
0
        public void ExecutePass(DeviceContext context, RenderTargetSet target, RenderTargetSet linearDepth, RenderTargetSet motionVectors)
        {
            RenderTargetSet ssaoCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("SSAO");
            RenderTargetSet ssaoHistory = TemporalSurfaceManager.GetRenderTargetHistory("SSAO");

            RenderTargetSet tempBlurBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptor);

            Random rand = new Random();

            dynamic scb = m_SSAOBuffer;

            scb.g_SSAOPhase = (float)rand.NextDouble() * 3.1415f;
            m_SSAOBuffer.CompileAndBind(context);

            using (new GpuProfilePoint(context, "SSAO"))
            {
                using (new GpuProfilePoint(context, "SSAOCalculate"))
                {
                    linearDepth.BindSRV(context, 0);
                    ssaoHistory.BindSRV(context, 1);
                    motionVectors.BindSRV(context, 2);
                    ssaoCurrent.BindAsRenderTarget(context);
                    PostEffectHelper.RenderFullscreenTriangle(context, "SSAOCalculate");
                    RenderTargetSet.BindNull(context);
                    ContextHelper.ClearSRVs(context);
                }

                SurfaceDebugManager.RegisterDebug(context, "SSAOMain", ssaoCurrent);

                using (new GpuProfilePoint(context, "SSAOBlur"))
                {
                    ssaoCurrent.BindSRV(context, 1);
                    tempBlurBuffer.BindAsRenderTarget(context);
                    PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurHorizontal");
                    RenderTargetSet.BindNull(context);
                    ContextHelper.ClearSRVs(context);

                    SurfaceDebugManager.RegisterDebug(context, "SSAOBlurH", tempBlurBuffer);

                    tempBlurBuffer.BindSRV(context, 1);
                    target.BindAsRenderTarget(context);
                    PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurVertical");
                    RenderTargetSet.BindNull(context);
                    ContextHelper.ClearSRVs(context);

                    SurfaceDebugManager.RegisterDebug(context, "SSAOBlurV", target);
                }
            }

            RenderTargetManager.ReleaseRenderTargetToPool(tempBlurBuffer);
        }
        public static void GenerateCubemapMips(DeviceContext context, string shader, TextureObject targetTexture, TextureObject sourceTexture)
        {
            for (int m = 0; m < targetTexture.m_Mips; ++m)
            {
                for (int i = 0; i < 6; ++i)
                {
                    dynamic cdb = m_CubemapDownsampleBuffer;
                    cdb.g_Mip  = (float)m;
                    cdb.g_Face = i;
                    m_CubemapDownsampleBuffer.CompileAndBind(context);

                    RenderTargetSet.BindTextureAsRenderTarget(context, targetTexture.m_ArrayRenderTargetViews[m * 6 + i], null, targetTexture.m_Width >> m, targetTexture.m_Height >> m);
                    context.PixelShader.SetShaderResource(PostEffectHelper.m_RandomNumbersBuffer.m_ShaderResourceView, 39);
                    context.PixelShader.SetShaderResource(sourceTexture.m_ShaderResourceView, 0);
                    PostEffectHelper.RenderFullscreenTriangle(context, shader);
                    RenderTargetSet.BindNull(context);
                }
            }
        }
Esempio n. 5
0
        public static void RenderCubemap(DeviceContext context, TextureObject targetTexture, TextureObject targetDepth, SimpleSceneWrapper sceneWrapper, Vector3 position, float range, bool depthOnly = false, Color4 clearColor = new Color4())
        {
            //using (new GpuProfilePoint(context, "CubemapRendering"))
            {
                // some hardcoded near plane
                Matrix projectionMatrix = Matrix.PerspectiveFovLH((float)Math.PI / 2.0f, 1.0f, 0.05f, range);

                ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthCompare);

                // set the shaders
                context.VertexShader.Set(ShaderManager.GetVertexShader("VertexScene"));
                context.PixelShader.Set(depthOnly ? null : ShaderManager.GetPixelShader("PixelSceneSimple"));

                dynamic cvpb = m_CurrentViewportBuffer;

                for (int i = 0; i < 6; ++i)
                {
                    Vector3 lookAt = new Vector3();
                    Vector3 upVec  = new Vector3();

                    switch (i)
                    {
                    case 0:
                        lookAt = new Vector3(1.0f, 0.0f, 0.0f);
                        upVec  = new Vector3(0.0f, 1.0f, 0.0f);
                        break;

                    case 1:
                        lookAt = new Vector3(-1.0f, 0.0f, 0.0f);
                        upVec  = new Vector3(0.0f, 1.0f, 0.0f);
                        break;

                    case 2:
                        lookAt = new Vector3(0.0f, 1.0f, 0.0f);
                        upVec  = new Vector3(0.0f, 0.0f, -1.0f);
                        break;

                    case 3:
                        lookAt = new Vector3(0.0f, -1.0f, 0.0f);
                        upVec  = new Vector3(0.0f, 0.0f, 1.0f);
                        break;

                    case 4:
                        lookAt = new Vector3(0.0f, 0.0f, 1.0f);
                        upVec  = new Vector3(0.0f, 1.0f, 0.0f);
                        break;

                    case 5:
                        lookAt = new Vector3(0.0f, 0.0f, -1.0f);
                        upVec  = new Vector3(0.0f, 1.0f, 0.0f);
                        break;
                    }

                    Matrix viewMatrix = Matrix.LookAtLH(position, position + lookAt, upVec);

                    cvpb.g_ProjMatrix     = projectionMatrix;
                    cvpb.g_ViewMatrix     = viewMatrix;
                    cvpb.g_ViewProjMatrix = viewMatrix * projectionMatrix;

                    {
                        context.ClearRenderTargetView(targetTexture.m_ArrayRenderTargetViews[i], clearColor);
                        context.ClearDepthStencilView(targetDepth.m_ArrayDepthStencilViews[i], DepthStencilClearFlags.Depth, 1.0f, 0);

                        RenderTargetSet.BindTextureAsRenderTarget(context, targetTexture.m_ArrayRenderTargetViews[i], targetDepth.m_ArrayDepthStencilViews[i], targetTexture.m_Width, targetTexture.m_Height);

                        m_CurrentViewportBuffer.CompileAndBind(context);

                        // render triangles
                        sceneWrapper.Render(context);

                        RenderTargetSet.BindNull(context);
                    }
                }
                ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.NoDepth);
            }
        }
Esempio n. 6
0
        private static void UpdateGlobalConstantBuffer(DeviceContext context, CustomConstantBufferInstance globalFrameConstantBuffer, CSharpRendererMainForm form)
        {
            dynamic gfcb = globalFrameConstantBuffer;
            Random rand = new Random();

            gfcb.g_Time = (float)m_Time;
            if (!form.GetFreezeTime())
                gfcb.g_FrameRandoms = new Vector4((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble());

            gfcb.g_FrameNumber = m_FrameNumber;
            gfcb.g_GPUDebugOn = DebugManager.m_GPUDebugOn ? 1.0f : 0.0f;
            gfcb.g_GPUDebugOverridePositionEnable = form.GetGPUDebuggingOverridePos() ? 1.0f : 0.0f;
            gfcb.g_GPUDebugOverridePositionXYZ = new Vector4((float)form.GetGPUDebuggingOverridePosX(), (float)form.GetGPUDebuggingOverridePosY(), (float)form.GetGPUDebuggingOverridePosZ(), 0.0f);
            globalFrameConstantBuffer.CompileAndBind(context);
        }
Esempio n. 7
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);
        }
Esempio n. 8
0
        public void ExecutePass(DeviceContext context, RenderTargetSet target, RenderTargetSet linearDepth, RenderTargetSet motionVectors, RenderTargetSet surfaceNormals, DepthOperationsPass depthOps)
        {
            RenderTargetSet ssaoCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("SSAO");
            RenderTargetSet ssaoHistory = TemporalSurfaceManager.GetRenderTargetHistory("SSAO");

            if (DebugManager.IsFeatureOn("SSAO"))
            {
                RenderTargetSet tempBlurBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptor);

                Random rand = new Random();

                dynamic scb = m_SSAOBuffer;
                scb.g_SSAOPhase = (float)rand.NextDouble() * 3.1415f;
                m_SSAOBuffer.CompileAndBind(context);

                using (new GpuProfilePoint(context, "SSAO"))
                {
                    using (new GpuProfilePoint(context, "SSAOCalculate"))
                    {
                        linearDepth.BindSRV(context, 0);
                        ssaoHistory.BindSRV(context, 1);
                        motionVectors.BindSRV(context, 2);
                        surfaceNormals.BindSRV(context, 3);
                        ssaoCurrent.BindAsRenderTarget(context);
                        PostEffectHelper.RenderFullscreenTriangle(context, "SSAOCalculate");
                        RenderTargetSet.BindNull(context);
                        ContextHelper.ClearSRVs(context);
                    }

                    DebugManager.RegisterDebug(context, "SSAOMain", ssaoCurrent);

                    using (new GpuProfilePoint(context, "SSAOBlur"))
                    {
                        ssaoCurrent.BindSRV(context, 1);
                        tempBlurBuffer.BindAsRenderTarget(context);
                        PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurHorizontal");
                        RenderTargetSet.BindNull(context);
                        ContextHelper.ClearSRVs(context);

                        DebugManager.RegisterDebug(context, "SSAOBlurH", tempBlurBuffer);

                        tempBlurBuffer.BindSRV(context, 1);
                        target.BindAsRenderTarget(context);
                        PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurVertical");
                        RenderTargetSet.BindNull(context);
                        ContextHelper.ClearSRVs(context);

                        DebugManager.RegisterDebug(context, "SSAOBlurV", target);
                    }
                }

                RenderTargetManager.ReleaseRenderTargetToPool(tempBlurBuffer);
            }
            else
            {
                target.Clear(context, new SlimDX.Color4(1.0f, 1.0f, 1.0f, 1.0f));
            }

            if (DebugManager.IsDebugging("UpsampledSSAO"))
            {
                RenderTargetSet tempFullResBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_UpsampleDebugRTDescriptor);

                target.BindSRV(context, 0);
                depthOps.m_BilateralUpsampleOffsets.BindSRV(context, 10);
                tempFullResBuffer.BindAsRenderTarget(context);

                PostEffectHelper.RenderFullscreenTriangle(context, "BilateralUpsample");
                RenderTargetSet.BindNull(context);
                ContextHelper.ClearSRVs(context);

                DebugManager.RegisterDebug(context, "UpsampledSSAO", tempFullResBuffer);
                RenderTargetManager.ReleaseRenderTargetToPool(tempFullResBuffer);
            }
        }
Esempio n. 9
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);
        }