| 5 | namespace TEN::Renderer |
| 6 | { |
| 7 | void Renderer::DrawPostprocess(RenderTarget2D* renderTarget, RenderView& view, SceneRenderMode renderMode) |
| 8 | { |
| 9 | _doingFullscreenPass = true; |
| 10 | |
| 11 | SetBlendMode(BlendMode::Opaque); |
| 12 | SetCullMode(CullMode::CounterClockwise); |
| 13 | SetDepthState(DepthState::Write); |
| 14 | _context->RSSetViewports(1, &view.Viewport); |
| 15 | ResetScissor(); |
| 16 | |
| 17 | float screenFadeFactor = renderMode == SceneRenderMode::Full ? ScreenFadeCurrent : 1.0f; |
| 18 | float cinematicBarsHeight = renderMode == SceneRenderMode::Full ? CinematicBarsHeight : 0.0f; |
| 19 | |
| 20 | _stPostProcessBuffer.ScreenFadeFactor = screenFadeFactor; |
| 21 | _stPostProcessBuffer.CinematicBarsHeight = cinematicBarsHeight; |
| 22 | _stPostProcessBuffer.ViewportSize = Vector2i(_screenWidth, _screenHeight); |
| 23 | _stPostProcessBuffer.EffectStrength = _postProcessStrength; |
| 24 | _stPostProcessBuffer.Tint = _postProcessTint; |
| 25 | UpdateConstantBuffer(_stPostProcessBuffer, _cbPostProcessBuffer); |
| 26 | |
| 27 | _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); |
| 28 | _context->IASetInputLayout(_fullscreenTriangleInputLayout.Get()); |
| 29 | |
| 30 | unsigned int stride = sizeof(PostProcessVertex); |
| 31 | unsigned int offset = 0; |
| 32 | |
| 33 | _context->IASetVertexBuffers(0, 1, _fullscreenTriangleVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); |
| 34 | |
| 35 | _shaders.Bind(Shader::PostProcess); |
| 36 | |
| 37 | // *** START OF POST-PROCESSING CHAIN *** |
| 38 | |
| 39 | // Copy render target to post process render target. -------------------------------------------------------------------- |
| 40 | float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; |
| 41 | _context->ClearRenderTargetView(_postProcessRenderTarget[0].RenderTargetView.Get(), clearColor); |
| 42 | _context->OMSetRenderTargets(1, _postProcessRenderTarget[0].RenderTargetView.GetAddressOf(), nullptr); |
| 43 | |
| 44 | BindRenderTargetAsTexture(TextureRegister::ColorMap, &_renderTarget, SamplerStateRegister::PointWrap); |
| 45 | DrawTriangles(3, 0); |
| 46 | |
| 47 | // Ping-pong between two post-process render targets. |
| 48 | int currentRenderTarget = 0; |
| 49 | int destRenderTarget = 1; |
| 50 | |
| 51 | // Lens flares ---------------------------------------------------------------------------------------------------------- |
| 52 | _shaders.Bind(Shader::PostProcess); |
| 53 | |
| 54 | if (!view.LensFlaresToDraw.empty()) |
| 55 | { |
| 56 | _context->ClearRenderTargetView(_postProcessRenderTarget[destRenderTarget].RenderTargetView.Get(), clearColor); |
| 57 | _context->OMSetRenderTargets(1, _postProcessRenderTarget[destRenderTarget].RenderTargetView.GetAddressOf(), nullptr); |
| 58 | |
| 59 | _shaders.Bind(Shader::PostProcessLensFlare); |
| 60 | |
| 61 | for (int i = 0; i < view.LensFlaresToDraw.size(); i++) |
| 62 | { |
| 63 | _stPostProcessBuffer.LensFlares[i].Position = view.LensFlaresToDraw[i].Position; |
| 64 | _stPostProcessBuffer.LensFlares[i].Color = view.LensFlaresToDraw[i].Color.ToVector3(); |