void ShadowsApp::RenderMainPass() { PIXEvent event(L"Main Pass"); ID3D11DeviceContextPtr context = deviceManager.ImmediateContext(); ID3D11RenderTargetView* renderTargets[1] = { NULL }; ID3D11DepthStencilView* ds = depthBuffer.DSView; context->OMSetRenderTargets(1, renderTargets, ds); D3D11_VIEWPORT vp; vp.Width = static_cast<float>(colorTarget.Width); vp.Height = static_cast<float>(colorTarget.Height); vp.TopLeftX = 0.0f; vp.TopLeftY = 0.0f; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; context->RSSetViewports(1, &vp); float clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; context->ClearRenderTargetView(colorTarget.RTView, clearColor); context->ClearDepthStencilView(ds, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0); Float4x4 meshWorld = Float4x4::ScaleMatrix(MeshScales[AppSettings::CurrentScene]); Float4x4 characterWorld = Float4x4::ScaleMatrix(CharacterScale); Float4x4 characterOrientation = Quaternion::ToFloat4x4(AppSettings::CharacterOrientation); characterWorld = characterWorld * characterOrientation; characterWorld.SetTranslation(CharacterPos); { ProfileBlock block(L"Depth Prepass"); if(AppSettings::GPUSceneSubmission) meshRenderer.RenderDepthGPU(context, camera, meshWorld, characterWorld, false); else meshRenderer.RenderDepthCPU(context, camera, meshWorld, characterWorld, false); } if(AppSettings::AutoComputeDepthBounds) meshRenderer.ReduceDepth(context, depthBuffer.SRView, camera); if(AppSettings::GPUSceneSubmission) meshRenderer.RenderShadowMapGPU(context, camera, meshWorld, characterWorld); else meshRenderer.RenderShadowMap(context, camera, meshWorld, characterWorld); renderTargets[0] = colorTarget.RTView; context->OMSetRenderTargets(1, renderTargets, ds); context->RSSetViewports(1, &vp); Float3 lightDir = AppSettings::LightDirection; meshRenderer.Render(context, camera, meshWorld, characterWorld); skybox.RenderSky(context, lightDir, true, camera.ViewMatrix(), camera.ProjectionMatrix()); }
void ShadowsApp::Render(const Timer& timer) { ID3D11DeviceContextPtr context = deviceManager.ImmediateContext(); AppSettings::UpdateCBuffer(context); RenderMainPass(); if(colorTarget.MultiSamples > 1) context->ResolveSubresource(resolveTarget.Texture, 0, colorTarget.Texture, 0, colorTarget.Format); // Kick off post-processing D3DPERF_BeginEvent(0xFFFFFFFF, L"Post Processing"); PostProcessor::Constants constants; constants.BloomThreshold = AppSettings::BloomThreshold; constants.BloomMagnitude = AppSettings::BloomMagnitude; constants.BloomBlurSigma = AppSettings::BloomBlurSigma; constants.Tau = AppSettings::AdaptationRate; constants.KeyValue = AppSettings::KeyValue; constants.TimeDelta = timer.DeltaSecondsF(); postProcessor.SetConstants(constants); postProcessor.Render(context, resolveTarget.SRView, deviceManager.BackBuffer()); D3DPERF_EndEvent(); // postProcessor.DrawDepthBuffer(depthBuffer, deviceManager.BackBuffer()); ID3D11RenderTargetView* renderTargets[1] = { deviceManager.BackBuffer() }; context->OMSetRenderTargets(1, renderTargets, NULL); D3D11_VIEWPORT vp; vp.Width = static_cast<float>(deviceManager.BackBufferWidth()); vp.Height = static_cast<float>(deviceManager.BackBufferHeight()); vp.TopLeftX = 0; vp.TopLeftY = 0; vp.MinDepth = 0; vp.MaxDepth = 1; context->RSSetViewports(1, &vp); //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ /*spriteRenderer.Begin(context, SpriteRenderer::Linear); ID3D11ShaderResourceView* srv = meshRenderer.ShadowMap().SRView; D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; srv->GetDesc(&srvDesc); srvDesc.Texture2DArray.ArraySize = 1; ID3D11ShaderResourceViewPtr newSrv; deviceManager.Device()->CreateShaderResourceView(meshRenderer.ShadowMap().Texture, &srvDesc, &newSrv); spriteRenderer.Render(newSrv, Float4x4()); spriteRenderer.End();*/ RenderHUD(); }
void DirectX11RenderContext::SetRenderTarget() { Context->OMSetRenderTargets(1, &backBufferView.GetInterfacePtr(), nullptr); D3D11_TEXTURE2D_DESC desc; backBuffer->GetDesc(&desc); // Setup the viewport D3D11_VIEWPORT vp = { 0.0f, 0.0f, (FLOAT)desc.Width, (FLOAT)desc.Height, 0.0f, 1.0f }; Context->RSSetViewports(1, &vp); }