Renders all meshes in the model, with shadows
| 446 | |
| 447 | // Renders all meshes in the model, with shadows |
| 448 | void MeshRenderer::RenderMainPass(ID3D12GraphicsCommandList* cmdList, const Camera& camera, const MainPassData& mainPassData) |
| 449 | { |
| 450 | PIXMarker marker(cmdList, "Mesh Rendering"); |
| 451 | |
| 452 | uint64 numVisible = 0; |
| 453 | if(AppSettings::SortByDepth) |
| 454 | numVisible = CullMeshesAndSort(camera, meshBoundingBoxes, meshZDepths, meshDrawIndices); |
| 455 | else |
| 456 | numVisible = CullMeshes(camera, meshBoundingBoxes, meshDrawIndices); |
| 457 | |
| 458 | cmdList->SetGraphicsRootSignature(mainPassRootSignature); |
| 459 | cmdList->SetPipelineState(mainPassPSO); |
| 460 | cmdList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); |
| 461 | |
| 462 | Float4x4 world; |
| 463 | |
| 464 | // Set constant buffers |
| 465 | meshVSConstants.Data.World = world; |
| 466 | meshVSConstants.Data.View = camera.ViewMatrix(); |
| 467 | meshVSConstants.Data.WorldViewProjection = world * camera.ViewProjectionMatrix(); |
| 468 | meshVSConstants.Upload(); |
| 469 | meshVSConstants.SetAsGfxRootParameter(cmdList, MainPassVSCBuffer); |
| 470 | |
| 471 | meshPSConstants.Data.SunDirectionWS = AppSettings::SunDirection; |
| 472 | meshPSConstants.Data.SunIrradiance = mainPassData.SkyCache->SunIrradiance; |
| 473 | meshPSConstants.Data.CosSunAngularRadius = std::cos(DegToRad(AppSettings::SunSize)); |
| 474 | meshPSConstants.Data.SinSunAngularRadius = std::sin(DegToRad(AppSettings::SunSize)); |
| 475 | meshPSConstants.Data.CameraPosWS = camera.Position(); |
| 476 | |
| 477 | meshPSConstants.Data.CursorDecalPos = mainPassData.CursorDecal.Position; |
| 478 | meshPSConstants.Data.CursorDecalIntensity = mainPassData.CursorDecalIntensity; |
| 479 | meshPSConstants.Data.CursorDecalOrientation = mainPassData.CursorDecal.Orientation; |
| 480 | meshPSConstants.Data.CursorDecalSize = mainPassData.CursorDecal.Size; |
| 481 | meshPSConstants.Data.CursorDecalType = mainPassData.CursorDecal.Type; |
| 482 | meshPSConstants.Data.NumXTiles = uint32(AppSettings::NumXTiles); |
| 483 | meshPSConstants.Data.NumXYTiles = uint32(AppSettings::NumXTiles * AppSettings::NumYTiles); |
| 484 | meshPSConstants.Data.NearClip = camera.NearClip(); |
| 485 | meshPSConstants.Data.FarClip = camera.FarClip(); |
| 486 | |
| 487 | meshPSConstants.Data.SkySH = mainPassData.SkyCache->SH; |
| 488 | meshPSConstants.Upload(); |
| 489 | meshPSConstants.SetAsGfxRootParameter(cmdList, MainPassPSCBuffer); |
| 490 | |
| 491 | sunShadowConstants.Upload(); |
| 492 | sunShadowConstants.SetAsGfxRootParameter(cmdList, MainPassShadowCBuffer); |
| 493 | |
| 494 | AppSettings::BindCBufferGfx(cmdList, MainPassAppSettings); |
| 495 | |
| 496 | D3D12_CPU_DESCRIPTOR_HANDLE psSRVs[] = |
| 497 | { |
| 498 | sunShadowMap.SRV(), |
| 499 | spotLightShadowMap.SRV(), |
| 500 | spotLightShadowMatrices.SRV(), |
| 501 | materialTextureIndices.SRV(), |
| 502 | mainPassData.DecalBuffer->SRV(), |
| 503 | mainPassData.DecalClusterBuffer->SRV(), |
| 504 | mainPassData.SpotLightBuffer->SRV(), |
| 505 | mainPassData.SpotLightClusterBuffer->SRV(), |
no test coverage detected