const Vec3& GetPosition() const { if (mOverridingCamera){ return mOverridingCamera->GetPosition(); } return mTransformation.GetTranslation(); }
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); }
AVOID DeferredRenderer::PrepareForGeometryPass(CameraPtr pCamera) { m_pcbCameraPos->UpdateSubresource(0, NULL, &pCamera->GetPosition(), 0, 0); m_pcbCameraPos->Set(0, ST_Pixel); //pCamera->SetViewport(); SetGlobalViewport(); }
/////////////////////////////////////////////// //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); }
void EditThisParticle(const char* file){ if (mEditingParticle) mEditingParticle->StopImmediate(); bool numeric = IsNumeric(file); std::string fullpath; if (numeric) { fullpath = FindParticleNameWithID("data/particles", StringConverter::ParseInt(file)); } else { fullpath = file; fullpath += ".particle"; } ParticleEmitterPtr pnew = 0; if (strcmp(file, "0")) pnew = GetParticleEmitter(fullpath.c_str()); auto& renderer = Renderer::GetInstance(); if (pnew) { mEditingParticle = pnew; Logger::Log(FB_DEFAULT_LOG_ARG, FormatString("Editing : %s", fullpath.c_str()).c_str()); auto rt = renderer.GetMainRenderTarget(); assert(rt); if (!mOriginalCamera){ mOriginalCamera = rt->ReplaceCamera(mOverridingCamera); *mOverridingCamera = *mOriginalCamera; } mEditingParticle->SetPosition(mOverridingCamera->GetPosition() + mOverridingCamera->GetDirection() * 4.f); mEditingParticle->Active(true); mOverridingCamera->SetTarget(mEditingParticle); mOverridingCamera->SetEnalbeInput(true); } else if (strcmp(file, "0") == 0) { mEditingParticle->StopImmediate(); mEditingParticle = 0; auto rt = renderer.GetMainRenderTarget(); assert(rt); if (mOriginalCamera){ rt->ReplaceCamera(mOriginalCamera); mOriginalCamera = 0; } Logger::Log(FB_ERROR_LOG_ARG, "Exit particle editor"); } else { Logger::Log(FB_ERROR_LOG_ARG, FormatString("Cannot find the particle %s", fullpath.c_str()).c_str()); } }
AVOID DeferredRenderer::VRenderSky(CameraPtr pCamera, const Mat4x4 & viewproj) { m_gbuffer.BindRenderTarget(3); //m_pSkyShaders->VBind(); m_pAtmoShaders->VBind(); Mat4x4 trans; trans.CreateTranslation(pCamera->GetPosition()); Mat4x4 scale; scale.CreateScaling(1, 1, 1); //Mat4x4 worldViewProj = trans * viewproj; Mat4x4 worldViewProj = scale * viewproj; worldViewProj.Transpose(); m_pcbWVP->UpdateSubresource(0, nullptr, &worldViewProj, 0, 0); m_pcbWVP->Set(1, ST_Vertex); struct WorldData { Mat4x4 wvp; //Vec cameraPos; }; WorldData worldData; worldData.wvp = worldViewProj; //worldData.cameraPos = pCamera->GetPosition(); //m_pcbAtmoWorld->UpdateSubresource(0, nullptr, &worldData, 0, 0); //m_pcbAtmoWorld->Set(1, ST_Vertex); m_pSphereMesh->SetPositionBuffer(); m_pSphereMesh->SetIndexBuffer(); this->NoCullingStandardRasterizer()->Set(); this->m_pDepthDisableStencilDisable->Set(0xFF); //m_pSkySRV->Set(0, ST_Pixel); m_pSphereMesh->VRender(this); UnbindRenderTargetViews(1); UnbindShaderResourceViews(0, 1, ST_Pixel); }