Beispiel #1
0
	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;
		}
	}