vault backup: 2024-12-12 19:11:10
This commit is contained in:
parent
1bae223199
commit
976a4e8810
@ -218,7 +218,174 @@ void FSceneRenderer::InitDynamicShadows(FRHICommandListImmediate& RHICmdList, FG
|
||||
- **FProjectedShadowInfo::RenderTranslucencyDepths**
|
||||
|
||||
## RenderDepth
|
||||
FShadowParallelCommandListSet
|
||||
MeshDrawProcessor为***FShadowDepthPassMeshProcessor***。渲染的Shader为ShadowDepthPixelShader.usf
|
||||
```c++
|
||||
void FProjectedShadowInfo::RenderDepth(
|
||||
FRDGBuilder& GraphBuilder,
|
||||
const FSceneRenderer* SceneRenderer,
|
||||
FRDGTextureRef ShadowDepthTexture,
|
||||
bool bDoParallelDispatch,
|
||||
bool bDoCrossGPUCopy)
|
||||
{
|
||||
#if WANTS_DRAW_MESH_EVENTS
|
||||
FString EventName;
|
||||
|
||||
if (GetEmitDrawEvents())
|
||||
{
|
||||
GetShadowTypeNameForDrawEvent(EventName);
|
||||
EventName += FString(TEXT(" ")) + FString::FromInt(ResolutionX) + TEXT("x") + FString::FromInt(ResolutionY);
|
||||
}
|
||||
|
||||
RDG_EVENT_SCOPE(GraphBuilder, "%s", *EventName);
|
||||
#endif
|
||||
|
||||
CONDITIONAL_SCOPE_CYCLE_COUNTER(STAT_RenderWholeSceneShadowDepthsTime, bWholeSceneShadow);
|
||||
CONDITIONAL_SCOPE_CYCLE_COUNTER(STAT_RenderPerObjectShadowDepthsTime, !bWholeSceneShadow);
|
||||
QUICK_SCOPE_CYCLE_COUNTER(STAT_RenderShadowDepth);
|
||||
|
||||
FScene* Scene = SceneRenderer->Scene;
|
||||
const ERHIFeatureLevel::Type FeatureLevel = ShadowDepthView->FeatureLevel;
|
||||
BeginRenderView(GraphBuilder, Scene);
|
||||
|
||||
FShadowDepthPassParameters* PassParameters = GraphBuilder.AllocParameters<FShadowDepthPassParameters>();
|
||||
PassParameters->View = ShadowDepthView->ViewUniformBuffer;
|
||||
PassParameters->RenderTargets.DepthStencil = FDepthStencilBinding(
|
||||
ShadowDepthTexture,
|
||||
ERenderTargetLoadAction::ELoad,
|
||||
ERenderTargetLoadAction::ENoAction,
|
||||
FExclusiveDepthStencil::DepthWrite_StencilNop);
|
||||
|
||||
if (CacheMode == SDCM_MovablePrimitivesOnly || CacheMode == SDCM_CSMScrolling)
|
||||
{
|
||||
// Copy in depths of static primitives before we render movable primitives.
|
||||
FMeshPassProcessorRenderState DrawRenderState;
|
||||
SetStateForShadowDepth(bOnePassPointLightShadow, bDirectionalLight, DrawRenderState, MeshPassTargetType);
|
||||
CopyCachedShadowMap(GraphBuilder, *ShadowDepthView, SceneRenderer, PassParameters->RenderTargets, DrawRenderState);
|
||||
}
|
||||
|
||||
PassParameters->VirtualShadowMap = SceneRenderer->VirtualShadowMapArray.GetUniformBuffer();
|
||||
|
||||
switch (FSceneInterface::GetShadingPath(FeatureLevel))
|
||||
{
|
||||
case EShadingPath::Deferred:
|
||||
{
|
||||
auto* ShadowDepthPassParameters = GraphBuilder.AllocParameters<FShadowDepthPassUniformParameters>();
|
||||
SetupShadowDepthPassUniformBuffer(this, GraphBuilder, *ShadowDepthView, *ShadowDepthPassParameters);//设置矩阵、Shader等相关ShadowDepthPassParameters参数
|
||||
PassParameters->DeferredPassUniformBuffer = GraphBuilder.CreateUniformBuffer(ShadowDepthPassParameters);
|
||||
}
|
||||
break;
|
||||
case EShadingPath::Mobile:
|
||||
{
|
||||
auto* ShadowDepthPassParameters = GraphBuilder.AllocParameters<FMobileShadowDepthPassUniformParameters>();
|
||||
SetupShadowDepthPassUniformBuffer(this, GraphBuilder, *ShadowDepthView, *ShadowDepthPassParameters);//设置矩阵、Shader等相关ShadowDepthPassParameters参数
|
||||
PassParameters->MobilePassUniformBuffer = GraphBuilder.CreateUniformBuffer(ShadowDepthPassParameters);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
checkNoEntry();
|
||||
}
|
||||
|
||||
ShadowDepthPass.BuildRenderingCommands(GraphBuilder, Scene->GPUScene, PassParameters->InstanceCullingDrawParams);
|
||||
|
||||
#if WITH_MGPU
|
||||
// Need to fetch GPU mask outside "AddPass", as it's not updated during pass execution
|
||||
FRHIGPUMask GPUMask = GraphBuilder.RHICmdList.GetGPUMask();
|
||||
#endif
|
||||
|
||||
if (bDoParallelDispatch)
|
||||
{
|
||||
RDG_WAIT_FOR_TASKS_CONDITIONAL(GraphBuilder, IsShadowDepthPassWaitForTasksEnabled());
|
||||
|
||||
GraphBuilder.AddPass(
|
||||
RDG_EVENT_NAME("ShadowDepthPassParallel"),
|
||||
PassParameters,
|
||||
ERDGPassFlags::Raster | ERDGPassFlags::SkipRenderPass,
|
||||
[this, PassParameters
|
||||
#if WITH_MGPU
|
||||
, ShadowDepthTexture, GPUMask, bDoCrossGPUCopy
|
||||
#endif
|
||||
](const FRDGPass* InPass, FRHICommandListImmediate& RHICmdList)
|
||||
{
|
||||
FShadowParallelCommandListSet ParallelCommandListSet(InPass, RHICmdList, *ShadowDepthView, *this, FParallelCommandListBindings(PassParameters));
|
||||
ShadowDepthPass.DispatchDraw(&ParallelCommandListSet, RHICmdList, &PassParameters->InstanceCullingDrawParams);
|
||||
|
||||
#if WITH_MGPU
|
||||
if (bDoCrossGPUCopy)
|
||||
{
|
||||
CopyCachedShadowMapCrossGPU(RHICmdList, ShadowDepthTexture->GetRHI(), GPUMask);
|
||||
}
|
||||
#endif
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
GraphBuilder.AddPass(
|
||||
RDG_EVENT_NAME("ShadowDepthPass"),
|
||||
PassParameters,
|
||||
ERDGPassFlags::Raster,
|
||||
[this, PassParameters
|
||||
#if WITH_MGPU
|
||||
, ShadowDepthTexture, GPUMask, bDoCrossGPUCopy
|
||||
#endif
|
||||
](FRHICommandList& RHICmdList)
|
||||
{
|
||||
SetStateForView(RHICmdList);
|
||||
ShadowDepthPass.DispatchDraw(nullptr, RHICmdList, &PassParameters->InstanceCullingDrawParams);
|
||||
|
||||
#if WITH_MGPU
|
||||
if (bDoCrossGPUCopy)
|
||||
{
|
||||
CopyCachedShadowMapCrossGPU(RHICmdList, ShadowDepthTexture->GetRHI(), GPUMask);
|
||||
}
|
||||
#endif
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```c++
|
||||
void SetupShadowDepthPassUniformBuffer(
|
||||
const FProjectedShadowInfo* ShadowInfo,
|
||||
FRDGBuilder& GraphBuilder,
|
||||
const FViewInfo& View,
|
||||
FShadowDepthPassUniformParameters& ShadowDepthPassParameters)
|
||||
{
|
||||
static const auto CSMCachingCVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.Shadow.CSMCaching"));
|
||||
const bool bCSMCachingEnabled = CSMCachingCVar && CSMCachingCVar->GetValueOnAnyThread() != 0;
|
||||
|
||||
SetupSceneTextureUniformParameters(GraphBuilder, View.GetSceneTexturesChecked(), View.FeatureLevel, ESceneTextureSetupMode::None, ShadowDepthPassParameters.SceneTextures);//设置对应的RT与Texture
|
||||
|
||||
ShadowDepthPassParameters.ProjectionMatrix = FTranslationMatrix44f(FVector3f(ShadowInfo->PreShadowTranslation - View.ViewMatrices.GetPreViewTranslation())) * ShadowInfo->TranslatedWorldToClipOuterMatrix; // LWC_TDOO: Precision loss?
|
||||
ShadowDepthPassParameters.ViewMatrix = FMatrix44f(ShadowInfo->TranslatedWorldToView); // LWC_TODO: Precision loss
|
||||
|
||||
// Disable the SlopeDepthBias because we couldn't reconstruct the depth offset if it is not 0.0f when scrolling the cached shadow map.
|
||||
ShadowDepthPassParameters.ShadowParams = FVector4f(ShadowInfo->GetShaderDepthBias(), bCSMCachingEnabled ? 0.0f : ShadowInfo->GetShaderSlopeDepthBias(), ShadowInfo->GetShaderMaxSlopeDepthBias(), ShadowInfo->bOnePassPointLightShadow ? 1 : ShadowInfo->InvMaxSubjectDepth);
|
||||
ShadowDepthPassParameters.bClampToNearPlane = ShadowInfo->ShouldClampToNearPlane() ? 1.0f : 0.0f;
|
||||
|
||||
if (ShadowInfo->bOnePassPointLightShadow)
|
||||
{
|
||||
check(ShadowInfo->BorderSize == 0);
|
||||
|
||||
// offset from translated world space to (pre translated) shadow space
|
||||
const FMatrix Translation = FTranslationMatrix(ShadowInfo->PreShadowTranslation - View.ViewMatrices.GetPreViewTranslation());
|
||||
|
||||
for (int32 FaceIndex = 0; FaceIndex < 6; FaceIndex++)
|
||||
{
|
||||
ShadowDepthPassParameters.ShadowViewProjectionMatrices[FaceIndex] = FMatrix44f(Translation * ShadowInfo->OnePassShadowViewProjectionMatrices[FaceIndex]); // LWC_TODO: Precision loss?
|
||||
ShadowDepthPassParameters.ShadowViewMatrices[FaceIndex] = FMatrix44f(Translation * ShadowInfo->OnePassShadowViewMatrices[FaceIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
ShadowDepthPassParameters.bRenderToVirtualShadowMap = false;
|
||||
ShadowDepthPassParameters.VirtualSmPageTable = GraphBuilder.CreateSRV(GSystemTextures.GetDefaultStructuredBuffer(GraphBuilder, sizeof(uint32)));
|
||||
ShadowDepthPassParameters.PackedNaniteViews = GraphBuilder.CreateSRV(GSystemTextures.GetDefaultStructuredBuffer(GraphBuilder, sizeof(Nanite::FPackedView)));
|
||||
ShadowDepthPassParameters.PageRectBounds = GraphBuilder.CreateSRV(GSystemTextures.GetDefaultStructuredBuffer(GraphBuilder, sizeof(FIntVector4)));
|
||||
|
||||
FRDGTextureRef DepthBufferArray = GraphBuilder.CreateTexture( FRDGTextureDesc::Create2DArray( FIntPoint(4,4), PF_R32_UINT, FClearValueBinding::None, TexCreate_ShaderResource | TexCreate_UAV, 1 ), TEXT("Dummy-OutDepthBuffer") );
|
||||
|
||||
ShadowDepthPassParameters.OutDepthBufferArray = GraphBuilder.CreateUAV( DepthBufferArray );
|
||||
}
|
||||
```
|
||||
|
||||
# Lights
|
||||
### Shader
|
||||
|
Loading…
x
Reference in New Issue
Block a user