diff --git a/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md b/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md index 5206187..810abe0 100644 --- a/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md +++ b/03-UnrealEngine/卡通渲染相关资料/渲染功能/阴影控制/ToonShadow.md @@ -837,13 +837,70 @@ RDG_EVENT_SCOPE(GraphBuilder, "UnbatchedLights");//batchedLights为没有LightFu => for (int32 LightIndex = UnbatchedLightStart; LightIndex < LumenLightStart; LightIndex++) => -if (bDrawShadows){...} => ***RenderDeferredShadowProjections()*** +if (bDrawShadows){...} => RenderRayTracingShadows()/***RenderDeferredShadowProjections()*** => if (bDirectLighting){...} -if (bDirectLighting){...} +if (bDirectLighting){...} => RenderLight() +if (bUseHairLighting){...}=> RenderLightForHair() ## RenderDeferredShadowProjections() +```c++ +void FDeferredShadingSceneRenderer::RenderDeferredShadowProjections( + FRDGBuilder& GraphBuilder, + const FMinimalSceneTextures& SceneTextures, + const FTranslucencyLightingVolumeTextures& TranslucencyLightingVolumeTextures, + const FLightSceneInfo* LightSceneInfo, + FRDGTextureRef ScreenShadowMaskTexture, + FRDGTextureRef ScreenShadowMaskSubPixelTexture) +{ + CheckShadowDepthRenderCompleted(); + SCOPED_NAMED_EVENT(FDeferredShadingSceneRenderer_RenderShadowProjections, FColor::Emerald); + SCOPE_CYCLE_COUNTER(STAT_ProjectedShadowDrawTime); + RDG_EVENT_SCOPE(GraphBuilder, "ShadowProjectionOnOpaque"); + RDG_GPU_STAT_SCOPE(GraphBuilder, ShadowProjection); + + const FVisibleLightInfo& VisibleLightInfo = VisibleLightInfos[LightSceneInfo->Id]; + + const bool bProjectingForForwardShading = false; + RenderShadowProjections(GraphBuilder, SceneTextures, ScreenShadowMaskTexture, ScreenShadowMaskSubPixelTexture, LightSceneInfo, bProjectingForForwardShading); + ShadowSceneRenderer->ApplyVirtualShadowMapProjectionForLight(GraphBuilder, SceneTextures, LightSceneInfo, ScreenShadowMaskTexture, ScreenShadowMaskSubPixelTexture); + + RenderCapsuleDirectShadows(GraphBuilder, SceneTextures.UniformBuffer, *LightSceneInfo, ScreenShadowMaskTexture, VisibleLightInfo.CapsuleShadowsToProject, bProjectingForForwardShading); + + // Inject deep shadow mask for regular shadow map. When using virtual shadow map, it is directly handled in the shadow kernel. + if (HairStrands::HasViewHairStrandsData(Views)) + { + bool bNeedHairShadowMaskPass = false; + const bool bVirtualShadowOnePass = VisibleLightInfo.VirtualShadowMapClipmaps.Num() > 0; + if (!bVirtualShadowOnePass) + { + for (int32 ShadowIndex = 0; ShadowIndex < VisibleLightInfo.ShadowsToProject.Num(); ShadowIndex++) + { + FProjectedShadowInfo* ProjectedShadowInfo = VisibleLightInfo.ShadowsToProject[ShadowIndex]; + if (ProjectedShadowInfo->HasVirtualShadowMap()) + { + bNeedHairShadowMaskPass = false; + break; + } + else + { + bNeedHairShadowMaskPass = true; + break; + } + } + } + if (bNeedHairShadowMaskPass) + { + RenderHairStrandsShadowMask(GraphBuilder, Views, LightSceneInfo, false /*bForward*/, ScreenShadowMaskTexture); + } + } +} +``` + +RenderShadowProjections(): +1. 取得当前FVisibleLightInfo、FLightSceneProxy;创建FProjectedShadowInfoArray DistanceFieldShadows、NormalShadows。 +2. 遍历VisibleLightInfo.ShadowsToProject,按照阴影特征将每个FProjectedShadowInfo加入DistanceFieldShadows、NormalShadows。 # 半程阴影 由晨风&Neverwind提出: