void Engine::Pulse() { this->window_->Pulse(); F32 clearColour[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; for (auto& rt : this->renderTargetViews_) ImmediateContext->ClearRenderTargetView(rt, clearColour); ImmediateContext->ClearDepthStencilView( this->depthStencilView_, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0); ID3D11ShaderResourceView* views[2] = {}; ImmediateContext->PSSetSamplers(0, 1, &this->samplerState_.p); ImmediateContext->PSSetShaderResources(0, 2, views); // Activate g-buffer render targets ImmediateContext->OMSetRenderTargets( this->renderTargetViews_.size() - 1, reinterpret_cast<ID3D11RenderTargetView**>( &this->renderTargetViews_[1].p), this->depthStencilView_); auto freeCamera = static_cast<FreeCamera*>(this->camera_.get()); freeCamera->Update(); vertexShader.Activate(); gridPixelShader.Activate(); floorMesh.Draw(); // Draw rotating gizmo pixelShader.Activate(); auto seconds = this->timer_.GetSeconds(); gizmoMesh.SetPositionAngle(Vec3(1,1,1), Quat(Vec3(0, seconds, 0))); gizmoMesh.Draw(); // Draw stationary gizmo gizmoMesh.SetPositionAngle(Vec3(0,1,0), Quat()); gizmoMesh.Draw(); // Activate backbuffer ImmediateContext->OMSetRenderTargets( 1, &this->renderTargetViews_[0].p, this->depthStencilView_); ImmediateContext->PSSetShaderResources(0, this->renderTargetResourceViews_.size(), reinterpret_cast<ID3D11ShaderResourceView**>(this->renderTargetResourceViews_.data())); // Draw composite view to backbuffer this->SetDepthEnabled(false); identityVertexShader.Activate(); compositePixelShader.Activate(); screenMesh.SetScale(1.0f); screenMesh.SetPosition(Vec3(0.0f, 0.0f, 0.0f)); screenMesh.Draw(); // Draw the source views on top texturePixelShader.Activate(); for (U32 i = 0; i < this->renderTargetResourceViews_.size(); i++) { ImmediateContext->PSSetShaderResources(0, 1, &this->renderTargetResourceViews_[i].p); screenMesh.SetScale(0.25f); screenMesh.SetPosition(Vec3(-3.0f + i * 2.0f, 3.0f, 0.0f)); screenMesh.Draw(); } this->SetDepthEnabled(true); SwapChain->Present(0, 0); this->frameCount_++; if (this->fpsTimer_.GetSeconds() > 5) { LogInfo("FPS: %.01f", this->frameCount_ / this->fpsTimer_.GetSeconds()); this->fpsTimer_.Restart(); this->frameCount_ = 0; } }