ViewSingleBounceNumber
ViewSingleBounceNumber
#Overview
name: ViewSingleBounceNumber
The value of this variable can be defined or overridden in .ini config files. 1
.ini config file referencing this setting variable.
It is referenced in 32
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of ViewSingleBounceNumber is to control which light bounce is visualized for debugging purposes in Unreal Engine’s lightmass system. It allows developers to isolate and examine specific light bounces in the global illumination calculation.
This setting is primarily used by the Lightmass subsystem, which is responsible for precomputed lighting and global illumination in Unreal Engine. It affects various modules within Lightmass, including the photon mapping, radiosity, and final gathering processes.
The value of this variable is typically set in the Lightmass configuration file (GLightmassIni) and read during the initialization of the lighting build process. It can be adjusted in the Unreal Editor’s project settings or through configuration files.
ViewSingleBounceNumber interacts with several other variables and systems within Lightmass, such as:
- NumIndirectLightingBounces: ViewSingleBounceNumber is clamped to not exceed this value.
- Various photon mapping and radiosity calculation functions, which use this value to determine whether to include specific bounce contributions.
- Debugging visualizations, which are often conditioned on this value to show only the specified bounce.
Developers should be aware that:
- Setting ViewSingleBounceNumber to -1 shows all light bounces (default behavior).
- Setting it to 0 typically shows only direct lighting.
- Higher values show subsequent indirect bounces.
- This setting is purely for visualization and debugging; it doesn’t affect the actual lighting calculations.
Best practices when using this variable include:
- Use it in conjunction with other debugging tools and visualizations for a comprehensive understanding of the lighting system.
- Remember to reset it to -1 (or remove it from the configuration) when finished debugging to ensure all bounces are properly visualized in the final build.
- Be aware that different subsystems may interpret the bounce numbers slightly differently (e.g., final gathering may offset the bounce number).
By using ViewSingleBounceNumber effectively, developers can more easily diagnose issues in their scene’s lighting and fine-tune the global illumination process.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/BaseLightmass.ini:16, section: [DevOptions.StaticLighting]
- INI Section:
DevOptions.StaticLighting
- Raw value:
-1
- Is Array:
False
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Lightmass/Lightmass.cpp:2126
Scope (from outer to inner):
file
function void FLightmassExporter::WriteSceneSettings
Source code excerpt:
}
VERIFYLIGHTMASSINI(GConfig->GetInt(TEXT("DevOptions.StaticLighting"), TEXT("ViewSingleBounceNumber"), Scene.GeneralSettings.ViewSingleBounceNumber, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetBool(TEXT("DevOptions.StaticLighting"), TEXT("bUseConservativeTexelRasterization"), bConfigBool, GLightmassIni));
Scene.GeneralSettings.bUseConservativeTexelRasterization = bConfigBool;
VERIFYLIGHTMASSINI(GConfig->GetBool(TEXT("DevOptions.StaticLighting"), TEXT("bAccountForTexelSize"), bConfigBool, GLightmassIni));
Scene.GeneralSettings.bAccountForTexelSize = bConfigBool;
VERIFYLIGHTMASSINI(GConfig->GetBool(TEXT("DevOptions.StaticLighting"), TEXT("bUseMaxWeight"), bConfigBool, GLightmassIni));
Scene.GeneralSettings.bUseMaxWeight = bConfigBool;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/FinalGather.cpp:287
Scope (from outer to inner):
file
namespace Lightmass
function FLinearColor FStaticLightingSystem::CalculateExitantRadiance
Source code excerpt:
const int32 BounceNumberForEmissive = BounceNumber - 1;
const bool bRestrictBounceNumber = GeneralSettings.ViewSingleBounceNumber >= 0
// We can only restrict light gathered by bounce on the final gather, on previous radiosity iterations the gathered light contributes to multiple bounces
&& GatherClassification == GLM_FinalGather;
if ((GatherClassification & GLM_GatherLightEmitted)
&& (!bRestrictBounceNumber || BounceNumberForEmissive == GeneralSettings.ViewSingleBounceNumber)
&& HitMesh->IsEmissive(ElementIndex))
{
FLinearColor Emissive = HitMesh->EvaluateEmissive(Vertex.TextureCoordinates[0], ElementIndex);
AccumulatedRadiance += Emissive;
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/FinalGather.cpp:470
Scope (from outer to inner):
file
namespace Lightmass
function FLinearColor FStaticLightingSystem::FinalGatherSample
Source code excerpt:
const int32 BounceNumberForSkylightInFinalGather = BounceNumber - 1;
const bool bRestrictBounceNumber = GeneralSettings.ViewSingleBounceNumber >= 0
// We can only restrict light gathered by bounce on the final gather, on previous radiosity iterations the gathered light contributes to multiple bounces
&& GatherClassification == GLM_FinalGather;
if ((GatherClassification & GLM_GatherLightEmitted)
&& (!bRestrictBounceNumber || BounceNumberForSkylightInFinalGather == GeneralSettings.ViewSingleBounceNumber))
{
// When we're gathering lighting to cache it as direct lighting, we should take IndirectLightingScales into account
const bool bForDirectLighting = !bGatheringForCachedDirectLighting;
EvaluateSkyLighting(WorldPathDirection, PathSolidAngle, RayIntersection.bIntersects, bForDirectLighting, Lighting, OutStationarySkyLighting);
}
#if ALLOW_LIGHTMAP_SAMPLE_DEBUGGING
if (bDebugThisTexel
&& GeneralSettings.ViewSingleBounceNumber == BounceNumber
&& (!PhotonMappingSettings.bUsePhotonMapping || !PhotonMappingSettings.bVisualizePhotonImportanceSamples))
{
FDebugStaticLightingRay DebugRay(PathRay.Start, PathRay.End, RayIntersection.bIntersects, bPositiveSample != 0);
if (RayIntersection.bIntersects)
{
DebugRay.End = RayIntersection.IntersectionVertex.WorldPosition;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/FinalGather.cpp:1516
Scope (from outer to inner):
file
namespace Lightmass
function FFinalGatherSample FStaticLightingSystem::CachePointIncomingRadiance
Source code excerpt:
{
// Use the photons deposited on surfaces to estimate indirect lighting
const bool bDebugFirstBouncePhotonGather = bDebugThisTexel && GeneralSettings.ViewSingleBounceNumber == BounceNumber;
const FGatheredLightSample FirstBounceLighting = CalculatePhotonIncidentRadiance(FirstBouncePhotonMap, NumPhotonsEmittedFirstBounce, PhotonMappingSettings.IndirectPhotonSearchDistance, Vertex, bDebugFirstBouncePhotonGather);
if (GeneralSettings.ViewSingleBounceNumber < 0 || GeneralSettings.ViewSingleBounceNumber == BounceNumber)
{
IndirectLighting.AddWeighted(FirstBounceLighting, 1.0f);
}
if (GeneralSettings.NumIndirectLightingBounces > 1)
{
const bool bDebugSecondBouncePhotonGather = bDebugThisTexel && GeneralSettings.ViewSingleBounceNumber > BounceNumber;
const FGatheredLightSample SecondBounceLighting = CalculatePhotonIncidentRadiance(SecondBouncePhotonMap, NumPhotonsEmittedSecondBounce, PhotonMappingSettings.IndirectPhotonSearchDistance, Vertex, bDebugSecondBouncePhotonGather);
if (GeneralSettings.ViewSingleBounceNumber < 0 || GeneralSettings.ViewSingleBounceNumber > BounceNumber)
{
IndirectLighting.AddWeighted(SecondBounceLighting, 1.0f);
}
}
}
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/FinalGather.cpp:1655
Scope: file
Source code excerpt:
#if ALLOW_LIGHTMAP_SAMPLE_DEBUGGING
if (bDebugThisTexel
&& GeneralSettings.ViewSingleBounceNumber == BounceNumber
&& (!PhotonMappingSettings.bUsePhotonMapping || !PhotonMappingSettings.bVisualizePhotonImportanceSamples))
{
FDebugStaticLightingRay DebugRay(TexelRay.Start, TexelRay.End, Intersection.bIntersects, false);
if (Intersection.bIntersects)
{
DebugRay.End = Intersection.IntersectionVertex.WorldPosition;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/FinalGather.cpp:1696
Scope (from outer to inner):
file
namespace Lightmass
function FFinalGatherSample FStaticLightingSystem::CachePointIncomingRadiance
Source code excerpt:
#if ALLOW_LIGHTMAP_SAMPLE_DEBUGGING
if (IrradianceCachingSettings.bVisualizeIrradianceSamples && Mapping == Scene.DebugMapping && GeneralSettings.ViewSingleBounceNumber == BounceNumber)
{
const float DistanceToDebugTexelSq = FVector3f(Scene.DebugInput.Position - Vertex.WorldPosition).SizeSquared();
FDebugLightingCacheRecord TempRecord;
TempRecord.bNearSelectedTexel = DistanceToDebugTexelSq < NewRecord.BoundingRadius * NewRecord.BoundingRadius;
TempRecord.Radius = NewRecord.Radius;
TempRecord.Vertex.VertexPosition = Vertex.WorldPosition;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/LightingSystem.cpp:898
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::ValidateSettings
Source code excerpt:
InScene.GeneralSettings.IndirectLightingSmoothness = FMath::Clamp(InScene.GeneralSettings.IndirectLightingSmoothness, .25f, 10.0f);
InScene.GeneralSettings.IndirectLightingQuality = FMath::Clamp(InScene.GeneralSettings.IndirectLightingQuality, .1f, 100.0f);
InScene.GeneralSettings.ViewSingleBounceNumber = FMath::Min(InScene.GeneralSettings.ViewSingleBounceNumber, InScene.GeneralSettings.NumIndirectLightingBounces);
if (FMath::IsNearlyEqual(InScene.PhotonMappingSettings.IndirectPhotonDensity, 0.0f))
{
// Allocate all samples toward uniform sampling if there are no indirect photons
InScene.PhotonMappingSettings.FinalGatherImportanceSampleFraction = 0;
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:345
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::EmitDirectPhotons
Source code excerpt:
if (PhotonMappingSettings.bVisualizePhotonPaths)
{
if (GeneralSettings.ViewSingleBounceNumber < 0
|| PhotonMappingSettings.bVisualizeCachedApproximateDirectLighting && GeneralSettings.ViewSingleBounceNumber == 0
|| PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber == 1)
{
if (PhotonMappingSettings.bUseIrradiancePhotons)
{
int32 NumDirectIrradiancePhotons = 0;
for (int32 ArrayIndex = 0; ArrayIndex < IrradiancePhotons.Num(); ArrayIndex++)
{
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:378
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::EmitDirectPhotons
Source code excerpt:
}
}
if (GeneralSettings.ViewSingleBounceNumber != 0)
{
StartupDebugOutput.IndirectPhotonPaths.Empty(NumIndirectPhotonPathsGathered);
for (int32 LightIndex = 0; LightIndex < IndirectPathRays.Num(); LightIndex++)
{
for (int32 RayIndex = 0; RayIndex < IndirectPathRays[LightIndex].Num(); RayIndex++)
{
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:832
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::EmitIndirectPhotons
Source code excerpt:
if (PhotonMappingSettings.bVisualizePhotonPaths
&& PhotonMappingSettings.bUseIrradiancePhotons
&& GeneralSettings.ViewSingleBounceNumber != 0)
{
int32 NumIndirectIrradiancePhotons = 0;
for (int32 RangeIndex = NumPhotonWorkRanges; RangeIndex < IrradiancePhotons.Num(); RangeIndex++)
{
NumIndirectIrradiancePhotons += IrradiancePhotons[RangeIndex].Num();
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:1071
Scope (from outer to inner):
file
function void FStaticLightingSystem::EmitIndirectPhotonsWorkRange
Source code excerpt:
if (PhotonMappingSettings.bVisualizePhotonPaths
&& !PhotonMappingSettings.bUseIrradiancePhotons
&& (GeneralSettings.ViewSingleBounceNumber < 0
|| PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber > 1
|| !PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber > 0))
{
FScopeLock DebugOutputLock(&DebugOutputSync);
if (StartupDebugOutput.IndirectPhotons.Num() == 0)
{
StartupDebugOutput.IndirectPhotons.Empty(FMath::TruncToInt(NumIndirectPhotonsToEmit * IndirectPhotonEfficiency));
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:1363
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateIrradiancePhotons
Source code excerpt:
float ClosestIrradiancePhotonDistSq = FLT_MAX;
// Skip direct irradiance photons if viewing indirect bounces
const int32 ArrayStart = GeneralSettings.ViewSingleBounceNumber > 0 ? NumPhotonWorkRanges : 0;
// Skip indirect irradiance photons if viewing direct only
const int32 ArrayEnd = GeneralSettings.ViewSingleBounceNumber == 0 ? NumPhotonWorkRanges : IrradiancePhotons.Num();
for (int32 ArrayIndex = ArrayStart; ArrayIndex < ArrayEnd; ArrayIndex++)
{
for (int32 PhotonIndex = 0; PhotonIndex < IrradiancePhotons[ArrayIndex].Num(); PhotonIndex++)
{
const FIrradiancePhoton& CurrentPhoton = IrradiancePhotons[ArrayIndex][PhotonIndex];
const float CurrentDistSquared = (CurrentPhoton.GetPosition() - Scene.DebugInput.Position).SizeSquared3();
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:1524
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateIrradiancePhotonsWorkRange
Source code excerpt:
PhotonMappingSettings.DirectPhotonSearchDistance,
CurrentIrradiancePhoton,
bDebugThisPhoton && GeneralSettings.ViewSingleBounceNumber == 0,
TempFoundPhotons,
OutStats);
checkSlow(FLinearColorUtils::AreFloatsValid(DirectPhotonIrradiance));
// Only add direct contribution if it should be viewed given ViewSingleBounceNumber
if (GeneralSettings.ViewSingleBounceNumber < 0
|| (PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber == 1)
|| (!PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber == 0)
|| (PhotonMappingSettings.bVisualizeCachedApproximateDirectLighting && GeneralSettings.ViewSingleBounceNumber == 0))
{
AccumulatedIrradiance = DirectPhotonIrradiance;
}
}
// If we are final gathering, first bounce photons are actually the second lighting bounce since the final gather is the first bounce
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:1550
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateIrradiancePhotonsWorkRange
Source code excerpt:
PhotonMappingSettings.IndirectPhotonSearchDistance,
CurrentIrradiancePhoton,
bDebugThisPhoton && GeneralSettings.ViewSingleBounceNumber == 1,
TempFoundPhotons,
OutStats);
checkSlow(FLinearColorUtils::AreFloatsValid(FirstBouncePhotonIrradiance));
// Only add first bounce contribution if it should be viewed given ViewSingleBounceNumber
if (GeneralSettings.ViewSingleBounceNumber < 0
|| (PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber == 2)
|| (!PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber == 1))
{
AccumulatedIrradiance += FirstBouncePhotonIrradiance;
}
// If we are final gathering, second bounce photons are actually the third lighting bounce since the final gather is the first bounce
if ((PhotonMappingSettings.bUseFinalGathering && GeneralSettings.NumIndirectLightingBounces > 2)
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/PhotonMapping.cpp:1574
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateIrradiancePhotonsWorkRange
Source code excerpt:
PhotonMappingSettings.IndirectPhotonSearchDistance,
CurrentIrradiancePhoton,
bDebugThisPhoton && GeneralSettings.ViewSingleBounceNumber > 1,
TempFoundPhotons,
OutStats);
checkSlow(FLinearColorUtils::AreFloatsValid(SecondBouncePhotonIrradiance));
// Only add second and up bounce contribution if it should be viewed given ViewSingleBounceNumber
if (GeneralSettings.ViewSingleBounceNumber < 0
|| (PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber == 3)
|| (!PhotonMappingSettings.bUseFinalGathering && GeneralSettings.ViewSingleBounceNumber == 2))
{
AccumulatedIrradiance += SecondBouncePhotonIrradiance;
}
}
}
CurrentIrradiancePhoton.SetIrradiance(AccumulatedIrradiance);
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/Radiosity.cpp:407
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::RadiositySetupTextureMapping
Source code excerpt:
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;
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/Radiosity.cpp:699
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::RadiosityIterationTextureMapping
Source code excerpt:
const FLinearColor IterationRadiosity = IterationLighting.IncidentLighting * Reflectance;
if (GeneralSettings.ViewSingleBounceNumber < 0 || GeneralSettings.ViewSingleBounceNumber == PassIndex + 2)
{
// Accumulate this bounce's lighting
TextureMapping->SurfaceCacheLighting[SurfaceCacheIndex] += IterationRadiosity;
}
// Store in one of the radiosity buffers for the next iteration
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/Radiosity.cpp:789
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::RadiosityIterationCachedHitpointsTextureMapping
Source code excerpt:
FLinearColor IterationRadiosity = (AccumulatedRadiosity / TotalWeight) * DiffuseReflectance;
if (GeneralSettings.ViewSingleBounceNumber < 0 || GeneralSettings.ViewSingleBounceNumber == PassIndex + 2)
{
// Accumulate this bounce's lighting
TextureMapping->SurfaceCacheLighting[SurfaceCacheIndex] += IterationRadiosity;
}
// Store in one of the radiosity buffers for the next iteration
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:649
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::FinalizeSurfaceCacheTextureMapping
Source code excerpt:
FinalIncidentLighting += TextureMapping->SurfaceCacheLighting[SurfaceCacheIndex];
if ((GeneralSettings.ViewSingleBounceNumber < 0 || GeneralSettings.ViewSingleBounceNumber >= 2)
&& !ImportanceTracingSettings.bUseRadiositySolverForLightMultibounce
&& PhotonMappingSettings.bUseIrradiancePhotons)
{
const FIrradiancePhoton* NearestPhoton = TextureMapping->CachedIrradiancePhotons[SurfaceCacheIndex];
if (NearestPhoton)
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:662
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::FinalizeSurfaceCacheTextureMapping
Source code excerpt:
}
if (GeneralSettings.ViewSingleBounceNumber < 0 || GeneralSettings.ViewSingleBounceNumber == 1)
{
FGatheredLightSample DirectLighting;
float Unused2;
TArray<FVector3f, TInlineAllocator<1>> VertexOffsets;
VertexOffsets.Add(FVector3f(0, 0, 0));
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:1354
Scope (from outer to inner):
file
function void FStaticLightingSystem::CalculateDirectLightingTextureMappingFiltered
Source code excerpt:
const FLinearColor LightIntensity = Light->GetDirectIntensity(CurrentVertex.WorldPosition, false);
const FGatheredLightSample DirectLighting = CalculatePointLighting(TextureMapping, CurrentVertex, TexelToVertex.ElementIndex, Light, LightIntensity, FLinearColor::White);
if (GeneralSettings.ViewSingleBounceNumber < 1)
{
LightMapData(X,Y).AddWeighted(DirectLighting, ShadowFactor);
}
}
}
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:1494
Scope (from outer to inner):
file
function void FStaticLightingSystem::CalculateDirectAreaLightingTextureMapping
Source code excerpt:
UnnormalizedTransmission,
LightSurfaceSamples,
bDebugThisTexel && GeneralSettings.ViewSingleBounceNumber == 0);
if (ShadowValue.X > 0.0f)
{
if (ShadowValue.X < ShadowValue.Y)
{
// Trace more shadow rays if we are in the penumbra
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:1514
Scope: file
Source code excerpt:
UnnormalizedPenumbraTransmission,
PenumbraLightSurfaceSamples,
bDebugThisTexel && GeneralSettings.ViewSingleBounceNumber == 0);
// Linear combination of uniform and penumbra shadow samples
ShadowFactor = (ShadowValue.X + ShadowValuePenumbra.X) / (ShadowValue.Y + ShadowValuePenumbra.Y);
// Weight each transmission by the fraction of total unshadowed rays that contributed to it
Transmission = (UnnormalizedTransmission + UnnormalizedPenumbraTransmission) / (ShadowValue.Y + ShadowValuePenumbra.Y);
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:1697
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateDirectAreaLightingTextureMapping
Source code excerpt:
const float AdjustedShadowFactor = FMath::Pow(ShadowFactor, Light->ShadowExponent);
if (GeneralSettings.ViewSingleBounceNumber < 1)
{
if (ShadowMapData)
{
FShadowSample& CurrentShadowSample = (*ShadowMapData)(X,Y);
CurrentShadowSample.Visibility = AdjustedShadowFactor;
if ( CurrentShadowSample.Visibility > 0.0001f )
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:2004
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateDirectSignedDistanceFieldLightingTextureMappingTextureSpace
Source code excerpt:
#if ALLOW_LIGHTMAP_SAMPLE_DEBUGGING
if (bDebugThisTexel && GeneralSettings.ViewSingleBounceNumber == 0)
{
FDebugStaticLightingRay DebugRay(LightRay.Start, LightRay.End, Intersection.bIntersects);
if (Intersection.bIntersects)
{
DebugRay.End = Intersection.IntersectionVertex.WorldPosition;
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:2819
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateDirectLightingTextureMappingPhotonMap
Source code excerpt:
}
const FLinearColor& PhotonIrradiance = NearestPhoton ? NearestPhoton->GetIrradiance() : FLinearColor::Black;
if (GeneralSettings.ViewSingleBounceNumber < 1)
{
FLinearColor FinalLighting = PhotonIrradiance;
if (!PhotonMappingSettings.bUsePhotonDirectLightingInFinalGather)
{
FinalLighting += DirectLighting;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:2837
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::CalculateDirectLightingTextureMappingPhotonMap
Source code excerpt:
// Estimate incident radiance from the photons in the direct photon map
const FGatheredLightSample PhotonIncidentRadiance = CalculatePhotonIncidentRadiance(DirectPhotonMap, NumPhotonsEmittedDirect, PhotonMappingSettings.DirectPhotonSearchDistance, CurrentVertex, bDebugThisTexel);
if (GeneralSettings.ViewSingleBounceNumber < 1)
{
CurrentLightSample.AddWeighted(PhotonIncidentRadiance, 1.0f);
}
}
}
}
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:2970
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::ProcessInterpolateTask
Source code excerpt:
// Interpolate the indirect lighting from the irradiance cache
// Interpolation must succeed since this is the second pass
verify(Task->FirstBounceCache->InterpolateLighting(TexelVertex, false, bDebugThisTexel && GeneralSettings.ViewSingleBounceNumber == 1, IrradianceCachingSettings.SkyOcclusionSmoothnessReduction, IndirectLighting, SecondInterpolatedIndirectLighting, BackfacingHitsFraction, Task->MappingContext.DebugCacheRecords));
// Replace sky occlusion in the lighting sample that will be written into the lightmap with the interpolated sky occlusion using IrradianceCachingSettings.SkyOcclusionSmoothnessReduction
IndirectLighting.SkyOcclusion = SecondInterpolatedIndirectLighting.SkyOcclusion;
IndirectLighting.StationarySkyLighting = SecondInterpolatedIndirectLighting.StationarySkyLighting;
if (Task->TextureMapping->Mesh->UsesTwoSidedLighting(TexelToVertex.ElementIndex))
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/TextureMapping.cpp:2985
Scope (from outer to inner):
file
namespace Lightmass
function void FStaticLightingSystem::ProcessInterpolateTask
Source code excerpt:
FFinalGatherSample BackFaceSecondInterpolatedIndirectLighting;
// Interpolate indirect lighting for the back face
verify(Task->FirstBounceCache->InterpolateLighting(TexelVertex, false, bDebugThisTexel && GeneralSettings.ViewSingleBounceNumber == 1, IrradianceCachingSettings.SkyOcclusionSmoothnessReduction, BackFaceIndirectLighting, BackFaceSecondInterpolatedIndirectLighting, BackFaceBackfacingHitsFraction, Task->MappingContext.DebugCacheRecords));
BackFaceIndirectLighting.SkyOcclusion = BackFaceSecondInterpolatedIndirectLighting.SkyOcclusion;
// Average front and back face incident lighting
IndirectLighting = (BackFaceIndirectLighting + IndirectLighting) * 0.5f;
}
if (BackfacingHitsFraction > 0.5f && BackFaceBackfacingHitsFraction > 0.5f)
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Public/SceneExport.h:102
Scope (from outer to inner):
file
namespace Lightmass
class class FStaticLightingSettings
Source code excerpt:
* Debugging - which single light bounce to view or -1 for all.
* This setting has been carefully implemented to only affect the final color and not affect any other part of the solver (sample positions, ray directions, etc).
* Most of the debug visualizations are affected by ViewSingleBounceNumber.
*/
int32 ViewSingleBounceNumber;
/**
* Debugging - when enabled, multiple samples will be used to detect all the texels that are mapped to geometry.
* Otherwise only the center and corner of each texel will be sampled.
*/
bool bUseConservativeTexelRasterization;
/** Debugging - whether to use the texel size in various calculations in an attempt to compensate for point sampling a texel. */
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Public/SceneExport.h:597
Scope (from outer to inner):
file
namespace Lightmass
class class FPhotonMappingSettings
Source code excerpt:
/**
* Debugging - whether to draw lines in the editor representing photon paths.
* They will only be drawn if a texel is selected and ViewSingleBounceNumber is >= 0.
*/
bool bVisualizePhotonPaths;
/**
* Debugging - whether to draw the photons gathered for the selected texel or the photons gathered by final gather rays from the selected texel.
* This includes importance, irradiance and direct photons.
*/
bool bVisualizePhotonGathers;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Public/SceneExport.h:616
Scope (from outer to inner):
file
namespace Lightmass
class class FPhotonMappingSettings
Source code excerpt:
/**
* Debugging - whether to gather and draw photon map octree nodes that get traversed during the irradiance calculation for the irradiance photon nearest to the select position.
* Which photon map search the nodes come from depends on ViewSingleBounceNumber.
*/
bool bVisualizeIrradiancePhotonCalculation;
/**
* Debugging - whether to emit any photons outside the importance volume, if one exists.
* If this is false, nothing outside the volume will bounce lighting and will be lit with direct lighting only.
*/
bool bEmitPhotonsOutsideImportanceVolume;