FirstSurfaceSampleLayerHeight
FirstSurfaceSampleLayerHeight
#Overview
name: FirstSurfaceSampleLayerHeight
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 4
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of FirstSurfaceSampleLayerHeight is to define the height of the first sample layer above a surface in Unreal Engine’s dynamic object lighting system. This setting is crucial for the precomputed dynamic object lighting calculations, which are part of the global illumination and lighting system in Unreal Engine.
This setting variable is primarily used by the Lightmass subsystem, which is responsible for precalculating complex lighting scenarios. It’s specifically utilized in the precomputed dynamic object lighting module, as evidenced by its presence in the “DevOptions.PrecomputedDynamicObjectLighting” section of the configuration.
The value of this variable is typically set in the Lightmass configuration file (GLightmassIni). It’s read from this configuration file in the FLightmassExporter::WriteSceneSettings function in Lightmass.cpp.
FirstSurfaceSampleLayerHeight interacts with several other variables in the dynamic object lighting system, including:
- SurfaceLightSampleSpacing
- SurfaceSampleLayerHeightSpacing
- NumSurfaceSampleLayers
Developers should be aware that this variable is scaled by the StaticLightingLevelScale, as seen in the ApplyStaticLightingScale function. This means that changes to the overall static lighting scale will affect this value proportionally.
Best practices when using this variable include:
- Carefully consider its value in relation to the scale of your scene and objects.
- Adjust it in conjunction with related variables like SurfaceSampleLayerHeightSpacing for optimal results.
- Be mindful of performance implications when increasing this value, as it can affect the number of samples calculated.
- Test different values to find the right balance between lighting quality and performance for your specific use case.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/BaseLightmass.ini:80, section: [DevOptions.PrecomputedDynamicObjectLighting]
- INI Section:
DevOptions.PrecomputedDynamicObjectLighting
- Raw value:
50
- 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:2257
Scope (from outer to inner):
file
function void FLightmassExporter::WriteSceneSettings
Source code excerpt:
VERIFYLIGHTMASSINI(GConfig->GetFloat(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("NumHemisphereSamplesScale"), Scene.DynamicObjectSettings.NumHemisphereSamplesScale, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetFloat(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("SurfaceLightSampleSpacing"), Scene.DynamicObjectSettings.SurfaceLightSampleSpacing, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetFloat(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("FirstSurfaceSampleLayerHeight"), Scene.DynamicObjectSettings.FirstSurfaceSampleLayerHeight, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetFloat(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("SurfaceSampleLayerHeightSpacing"), Scene.DynamicObjectSettings.SurfaceSampleLayerHeightSpacing, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetInt(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("NumSurfaceSampleLayers"), Scene.DynamicObjectSettings.NumSurfaceSampleLayers, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetFloat(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("DetailVolumeSampleSpacing"), Scene.DynamicObjectSettings.DetailVolumeSampleSpacing, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetFloat(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("VolumeLightSampleSpacing"), Scene.DynamicObjectSettings.VolumeLightSampleSpacing, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetInt(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("MaxVolumeSamples"), Scene.DynamicObjectSettings.MaxVolumeSamples, GLightmassIni));
VERIFYLIGHTMASSINI(GConfig->GetBool(TEXT("DevOptions.PrecomputedDynamicObjectLighting"), TEXT("bUseMaxSurfaceSampleNum"), bConfigBool, GLightmassIni));
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/ImportExport/LightmassScene.cpp:516
Scope (from outer to inner):
file
namespace Lightmass
function void FScene::ApplyStaticLightingScale
Source code excerpt:
MeshAreaLightSettings.MeshAreaLightSimplifyCornerDistanceThreshold *= SceneConstants.StaticLightingLevelScale;
MeshAreaLightSettings.MeshAreaLightGeneratedDynamicLightSurfaceOffset *= SceneConstants.StaticLightingLevelScale;
DynamicObjectSettings.FirstSurfaceSampleLayerHeight *= SceneConstants.StaticLightingLevelScale;
DynamicObjectSettings.SurfaceLightSampleSpacing *= SceneConstants.StaticLightingLevelScale;
DynamicObjectSettings.SurfaceSampleLayerHeightSpacing *= SceneConstants.StaticLightingLevelScale;
DynamicObjectSettings.DetailVolumeSampleSpacing *= SceneConstants.StaticLightingLevelScale;
DynamicObjectSettings.VolumeLightSampleSpacing *= SceneConstants.StaticLightingLevelScale;
VolumeDistanceFieldSettings.VoxelSize *= SceneConstants.StaticLightingLevelScale;
VolumeDistanceFieldSettings.VolumeMaxDistance *= SceneConstants.StaticLightingLevelScale;
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Private/Lighting/SampleVolume.cpp:118
Scope (from outer to inner):
file
namespace Lightmass
class class FVolumeSamplePlacementRasterPolicy
function FVolumeSamplePlacementRasterPolicy
Source code excerpt:
{
LayerHeightOffsets.Empty(System.DynamicObjectSettings.NumSurfaceSampleLayers);
LayerHeightOffsets.Add(System.DynamicObjectSettings.FirstSurfaceSampleLayerHeight);
for (int32 i = 1; i < System.DynamicObjectSettings.NumSurfaceSampleLayers; i++)
{
LayerHeightOffsets.Add(System.DynamicObjectSettings.FirstSurfaceSampleLayerHeight + i * System.DynamicObjectSettings.SurfaceSampleLayerHeightSpacing);
}
TArray<FVector2f> UniformHemisphereSampleUniforms;
const int32 NumUpperVolumeSamples = 16;
const float NumThetaStepsFloat = FMath::Sqrt(NumUpperVolumeSamples / (float)PI);
#Loc: <Workspace>/Engine/Source/Programs/UnrealLightmass/Public/SceneExport.h:314
Scope (from outer to inner):
file
namespace Lightmass
class class FDynamicObjectSettings
Source code excerpt:
float SurfaceLightSampleSpacing;
/** Height of the first sample layer above the surface. */
float FirstSurfaceSampleLayerHeight;
/** Height difference of successive layers. */
float SurfaceSampleLayerHeightSpacing;
/** Number of layers to place above surfaces. */
int32 NumSurfaceSampleLayers;
/** Distance between samples placed in a 3d uniform grid inside detail volumes. */
float DetailVolumeSampleSpacing;