ShowFlag.SkyLighting
ShowFlag.SkyLighting
#Overview
name: ShowFlag.SkyLighting
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 22
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of ShowFlag.SkyLighting is to control the visibility and rendering of sky lighting in the Unreal Engine 5 rendering system. This setting variable is part of the rendering and lighting subsystem, specifically related to the sky lighting component.
-
The Unreal Engine subsystems that rely on this setting variable are primarily the rendering and lighting modules, as evidenced by its usage in files like DeferredShadingRenderer.cpp, ReflectionEnvironment.cpp, and VolumetricFog.cpp.
-
The value of this variable is typically set through the engine’s show flags system, which allows for toggling various rendering features on and off. It can be accessed and modified through the ViewFamily.EngineShowFlags.SkyLighting property.
-
This variable interacts closely with the Scene->SkyLight object, which represents the sky light in the scene. It’s often used in conjunction with other properties of the sky light, such as bHasStaticLighting and bWantsStaticShadowing.
-
Developers must be aware that this flag affects various rendering passes and calculations, including ambient occlusion, volumetric fog, and reflection environments. When disabled, it can nullify sky light contributions in certain rendering paths.
-
Best practices when using this variable include:
- Ensuring it’s enabled when sky lighting is desired in the scene.
- Considering its interaction with static lighting and shadowing settings of the sky light.
- Being aware of its impact on performance, especially in complex scenes with many lighting calculations.
Regarding the associated variable SkyLighting:
The purpose of SkyLighting is to represent the actual sky lighting data and calculations in the engine. It’s closely related to ShowFlag.SkyLighting but represents the actual lighting information rather than just a visibility flag.
-
This variable is used extensively in lighting calculations, particularly in the Lightmass system for global illumination and in real-time rendering passes.
-
Its value is typically set and updated by the engine’s lighting system, particularly when calculating global illumination or updating real-time sky captures.
-
It interacts with various other lighting components and calculations, including direct and indirect lighting passes.
-
Developers should be aware that SkyLighting can have a significant impact on the overall look and performance of a scene. It’s crucial for achieving realistic outdoor lighting and global illumination effects.
-
Best practices include:
- Carefully tuning sky light parameters to achieve the desired lighting result.
- Considering the impact of sky lighting on both static and dynamic objects in the scene.
- Balancing the quality of sky lighting with performance requirements, especially in large or complex scenes.
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl:321
Scope: file
Source code excerpt:
SHOWFLAG_FIXED_IN_SHIPPING(1, PrecomputedVisibility, SFG_Advanced, NSLOCTEXT("UnrealEd", "PrecomputedVisibilitySF", "Precomputed Visibility"))
/** Contribution from sky light, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_ALWAYS_ACCESSIBLE(SkyLighting, SFG_LightTypes, NSLOCTEXT("UnrealEd", "SkyLightingSF", "Sky Lighting"))
/** Visualize preview shadow indicator */
SHOWFLAG_FIXED_IN_SHIPPING(0, PreviewShadowsIndicator, SFG_Visualize, NSLOCTEXT("UnrealEd", "PreviewShadowIndicatorSF", "Preview Shadows Indicator"))
/** Visualize precomputed visibility cells */
SHOWFLAG_FIXED_IN_SHIPPING(0, PrecomputedVisibilityCells, SFG_Visualize, NSLOCTEXT("UnrealEd", "PrecomputedVisibilityCellsSF", "Precomputed Visibility Cells"))
/** Visualize volumetric lightmap used for GI on dynamic objects */
SHOWFLAG_FIXED_IN_SHIPPING(0, VisualizeVolumetricLightmap, SFG_Visualize, NSLOCTEXT("UnrealEd", "VisualizeVolumetricLightmapSF", "Volumetric Lightmap"))
#Associated Variable and Callsites
This variable is associated with another variable named SkyLighting
. They share the same value. See the following C++ source code.
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/Radiosity.cpp:296
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::RadiositySetupTextureMapping
Source code excerpt:
FFullStaticLightingVertex Vertex = TexelToVertex.GetFullVertex();
Vertex.ApplyVertexModifications(TexelToVertex.ElementIndex, MaterialSettings.bUseNormalMapsForLighting, TextureMapping->Mesh);
FFinalGatherSample SkyLighting;
FFinalGatherSample UnusedSecondLighting;
float UnusedBackfacingHitsFraction;
if (!RadiosityCache.InterpolateLighting(Vertex, true, false, 1.0f, SkyLighting, UnusedSecondLighting, UnusedBackfacingHitsFraction, MappingContext.DebugCacheRecords))
{
FFinalGatherSample UniformSampledIncomingRadiance;
TArray<FVector4f> ImportancePhotonDirections;
FLightingCacheGatherInfo GatherInfo;
const int32 NumAdaptiveRefinementLevels = GeneralSettings.IndirectLightingQuality <= 10 ? 1 : 2;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/Radiosity.cpp:402
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::RadiositySetupTextureMapping
Source code excerpt:
if (GeneralSettings.NumSkyLightingBounces > 0)
{
FFinalGatherSample SkyLighting;
FFinalGatherSample UnusedSecondLighting;
float UnusedBackfacingHitsFraction;
RadiosityCache.InterpolateLighting(CurrentVertex, false, false, IrradianceCachingSettings.SkyOcclusionSmoothnessReduction, SkyLighting, UnusedSecondLighting, UnusedBackfacingHitsFraction, MappingContext.DebugCacheRecords, RecordCollectorPtr);
if (GeneralSettings.ViewSingleBounceNumber < 0 || GeneralSettings.ViewSingleBounceNumber == 1)
{
IncidentLighting += SkyLighting.IncidentLighting + SkyLighting.StationarySkyLighting.IncidentLighting;
}
IncidentLightingForRadiosity += SkyLighting.IncidentLighting + SkyLighting.StationarySkyLighting.IncidentLighting;
}
if (ImportanceTracingSettings.bUseRadiositySolverForLightMultibounce)
{
FGatheredLightSample DirectLighting;
float Unused2;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/Radiosity.cpp:611
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::RadiosityIterationTextureMapping
Source code excerpt:
FFullStaticLightingVertex Vertex = TexelToVertex.GetFullVertex();
Vertex.ApplyVertexModifications(TexelToVertex.ElementIndex, MaterialSettings.bUseNormalMapsForLighting, TextureMapping->Mesh);
FFinalGatherSample SkyLighting;
FFinalGatherSample UnusedSecondLighting;
float UnusedBackfacingHitsFraction;
if (!RadiosityCache.InterpolateLighting(Vertex, true, false, 1.0f, SkyLighting, UnusedSecondLighting, UnusedBackfacingHitsFraction, MappingContext.DebugCacheRecords))
{
FFinalGatherSample UniformSampledIncomingRadiance;
//@todo - find and pass in photons from the appropriate bounce number to improve bUseRadiositySolverForLightMultibounce quality
TArray<FVector4f> ImportancePhotonDirections;
FLightingCacheGatherInfo GatherInfo;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/ShowFlagsValues.inl:321
Scope: file
Source code excerpt:
SHOWFLAG_FIXED_IN_SHIPPING(1, PrecomputedVisibility, SFG_Advanced, NSLOCTEXT("UnrealEd", "PrecomputedVisibilitySF", "Precomputed Visibility"))
/** Contribution from sky light, for now SHOWFLAG_ALWAYS_ACCESSIBLE because it's exposed in SceneCapture */
SHOWFLAG_ALWAYS_ACCESSIBLE(SkyLighting, SFG_LightTypes, NSLOCTEXT("UnrealEd", "SkyLightingSF", "Sky Lighting"))
/** Visualize preview shadow indicator */
SHOWFLAG_FIXED_IN_SHIPPING(0, PreviewShadowsIndicator, SFG_Visualize, NSLOCTEXT("UnrealEd", "PreviewShadowIndicatorSF", "Preview Shadows Indicator"))
/** Visualize precomputed visibility cells */
SHOWFLAG_FIXED_IN_SHIPPING(0, PrecomputedVisibilityCells, SFG_Visualize, NSLOCTEXT("UnrealEd", "PrecomputedVisibilityCellsSF", "Precomputed Visibility Cells"))
/** Visualize volumetric lightmap used for GI on dynamic objects */
SHOWFLAG_FIXED_IN_SHIPPING(0, VisualizeVolumetricLightmap, SFG_Visualize, NSLOCTEXT("UnrealEd", "VisualizeVolumetricLightmapSF", "Volumetric Lightmap"))
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/CapsuleShadowRendering.cpp:786
Scope (from outer to inner):
file
function static IndirectCapsuleShadowsResources CreateIndirectCapsuleShadowsResources
Source code excerpt:
&& !SkyLight->bHasStaticLighting
&& SkyLight->bWantsStaticShadowing
&& View.Family->EngineShowFlags.SkyLighting
&& Allocation)
{
// Stationary sky light case
// Get the indirect shadow direction from the unoccluded sky direction
const float ConeAngle = FMath::Max(Allocation->CurrentSkyBentNormal.W * GCapsuleSkyAngleScale * .5f * PI, GCapsuleMinSkyAngle * PI / 180.0f);
PackedLightDirection = FVector4f(FVector3f(Allocation->CurrentSkyBentNormal), ConeAngle);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/CapsuleShadowRendering.cpp:797
Scope (from outer to inner):
file
function static IndirectCapsuleShadowsResources CreateIndirectCapsuleShadowsResources
Source code excerpt:
&& !SkyLight->bHasStaticLighting
&& !SkyLight->bWantsStaticShadowing
&& View.Family->EngineShowFlags.SkyLighting)
{
// Movable sky light case
const FSHVector2 SkyLightingIntensity = FSHVectorRGB2(SkyLight->IrradianceEnvironmentMap).GetLuminance();
const FVector ExtractedMaxDirection = SkyLightingIntensity.GetMaximumDirection();
// Get the indirect shadow direction from the primary sky lighting direction
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/CompositionLighting/CompositionLighting.cpp:81
Scope (from outer to inner):
file
function static bool IsSkylightActive
Source code excerpt:
return Scene->SkyLight
&& Scene->SkyLight->ProcessedTexture
&& View.Family->EngineShowFlags.SkyLighting;
}
bool ShouldRenderScreenSpaceAmbientOcclusion(const FViewInfo& View, bool bLumenWantsSSAO)
{
bool bEnabled = true;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DeferredShadingRenderer.cpp:2294
Scope (from outer to inner):
file
function void FDeferredShadingSceneRenderer::Render
Source code excerpt:
// Capture the SkyLight using the SkyAtmosphere and VolumetricCloud component if available.
const bool bRealTimeSkyCaptureEnabled = Scene->SkyLight && Scene->SkyLight->bRealTimeCaptureEnabled && Views.Num() > 0 && ViewFamily.EngineShowFlags.SkyLighting;
if (bRealTimeSkyCaptureEnabled)
{
FViewInfo& MainView = Views[0];
Scene->AllocateAndCaptureFrameSkyEnvMap(GraphBuilder, *this, MainView, bShouldRenderSkyAtmosphere, bShouldRenderVolumetricCloud, InstanceCullingManager, ExternalAccessQueue);
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/DistanceFieldAmbientOcclusion.cpp:690
Scope (from outer to inner):
file
function bool ShouldRenderDeferredDynamicSkyLight
Source code excerpt:
&& !Scene->SkyLight->bWantsStaticShadowing
&& !Scene->SkyLight->bHasStaticLighting
&& ViewFamily.EngineShowFlags.SkyLighting
&& Scene->GetFeatureLevel() >= ERHIFeatureLevel::SM5
&& !IsForwardShadingEnabled(Scene->GetShaderPlatform())
&& !ViewFamily.EngineShowFlags.VisualizeLightCulling
&& !ShouldRenderRayTracingSkyLight(Scene->SkyLight, Scene->GetShaderPlatform()); // Disable diffuse sky contribution if evaluated by RT Sky;
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/IndirectLightRendering.cpp:545
Scope (from outer to inner):
file
function class FAmbientCubemapCompositePS : public FGlobalShader { /*ARE_GLOBAL_SHADER
Source code excerpt:
float SkyAverageBrightness = 1.0f;
const bool bApplySkyLight = View.Family->EngineShowFlags.SkyLighting;
const FScene* Scene = (const FScene*)View.Family->Scene;
ERDGTextureFlags SkyLightTextureFlags = ERDGTextureFlags::None;
if (Scene
&& Scene->SkyLight
&& (Scene->SkyLight->ProcessedTexture || (Scene->SkyLight->bRealTimeCaptureEnabled && Scene->ConvolvedSkyRenderTargetReadyIndex >= 0))
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/Lumen/Lumen.cpp:107
Scope (from outer to inner):
file
function bool Lumen::ShouldHandleSkyLight
Source code excerpt:
return Scene->SkyLight
&& (Scene->SkyLight->ProcessedTexture || Scene->SkyLight->bRealTimeCaptureEnabled)
&& ViewFamily.EngineShowFlags.SkyLighting
&& Scene->GetFeatureLevel() >= ERHIFeatureLevel::SM5
&& !IsForwardShadingEnabled(Scene->GetShaderPlatform())
&& !ViewFamily.EngineShowFlags.VisualizeLightCulling;
}
bool ShouldRenderLumenForViewFamily(const FScene* Scene, const FSceneViewFamily& ViewFamily, bool bSkipProjectCheck)
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/MobileDeferredShadingPass.cpp:377
Scope (from outer to inner):
file
function void RenderReflectionEnvironmentSkyLighting
Source code excerpt:
{
// Skylights with static lighting already had their diffuse contribution baked into lightmaps
const bool bSkyLight = Scene.SkyLight && !Scene.SkyLight->bHasStaticLighting && View.Family->EngineShowFlags.SkyLighting;
const bool bDynamicSkyLight = bSkyLight && !Scene.SkyLight->bWantsStaticShadowing;
const bool bClustredReflection = (View.NumBoxReflectionCaptures + View.NumSphereReflectionCaptures) > 0;
const bool bPlanarReflection = Scene.GetForwardPassGlobalPlanarReflection() != nullptr;
if (!(bSkyLight || bClustredReflection || bPlanarReflection))
{
return;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/MobileDeferredShadingPass.cpp:521
Scope (from outer to inner):
file
function static void RenderDirectionalLight
Source code excerpt:
// Skylights with static lighting already had their diffuse contribution baked into lightmaps
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);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/MobileShadingRenderer.cpp:552
Scope (from outer to inner):
file
function void FMobileSceneRenderer::InitViews
Source code excerpt:
bRequiresAmbientOcclusionPass = IsUsingMobileAmbientOcclusion(ShaderPlatform)
&& Views[0].FinalPostProcessSettings.AmbientOcclusionIntensity > 0
&& (Views[0].FinalPostProcessSettings.AmbientOcclusionStaticFraction >= 1 / 100.0f || (Scene && Scene->SkyLight && Scene->SkyLight->ProcessedTexture && Views[0].Family->EngineShowFlags.SkyLighting))
&& ViewFamily.EngineShowFlags.Lighting
&& !Views[0].bIsReflectionCapture
&& !Views[0].bIsPlanarReflection
&& !ViewFamily.EngineShowFlags.HitProxies
&& !ViewFamily.EngineShowFlags.VisualizeLightCulling
&& !ViewFamily.UseDebugViewPS()
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/PathTracing.cpp:2485
Scope: file
Source code excerpt:
// compute an integer code of what show flags and booleans related to lights are currently enabled so we can detect changes
Config.LightShowFlags = 0;
Config.LightShowFlags |= View.Family->EngineShowFlags.SkyLighting ? 1 << 0 : 0;
Config.LightShowFlags |= View.Family->EngineShowFlags.DirectionalLights ? 1 << 1 : 0;
Config.LightShowFlags |= View.Family->EngineShowFlags.RectLights ? 1 << 2 : 0;
Config.LightShowFlags |= View.Family->EngineShowFlags.SpotLights ? 1 << 3 : 0;
Config.LightShowFlags |= View.Family->EngineShowFlags.PointLights ? 1 << 4 : 0;
Config.LightShowFlags |= View.Family->EngineShowFlags.TexturedLightProfiles ? 1 << 5 : 0;
Config.LightShowFlags |= View.Family->EngineShowFlags.LightFunctions ? 1 << 6 : 0;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/ReflectionEnvironment.cpp:672
Scope (from outer to inner):
file
function void UpdateSkyIrradianceGpuBuffer
Source code excerpt:
// Skylights with static lighting already had their diffuse contribution baked into lightmaps
&& !SkyLight->bHasStaticLighting
&& EngineShowFlags.SkyLighting
&& !SkyLight->bRealTimeCaptureEnabled; // When bRealTimeCaptureEnabled is true, the buffer will be setup on GPU directly in this case
const bool bNewAlloc = AllocatePooledBuffer(
FRDGBufferDesc::CreateStructuredDesc(sizeof(FVector4f), SKY_IRRADIANCE_ENVIRONMENT_MAP_VEC4_COUNT),
Buffer,
TEXT("SkyIrradianceEnvironmentMap"),
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/ReflectionEnvironmentCapture.cpp:1299
Scope (from outer to inner):
file
function void CaptureSceneIntoScratchCubemap
Source code excerpt:
ViewFamily.EngineShowFlags.LightShafts = 0;
// Don't apply sky lighting diffuse when capturing the sky light source, or we would have feedback
ViewFamily.EngineShowFlags.SkyLighting = !bCapturingForSkyLight;
// Skip lighting for emissive only
ViewFamily.EngineShowFlags.Lighting = !bCaptureEmissiveOnly;
// Never do screen percentage in reflection environment capture.
ViewFamily.EngineShowFlags.ScreenPercentage = false;
FSceneViewInitOptions ViewInitOptions;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/SceneRendering.cpp:1826
Scope (from outer to inner):
file
function void FViewInfo::SetupUniformBufferParameters
Source code excerpt:
FSkyLightSceneProxy* SkyLight = Scene->SkyLight;
// Setup the sky color mulitpler, and use it to nullify the sky contribution in case SkyLighting is disabled.
// Note: we cannot simply select the base pass shader permutation skylight=0 because we would need to trigger bScenesPrimitivesNeedStaticMeshElementUpdate.
// However, this would need to be done per view (showflag is per view) and this is not possible today as it is selected within the scene.
// So we simply nullify the sky light diffuse contribution. Reflection are handled by the indirect lighting render pass.
ViewUniformShaderParameters.SkyLightColor = Family->EngineShowFlags.SkyLighting ? SkyLight->GetEffectiveLightColor() : FLinearColor::Black;
bool bApplyPrecomputedBentNormalShadowing =
SkyLight->bCastShadows
&& SkyLight->bWantsStaticShadowing;
ViewUniformShaderParameters.SkyLightApplyPrecomputedBentNormalShadowingFlag = bApplyPrecomputedBentNormalShadowing ? 1.0f : 0.0f;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/SceneRendering.cpp:1859
Scope (from outer to inner):
file
function void FViewInfo::SetupUniformBufferParameters
Source code excerpt:
// Skylights with static lighting already had their diffuse contribution baked into lightmaps
&& !Scene->SkyLight->bHasStaticLighting
&& Family->EngineShowFlags.SkyLighting;
if (bSetupSkyIrradiance)
{
const FSHVectorRGB3& SkyIrradiance = Scene->SkyLight->IrradianceEnvironmentMap;
SetupSkyIrradianceEnvironmentMapConstantsFromSkyIrradiance((FVector4f*)&ViewUniformShaderParameters.MobileSkyIrradianceEnvironmentMap, SkyIrradiance);
ViewUniformShaderParameters.MobileSkyIrradianceEnvironmentMap[7].X = Scene->SkyLight->AverageBrightness;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/VolumetricFog.cpp:1548
Scope (from outer to inner):
file
function void FSceneRenderer::ComputeVolumetricFog
Source code excerpt:
// Skylights with static lighting had their diffuse contribution baked into lightmaps
&& !Scene->SkyLight->bHasStaticLighting
&& View.Family->EngineShowFlags.SkyLighting)
{
AOParameterData = FDistanceFieldAOParameters(Scene->SkyLight->OcclusionMaxDistance, Scene->SkyLight->Contrast);
}
PassParameters->AOParameters = DistanceField::SetupAOShaderParameters(AOParameterData);
PassParameters->GlobalDistanceFieldParameters = SetupGlobalDistanceFieldParameters(View.GlobalDistanceFieldInfo.ParameterData);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/VolumetricFog.cpp:1572
Scope (from outer to inner):
file
function void FSceneRenderer::ComputeVolumetricFog
Source code excerpt:
// Skylights with static lighting had their diffuse contribution baked into lightmaps
&& !SkyLight->bHasStaticLighting
&& View.Family->EngineShowFlags.SkyLighting)
{
PassParameters->SkyLightUseStaticShadowing = SkyLight->bWantsStaticShadowing && SkyLight->bCastShadows ? 1.0f : 0.0f;
PassParameters->SampleSkyLightDiffuseEnvMap = 1;
}
else
{