/////////////////////////////////////////////// //Motion Blur /////////////////////////////////////////////// AVOID DeferredRenderer::VGenerateVelocityMap(CameraPtr pCamera, Renderer* pRenderer, const Mat4x4 & viewproj) { //set screen-aligned quad m_pVertices->Set(0, 0); //set shaders m_pVelocityMapShaders->VBind(); //set shader resources m_gbuffer.BindPositionTex(0, ST_Pixel); //set render target m_pVelocityRTV->Set(); //set constant buffers //bind matrix constant buffer to the pipeline Mat4x4 trans; //trans.CreateTranslation(pCamera->GetLookAt() + 10000 * pCamera->GetDir()); trans.CreateTranslation(pCamera->GetPosition() + 500* pCamera->GetDir()); Mat4x4 rot; rot = rot.CreateRollPitchYaw(pCamera->GetRoll(), pCamera->GetPitch(), pCamera->GetYaw()); Mat4x4 WVP = rot * trans * pCamera->GetView() * CreateOrthoProjectionLH(SCREEN_WIDTH, SCREEN_HEIGHT, 1.0f, 1000.0f); WVP.Transpose(); m_pMatrixBuffer->UpdateSubresource(0, NULL, &WVP, 0, 0); m_pMatrixBuffer->Set(0, ST_Vertex); //set previous frame view-projection transform Mat4x4 currViewProj = viewproj; Mat4x4 prevViewProj = pCamera->GetPrevView() * pCamera->GetPrevProjection(); //prevViewProj = pCamera->GetView() * pCamera->GetProjection(); //prevViewProj = pCamera->GetProjection(); currViewProj.Transpose(); prevViewProj.Transpose(); //m_pcbPrevViewProj->UpdateSubresource(0, NULL, &prevViewProj, 0, 0); //m_pcbPrevViewProj->Set(0, ST_Pixel); struct TwoMatrices { Mat4x4 prevViewProj; Mat4x4 currViewProj; }; TwoMatrices temp; temp.prevViewProj =prevViewProj; temp.currViewProj = currViewProj; m_pcbWorldPlusWVP->UpdateSubresource(0, nullptr, &temp, 0, 0); m_pcbWorldPlusWVP->Set(0, ST_Pixel); //Finally render velocity map Draw(6, 0); //unbind views UnbindShaderResourceViews(0, 1, ST_Pixel); UnbindRenderTargetViews(1); }
AVOID DeferredRenderer::PrepareForLightPass(CameraPtr pCamera) { //set vertex buffer with positions m_pVertices->Set(0, 0); //set vertex buffer with texture data m_pTexCoords->Set(1, 0); //bind matrix constant buffer to the pipeline Mat4x4 trans; //trans.CreateTranslation(pCamera->GetLookAt() + 10000 * pCamera->GetDir()); trans.CreateTranslation(pCamera->GetPosition() + 500* pCamera->GetDir()); Mat4x4 rot; rot = rot.CreateRollPitchYaw(pCamera->GetRoll(), pCamera->GetPitch(), pCamera->GetYaw()); Mat4x4 WVP = rot * trans * pCamera->GetView() * CreateOrthoProjectionLH(SCREEN_WIDTH, SCREEN_HEIGHT, 1.0f, 1000.0f); WVP.Transpose(); m_pMatrixBuffer->UpdateSubresource(0, NULL, &WVP, 0, 0); m_pMatrixBuffer->Set(0, ST_Vertex); struct CameraBuffer { Mat4x4 inverseViewProjection; Vec pos; }; CameraBuffer cameraBuffer; Mat4x4 inverseViewProjection = pCamera->GetViewProjection(); inverseViewProjection.Inverse(); cameraBuffer.pos = pCamera->GetPosition(); cameraBuffer.inverseViewProjection = inverseViewProjection; cameraBuffer.inverseViewProjection.Transpose(); m_pcbCameraPos->UpdateSubresource(0, nullptr, &pCamera->GetPosition(), 0, 0); //m_pcbCameraPos->UpdateSubresource(0, NULL, &cameraBuffer, 0, 0); m_pcbCameraPos->Set(0, ST_Pixel); //pCamera->SetViewport(); SetGlobalViewport(); //set shader resources m_pSSAOBlurredSRV->Set(6, ST_Pixel); m_pDepthSRV->Set(8, ST_Pixel); //set blending functionality //this->BlendLightPass()->Set(nullptr); }