ShowFlag.DynamicShadows
ShowFlag.DynamicShadows
#Overview
name: ShowFlag.DynamicShadows
This variable is created as a Console Variable (cvar).
- type:
Var
- help:
Allows to override a specific showflag (works in editor and game, \
It is referenced in 27
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of ShowFlag.DynamicShadows is to control the rendering of dynamic shadows in Unreal Engine 5. Dynamic shadows are real-time shadows that update based on the movement of objects and light sources in the scene.
This setting variable is primarily used by the rendering system, specifically for the lighting and shadow components. Based on the callsites, several Unreal Engine subsystems and modules rely on this variable, including:
- The Deferred Shading Renderer
- The Mobile Shading Renderer
- The Composure plugin
- The Water plugin
- The Capsule Shadow Rendering system
- The Distance Field Shadowing system
The value of this variable is typically set through the engine’s show flags system, which allows developers to toggle various rendering features on and off. It can be accessed and modified through the FEngineShowFlags struct.
Several other variables interact with ShowFlag.DynamicShadows, including:
- ViewFamily.EngineShowFlags.DynamicShadows (the associated variable)
- ViewFamily.EngineShowFlags.CapsuleShadows
- GetShadowQuality()
Developers should be aware of the following when using this variable:
- It affects performance, as dynamic shadows are computationally expensive.
- It interacts with other shadow-related settings, such as shadow quality and specific shadow types (e.g., capsule shadows).
- It’s used in conjunction with other rendering features like volumetric fog and ray tracing.
Best practices when using this variable include:
- Consider the performance impact when enabling dynamic shadows, especially on mobile platforms.
- Use it in combination with other shadow quality settings to achieve the desired balance between visual quality and performance.
- Be aware of how it interacts with different lighting types (directional, point, spot) and other rendering features.
Regarding the associated variable DynamicShadows:
The purpose of DynamicShadows is the same as ShowFlag.DynamicShadows, as they share the same value. It’s typically accessed through ViewFamily.EngineShowFlags.DynamicShadows.
This variable is used in various rendering-related functions and classes, such as FComposureUtils, FSceneRenderer, and FDeferredShadingSceneRenderer. It’s primarily used to determine whether dynamic shadows should be rendered in different parts of the rendering pipeline.
The value is typically set through the engine’s show flags system, similar to ShowFlag.DynamicShadows.
Developers should be aware that this variable is used in conjunction with other rendering settings and can significantly impact performance. It’s important to consider the trade-off between visual quality and rendering speed when enabling or disabling dynamic shadows.
Best practices for using this variable are similar to those for ShowFlag.DynamicShadows, focusing on balancing visual quality with performance and considering the specific requirements of your project and target platforms.
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl:187
Scope: file
Source code excerpt:
SHOWFLAG_ALWAYS_ACCESSIBLE(InstancedGrass, SFG_Advanced, NSLOCTEXT("UnrealEd", "InstancedGrassSF", "Grass"))
/** non baked shadows, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_ALWAYS_ACCESSIBLE(DynamicShadows, SFG_LightingComponents, NSLOCTEXT("UnrealEd", "DynamicShadowsSF", "Dynamic Shadows"))
/** Particles, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_ALWAYS_ACCESSIBLE(Particles, SFG_Normal, NSLOCTEXT("UnrealEd", "ParticlesSF", "Particle Sprites"))
/** Niagara, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_FIXED_IN_SHIPPING(1, Niagara, SFG_Advanced, NSLOCTEXT("UnrealEd", "NiagaraSF", "Niagara Renderers"))
/** HeterogeneousVolumes, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_FIXED_IN_SHIPPING(1, HeterogeneousVolumes, SFG_Advanced, NSLOCTEXT("UnrealEd", "HeterogeneousVolumesSF", "Heterogeneous Volumes"))
#Associated Variable and Callsites
This variable is associated with another variable named DynamicShadows
. They share the same value. See the following C++ source code.
#Loc: <Workspace>/Engine/Plugins/Compositing/Composure/Source/Composure/Private/ComposureUtils.cpp:8
Scope (from outer to inner):
file
function void FComposureUtils::SetEngineShowFlagsForPostprocessingOnly
Source code excerpt:
void FComposureUtils::SetEngineShowFlagsForPostprocessingOnly(FEngineShowFlags& EngineShowFlags)
{
EngineShowFlags.DynamicShadows = false;
EngineShowFlags.ReflectionEnvironment = false;
EngineShowFlags.ScreenSpaceReflections = false;
EngineShowFlags.ScreenSpaceAO = false;
EngineShowFlags.LightShafts = false;
EngineShowFlags.Lighting = false;
EngineShowFlags.DeferredLighting = false;
#Loc: <Workspace>/Engine/Plugins/Experimental/Water/Source/Runtime/Private/WaterInfoRendering.cpp:652
Scope (from outer to inner):
file
namespace UE::WaterInfo
function static FSceneRenderer* CreateWaterInfoSceneRenderer
Source code excerpt:
ShowFlags.Fog = 0;
ShowFlags.VolumetricFog = 0;
ShowFlags.DynamicShadows = 0;
ShowFlags.SetDisableOcclusionQueries(true);
ShowFlags.SetVirtualShadowMapPersistentData(false);
FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(
Params.RenderTarget,
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl:187
Scope: file
Source code excerpt:
SHOWFLAG_ALWAYS_ACCESSIBLE(InstancedGrass, SFG_Advanced, NSLOCTEXT("UnrealEd", "InstancedGrassSF", "Grass"))
/** non baked shadows, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_ALWAYS_ACCESSIBLE(DynamicShadows, SFG_LightingComponents, NSLOCTEXT("UnrealEd", "DynamicShadowsSF", "Dynamic Shadows"))
/** Particles, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_ALWAYS_ACCESSIBLE(Particles, SFG_Normal, NSLOCTEXT("UnrealEd", "ParticlesSF", "Particle Sprites"))
/** Niagara, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_FIXED_IN_SHIPPING(1, Niagara, SFG_Advanced, NSLOCTEXT("UnrealEd", "NiagaraSF", "Niagara Renderers"))
/** HeterogeneousVolumes, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_FIXED_IN_SHIPPING(1, HeterogeneousVolumes, SFG_Advanced, NSLOCTEXT("UnrealEd", "HeterogeneousVolumesSF", "Heterogeneous Volumes"))
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/CapsuleShadowRendering.cpp:952
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::RenderIndirectCapsuleShadows
Source code excerpt:
{
if (!SupportsCapsuleIndirectShadows(ShaderPlatform)
|| !ViewFamily.EngineShowFlags.DynamicShadows
|| !ViewFamily.EngineShowFlags.CapsuleShadows)
{
return;
}
RDG_CSV_STAT_EXCLUSIVE_SCOPE(GraphBuilder, RenderIndirectCapsuleShadows);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:1100
Scope: file
Source code excerpt:
// This is called from multiple locations and will succeed if the visibility tasks are ready.
if (!TaskDatas.DynamicShadows
&& GEarlyInitDynamicShadows != 0
&& ViewFamily.EngineShowFlags.DynamicShadows
&& !ViewFamily.EngineShowFlags.HitProxies
&& !HasRayTracedOverlay(ViewFamily)
&& TaskDatas.VisibilityTaskData->IsTaskWaitingAllowed())
{
TaskDatas.DynamicShadows = FSceneRenderer::BeginInitDynamicShadows(GraphBuilder, true, TaskDatas.VisibilityTaskData, InstanceCullingManager);
}
}
void FDeferredShadingSceneRenderer::FinishInitDynamicShadows(FRDGBuilder& GraphBuilder, FDynamicShadowsTaskData*& TaskData, FInstanceCullingManager& InstanceCullingManager)
{
if (ViewFamily.EngineShowFlags.DynamicShadows && !ViewFamily.EngineShowFlags.HitProxies && !HasRayTracedOverlay(ViewFamily))
{
// Setup dynamic shadows.
if (TaskData)
{
FSceneRenderer::FinishInitDynamicShadows(GraphBuilder, TaskData);
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:1526
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::Render
Source code excerpt:
// NOTE: Must be done after system texture initialization
// TODO: This doesn't take into account the potential for split screen views with separate shadow caches
const bool bEnableVirtualShadowMaps = UseVirtualShadowMaps(ShaderPlatform, FeatureLevel) && ViewFamily.EngineShowFlags.DynamicShadows && !bHasRayTracedOverlay;
VirtualShadowMapArray.Initialize(GraphBuilder, Scene->GetVirtualShadowMapCache(), bEnableVirtualShadowMaps, ViewFamily.EngineShowFlags);
if (InitViewTaskDatas.LumenFrameTemporaries)
{
BeginUpdateLumenSceneTasks(GraphBuilder, *InitViewTaskDatas.LumenFrameTemporaries);
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:2202
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::Render
Source code excerpt:
{
// Dynamic shadows are synced later when using the deferred path to make more headroom for tasks.
FinishInitDynamicShadows(GraphBuilder, InitViewTaskDatas.DynamicShadows, InstanceCullingManager);
}
// Update groom only visible in shadow
if (IsHairStrandsEnabled(EHairStrandsShaderType::All, Scene->GetShaderPlatform()) && RendererOutput == ERendererOutput::FinalSceneColor)
{
UpdateHairStrandsBookmarkParameters(Scene, Views, HairStrandsBookmarkParameters);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:2262
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::Render
Source code excerpt:
}
BeginAsyncDistanceFieldShadowProjections(GraphBuilder, SceneTextures, InitViewTaskDatas.DynamicShadows);
// Run local fog volume culling before base pass and after HZB generation tyo benefit from more culling.
InitLocalFogVolumesForViews(Scene, Views, ViewFamily, GraphBuilder, bShouldRenderVolumetricFog, false /*bool bUseHalfResLocalFogVolume*/);
if (bShouldRenderVolumetricCloudBase)
{
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:2352
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::Render
Source code excerpt:
// With forward shading we need to render shadow maps early
ensureMsgf(!VirtualShadowMapArray.IsEnabled(), TEXT("Virtual shadow maps are not supported in the forward shading path"));
RenderShadowDepthMaps(GraphBuilder, InitViewTaskDatas.DynamicShadows, InstanceCullingManager, ExternalAccessQueue);
bShadowMapsRenderedEarly = true;
if (bHairStrandsEnable)
{
RunHairStrandsBookmark(GraphBuilder, EHairStrandsBookmark::ProcessStrandsInterpolation, HairStrandsBookmarkParameters);
if (!bHasRayTracedOverlay)
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:2376
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::Render
Source code excerpt:
if (!VirtualShadowMapArray.IsEnabled())
{
RenderShadowDepthMaps(GraphBuilder, InitViewTaskDatas.DynamicShadows, InstanceCullingManager, ExternalAccessQueue);
bShadowMapsRenderedEarly = true;
}
}
ExternalAccessQueue.Submit(GraphBuilder);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:2617
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::Render
Source code excerpt:
}
RenderShadowDepthMaps(GraphBuilder, InitViewTaskDatas.DynamicShadows, InstanceCullingManager, ExternalAccessQueue);
}
CheckShadowDepthRenderCompleted();
#if RHI_RAYTRACING
// Lumen scene lighting requires ray tracing scene to be ready if HWRT shadows are desired
if (bNeedToWaitForRayTracingScene && Lumen::UseHardwareRayTracedSceneLighting(ViewFamily))
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.h:558
Scope (from outer to inner):
file
class class FDeferredShadingSceneRenderer : public FSceneRenderer
Source code excerpt:
FRayTracingRelevantPrimitiveTaskData* RayTracingRelevantPrimitives = nullptr;
#endif
FDynamicShadowsTaskData* DynamicShadows = nullptr;
FLumenDirectLightingTaskData* LumenDirectLighting = nullptr;
FLumenSceneFrameTemporaries* LumenFrameTemporaries = nullptr;
};
void PreVisibilityFrameSetup(FRDGBuilder& GraphBuilder);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DistanceFieldShadowing.cpp:718
Scope (from outer to inner):
file
function bool FSceneRenderer::ShouldPrepareForDistanceFieldShadows
Source code excerpt:
bool FSceneRenderer::ShouldPrepareForDistanceFieldShadows() const
{
if (!ViewFamily.EngineShowFlags.DynamicShadows || !SupportsDistanceFieldShadows(Scene->GetFeatureLevel(), Scene->GetShaderPlatform()))
{
return false;
}
return true;
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DistanceFieldShadowing.cpp:729
Scope (from outer to inner):
file
function bool FSceneRenderer::ShouldPrepareHeightFieldScene
Source code excerpt:
{
return Scene
&& ViewFamily.EngineShowFlags.DynamicShadows
&& !ViewFamily.EngineShowFlags.PathTracing
&& SupportsHeightFieldShadows(Scene->GetFeatureLevel(), Scene->GetShaderPlatform());
}
void RayTraceShadows(
FRDGBuilder& GraphBuilder,
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/LightGridInjection.cpp:552
Scope: file
Source code excerpt:
uint32 LightTypeAndShadowMapChannelMaskPacked = LightSceneInfo->PackLightTypeAndShadowMapChannelMask(bAllowStaticLighting, SortedLightInfo.SortKey.Fields.bLightFunction);
const bool bDynamicShadows = ViewFamily.EngineShowFlags.DynamicShadows && VisibleLightInfos.IsValidIndex(LightSceneInfo->Id);
const int32 VirtualShadowMapId = bDynamicShadows ? VisibleLightInfos[LightSceneInfo->Id].GetVirtualShadowMapId( &View ) : INDEX_NONE;
if ((SortedLightInfo.SortKey.Fields.LightType == LightType_Point && ViewFamily.EngineShowFlags.PointLights) ||
(SortedLightInfo.SortKey.Fields.LightType == LightType_Spot && ViewFamily.EngineShowFlags.SpotLights) ||
(SortedLightInfo.SortKey.Fields.LightType == LightType_Rect && ViewFamily.EngineShowFlags.RectLights))
{
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/LightRendering.cpp:594
Scope (from outer to inner):
file
function FDeferredLightUniformStruct GetDeferredLightParameters
Source code excerpt:
}
const bool bDynamicShadows = View.Family->EngineShowFlags.DynamicShadows && GetShadowQuality() > 0;
const bool bHasLightFunction = LightSceneInfo.Proxy->GetLightFunctionMaterial() != NULL && !bUseLightFunctionAtlas;
Out.ShadowedBits = LightSceneInfo.Proxy->CastsStaticShadow() || bHasLightFunction ? 1 : 0;
Out.ShadowedBits |= LightSceneInfo.Proxy->CastsDynamicShadow() && View.Family->EngineShowFlags.DynamicShadows ? 3 : 0;
Out.VolumetricScatteringIntensity = LightSceneInfo.Proxy->GetVolumetricScatteringIntensity();
static auto* ContactShadowsCVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.ContactShadows"));
Out.ContactShadowLength = 0;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/LightRendering.cpp:1155
Scope (from outer to inner):
file
function void FSceneRenderer::GatherAndSortLights
Source code excerpt:
const bool bUseLightFunctionAtlas = LightFunctionAtlas::IsEnabled(*Scene, ELightFunctionAtlasSystem::DeferredLighting);
bool bDynamicShadows = ViewFamily.EngineShowFlags.DynamicShadows && GetShadowQuality() > 0;
#if ENABLE_DEBUG_DISCARD_PROP
int32 Total = Scene->Lights.Num() + SimpleLights.InstanceData.Num();
int32 NumToKeep = int32(float(Total) * (1.0f - GDebugLightDiscardProp));
const float DebugDiscardStride = float(NumToKeep) / float(Total);
float DebugDiscardCounter = 0.0f;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/LightSceneInfo.cpp:294
Scope (from outer to inner):
file
function bool FLightSceneInfo::SetupMobileMovableLocalLightShadowParameters
Source code excerpt:
Proxy->GetLightShaderParameters(LightParameters);
bool bShouldCastShadow = View.Family->EngineShowFlags.DynamicShadows
&& GetShadowQuality() > 0
&& LightType == LightType_Spot
&& VisibleLightInfos[Id].AllProjectedShadows.Num() > 0
&& VisibleLightInfos[Id].AllProjectedShadows.Last()->bAllocated;
if (bShouldCastShadow)
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/MobileDeferredShadingPass.cpp:523
Scope (from outer to inner):
file
function static void RenderDirectionalLight
Source code excerpt:
const bool bSkyLight = Scene.SkyLight && !Scene.SkyLight->bHasStaticLighting && View.Family->EngineShowFlags.SkyLighting;
const bool bDynamicSkyLight = bSkyLight && !Scene.SkyLight->bWantsStaticShadowing;
const bool bDynamicShadows = DirectionalLight.Proxy->CastsDynamicShadow() && View.Family->EngineShowFlags.DynamicShadows;
const bool bPlanarReflection = Scene.GetForwardPassGlobalPlanarReflection() != nullptr;
// Do two passes, first masking DefautLit, second masking all other shading models
const bool bOnlyDefaultLitInView = IsOnlyDefaultLitShadingModel(View.ShadingModelMaskInView);
int32 NumPasses = !bOnlyDefaultLitInView && MobileUsesGBufferCustomData(Scene.GetShaderPlatform()) ? 2 : 1;
uint8 PassShadingModelStencilValue[2] =
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/MobileShadingRenderer.cpp:706
Scope (from outer to inner):
file
function void FMobileSceneRenderer::InitViews
Source code excerpt:
if (bRendererOutputFinalSceneColor)
{
const bool bDynamicShadows = ViewFamily.EngineShowFlags.DynamicShadows;
if (bDynamicShadows)
{
// Setup dynamic shadows.
TaskDatas.DynamicShadows = InitDynamicShadows(GraphBuilder, InstanceCullingManager);
}
else
{
// TODO: only do this when CSM + static is required.
PrepareViewVisibilityLists();
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/MobileShadingRenderer.cpp:2179
Scope (from outer to inner):
file
function void FMobileSceneRenderer::UpdateDirectionalLightUniformBuffers
lambda-function
Source code excerpt:
AddPass(GraphBuilder, RDG_EVENT_NAME("UpdateDirectionalLightUniformBuffers"), [this, &View](FRHICommandListImmediate& RHICmdList)
{
const bool bDynamicShadows = ViewFamily.EngineShowFlags.DynamicShadows;
// Fill in the other entries based on the lights
for (int32 ChannelIdx = 0; ChannelIdx < UE_ARRAY_COUNT(Scene->MobileDirectionalLights); ChannelIdx++)
{
FMobileDirectionalLightShaderParameters Params;
SetupMobileDirectionalLightUniformParameters(*Scene, View, VisibleLightInfos, ChannelIdx, bDynamicShadows, Params);
Scene->UniformBuffers.MobileDirectionalLightUniformBuffers[ChannelIdx + 1].UpdateUniformBufferImmediate(RHICmdList, Params);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/SceneRendering.h:2673
Scope (from outer to inner):
file
class class FMobileSceneRenderer : public FSceneRenderer
Source code excerpt:
IVisibilityTaskData* VisibilityTaskData;
FDynamicShadowsTaskData* DynamicShadows = nullptr;
};
void InitViews(
FRDGBuilder& GraphBuilder,
FSceneTexturesConfig& SceneTexturesConfig,
FInstanceCullingManager& InstanceCullingManager,
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/SceneVisibility.cpp:5636
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::EndInitViews
Source code excerpt:
// Trigger shadow GDME tasks after the main visibility tasks are synced. Projection stencil shadows reference the main view dynamic elements.
BeginShadowGatherDynamicMeshElements(TaskDatas.DynamicShadows);
FRHICommandListImmediate& RHICmdList = GraphBuilder.RHICmdList;
// If parallel ILC update is disabled, then process it in place.
if (ViewFamily.EngineShowFlags.HitProxies == 0
&& Scene->PrecomputedLightVolumes.Num() > 0
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/SceneVisibility.cpp:5669
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::EndInitViews
Source code excerpt:
{
// Dynamic shadows are synced earlier when forward shading is enabled.
FinishInitDynamicShadows(GraphBuilder, TaskDatas.DynamicShadows, InstanceCullingManager);
}
}
/*------------------------------------------------------------------------------
FLODSceneTree Implementation
------------------------------------------------------------------------------*/
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/ShadowRendering.cpp:2207
Scope (from outer to inner):
file
function void FSceneRenderer::BeginAsyncDistanceFieldShadowProjections
Source code excerpt:
TConstArrayView<FProjectedShadowInfo*> ProjectedDistanceFieldShadows = GetProjectedDistanceFieldShadows(TaskData);
if (!!GDFShadowAsyncCompute && ViewFamily.EngineShowFlags.DynamicShadows && GetShadowQuality() > 0 && ProjectedDistanceFieldShadows.Num() > 0)
{
RDG_EVENT_SCOPE(GraphBuilder, "DistanceFieldShadows");
for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++)
{
const FViewInfo& View = Views[ViewIndex];
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/ShadowRendering.cpp:2339
Scope (from outer to inner):
file
function void FMobileSceneRenderer::RenderModulatedShadowProjections
Source code excerpt:
void FMobileSceneRenderer::RenderModulatedShadowProjections(FRHICommandList& RHICmdList, int32 ViewIndex, const FViewInfo& View)
{
if (!ViewFamily.EngineShowFlags.DynamicShadows || View.bIsPlanarReflection || bRequiresShadowProjections)
{
return;
}
CSV_SCOPED_TIMING_STAT_EXCLUSIVE(RenderShadowProjections);
SCOPED_NAMED_EVENT(FMobileSceneRenderer_RenderModulatedShadowProjections, FColor::Emerald);