Renders meshes using cascaded shadow mapping
| 678 | |
| 679 | // Renders meshes using cascaded shadow mapping |
| 680 | void MeshRenderer::RenderSunShadowMap(ID3D12GraphicsCommandList* cmdList, const Camera& camera) |
| 681 | { |
| 682 | PIXMarker marker(cmdList, L"Sun Shadow Map Rendering"); |
| 683 | CPUProfileBlock cpuProfileBlock("Sun Shadow Map Rendering"); |
| 684 | ProfileBlock profileBlock(cmdList, "Sun Shadow Map Rendering"); |
| 685 | |
| 686 | OrthographicCamera cascadeCameras[NumCascades]; |
| 687 | PrepareShadowCascades(AppSettings::SunDirection, SunShadowMapSize, true, camera, sunShadowConstants.Data, cascadeCameras); |
| 688 | |
| 689 | sunShadowMap.MakeWritable(cmdList); |
| 690 | |
| 691 | // Render the meshes to each cascade |
| 692 | for(uint64 cascadeIdx = 0; cascadeIdx < NumCascades; ++cascadeIdx) |
| 693 | { |
| 694 | PIXMarker cascadeMarker(cmdList, MakeString(L"Rendering Shadow Map Cascade %u", cascadeIdx).c_str()); |
| 695 | |
| 696 | // Set the viewport |
| 697 | DX12::SetViewport(cmdList, SunShadowMapSize, SunShadowMapSize); |
| 698 | |
| 699 | // Set the shadow map as the depth target |
| 700 | D3D12_CPU_DESCRIPTOR_HANDLE dsv = sunShadowMap.ArrayDSVs[cascadeIdx].CPUHandle; |
| 701 | cmdList->OMSetRenderTargets(0, nullptr, false, &dsv); |
| 702 | cmdList->ClearDepthStencilView(dsv, D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 1.0f, 0, 0, nullptr); |
| 703 | |
| 704 | // Draw the mesh with depth only, using the new shadow camera |
| 705 | RenderSunShadowDepth(cmdList, cascadeCameras[cascadeIdx]); |
| 706 | } |
| 707 | |
| 708 | sunShadowMap.MakeReadable(cmdList); |
| 709 | } |
| 710 | |
| 711 | // Render shadows for all spot lights |
| 712 | void MeshRenderer::RenderSpotLightShadowMap(ID3D12GraphicsCommandList* cmdList, const Camera& camera) |
no test coverage detected