| 815 | } |
| 816 | |
| 817 | Tr2GpuResourcePool::Texture Tr2LightManager::RenderRaytracedShadows( |
| 818 | Tr2RaytracingGeometry* geometry, |
| 819 | const Tr2TextureAL& depth, |
| 820 | const Tr2TextureAL& normal, |
| 821 | const CcpMath::Sphere* planets, |
| 822 | size_t planetCount, |
| 823 | Tr2GpuResourcePool& gpuResourcePool, |
| 824 | Tr2RenderContext& renderContext ) |
| 825 | { |
| 826 | renderContext.AddGpuMarker( __FUNCTION__ ); |
| 827 | GPU_REGION( renderContext, "Raytraced dynamic shadows" ); |
| 828 | CCP_STATS_ZONE( __FUNCTION__ ); |
| 829 | |
| 830 | if( m_shadowCastingLights.size() == 0 || !g_useDynamicLightsShadows ) |
| 831 | { |
| 832 | return {}; |
| 833 | } |
| 834 | |
| 835 | auto destTex = gpuResourcePool.GetTempTexture( "raytracing_dynamic_shadow_dest", depth.GetWidth(), depth.GetHeight(), Tr2RenderContextEnum::PIXEL_FORMAT_R16_UINT, Tr2GpuUsage::SHADER_RESOURCE | Tr2GpuUsage::UNORDERED_ACCESS ); |
| 836 | |
| 837 | // texture uav |
| 838 | m_Raytracing.m_effect->SetParameter( RtShadowMapTechniqueName, destTex ); |
| 839 | m_Raytracing.m_effect->SetParameter( RtNormalBufferTechniqueName, normal ); |
| 840 | ON_BLOCK_EXIT( [&] { m_Raytracing.m_effect->SetParameter( RtNormalBufferTechniqueName, Tr2TextureAL() ); } ); |
| 841 | |
| 842 | // scene srv |
| 843 | m_Raytracing.m_effect->SetParameter( RtSceneTechniqueName, geometry ); |
| 844 | |
| 845 | if( !m_Raytracing.m_effect->GetEffectRes() || !m_Raytracing.m_effect->GetEffectRes()->IsGood() ) |
| 846 | { |
| 847 | return {}; |
| 848 | } |
| 849 | |
| 850 | if( !geometry->HasGeometry() ) |
| 851 | { |
| 852 | return {}; |
| 853 | } |
| 854 | |
| 855 | uint32_t techniqueIndex; |
| 856 | if( !m_Raytracing.m_effect->GetShaderStateInterface()->GetTechniqueIndex( RtShadowTechniqueName, techniqueIndex ) ) |
| 857 | { |
| 858 | return {}; |
| 859 | } |
| 860 | |
| 861 | BlueSharedStringW rayGenName, missName; |
| 862 | m_Raytracing.m_pipelineManager.AddLibrary( rayGenName, missName, m_Raytracing.m_effect, RtShadowTechniqueName ); |
| 863 | |
| 864 | auto pipelineState = m_Raytracing.m_pipelineManager.GetPipelineState( renderContext ); |
| 865 | |
| 866 | if( !pipelineState.IsValid() ) |
| 867 | { |
| 868 | return {}; |
| 869 | } |
| 870 | |
| 871 | if( !m_Raytracing.m_perFrameData.IsValid() ) |
| 872 | { |
| 873 | m_Raytracing.m_perFrameData.Create( sizeof( RtShadowPerFrameData ), renderContext.GetPrimaryRenderContext() ); |
| 874 | } |
no test coverage detected