r.SupportLowQualityLightmaps
r.SupportLowQualityLightmaps
#Overview
name: r.SupportLowQualityLightmaps
This variable is created as a Console Variable (cvar).
- type:
Var
- help:
Support low quality lightmap shader permutations
It is referenced in 18
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of r.SupportLowQualityLightmaps is to control the support for low-quality lightmap shader permutations in Unreal Engine’s rendering system. This variable is primarily used in the lighting and rendering subsystems of the engine.
- The rendering system, particularly the BasePass and LightMap modules, rely on this setting variable.
- The value of this variable is set as a console variable (CVar) with a default value of 1, meaning low-quality lightmaps are supported by default.
- It interacts with several other variables, most notably CVarSupportAllShaderPermutations, which can force all shader permutations to be compiled regardless of other settings.
- Developers must be aware that changing this variable can affect the quality of lightmaps and the number of shader permutations that need to be compiled.
- Best practices include:
- Only disable low-quality lightmaps if you’re certain your project doesn’t need them and you want to reduce shader permutations.
- Consider the performance implications of enabling or disabling this feature, especially on lower-end hardware.
- Test thoroughly after changing this setting, as it can affect the visual quality and performance of your game.
The associated variable CVarSupportLowQualityLightmaps is essentially the same as r.SupportLowQualityLightmaps, just accessed through a different method. It’s used in various parts of the engine to check if low-quality lightmaps should be supported. The same considerations apply to this variable as to r.SupportLowQualityLightmaps.
When using either of these variables, developers should:
- Be consistent in which variable they use throughout their codebase to avoid confusion.
- Be aware that changing this setting at runtime may not have an immediate effect, as some systems may cache the value.
- Consider the impact on shader compilation times and storage requirements when enabling or disabling this feature.
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/BasePassRendering.cpp:71
Scope: file
Source code excerpt:
static TAutoConsoleVariable<int32> CVarSupportLowQualityLightmaps(
TEXT("r.SupportLowQualityLightmaps"),
1,
TEXT("Support low quality lightmap shader permutations"),
ECVF_ReadOnly | ECVF_RenderThreadSafe);
static TAutoConsoleVariable<int32> CVarSupportAllShaderPermutations(
TEXT("r.SupportAllShaderPermutations"),
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/Engine/Engine.h:1554
Scope: file
Source code excerpt:
/**
* Whether or not the LQ lightmaps should be generated during lighting rebuilds. This has been moved to r.SupportLowQualityLightmaps.
*/
UPROPERTY(globalconfig)
uint32 bShouldGenerateLowQualityLightmaps_DEPRECATED :1;
// Various Colors used for editor and debug rendering
UPROPERTY()
FColor C_WorldBox;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/LightMap.cpp:1212
Scope (from outer to inner):
file
function void FLightMapPendingTexture::CreateUObjects
Source code excerpt:
Textures[CoefficientIndex] = nullptr;
// Skip generating simple lightmaps if wanted.
static const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmaps) || (CVarSupportLowQualityLightmaps->GetValueOnAnyThread() != 0);
if ((!bAllowLowQualityLightMaps) && CoefficientIndex >= LQ_LIGHTMAP_COEF_INDEX)
{
continue;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/LightMap.cpp:1233
Scope (from outer to inner):
file
function void FLightMapPendingTexture::CreateUObjects
Source code excerpt:
NumVirtualTextureLayers[CoefficientIndex] = 0;
// Skip generating simple lightmaps if wanted.
static const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmaps) || (CVarSupportLowQualityLightmaps->GetValueOnAnyThread() != 0);
if ((!bAllowLowQualityLightMaps) && CoefficientIndex >= LQ_LIGHTMAP_COEF_INDEX)
{
continue;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/LightMap.cpp:2911
Scope: file
Source code excerpt:
{
#if WITH_EDITOR
static const auto CVarSupportLowQualityLightmap = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmap) || (CVarSupportLowQualityLightmap->GetValueOnAnyThread() != 0);
if (VirtualTextures[0] && (!bAllowLowQualityLightMaps || (bAllowLowQualityLightMaps && VirtualTextures[1])))
#else
if (VirtualTextures[0] || VirtualTextures[1])
#endif
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/LightMap.cpp:3321
Scope (from outer to inner):
file
function bool FQuantizedLightmapData::HasNonZeroData
Source code excerpt:
{
// Don't look at simple lightmap coefficients if we're not building them.
static const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmaps) || (CVarSupportLowQualityLightmaps->GetValueOnAnyThread() != 0);
const int32 NumCoefficients = bAllowLowQualityLightMaps ? NUM_STORED_LIGHTMAP_COEF : NUM_HQ_LIGHTMAP_COEF;
for (int32 CoefficentIndex = 0; CoefficentIndex < NumCoefficients; CoefficentIndex++)
{
if ((LightmapSample.Coefficients[CoefficentIndex][0] != 0) || (LightmapSample.Coefficients[CoefficentIndex][1] != 0) || (LightmapSample.Coefficients[CoefficentIndex][2] != 0))
#Loc: <Workspace>/Engine/Source/Runtime/RenderCore/Private/ReadOnlyCVARCache.cpp:63
Scope (from outer to inner):
file
function void FReadOnlyCVARCache::Initialize
Source code excerpt:
const auto CVarSupportStationarySkylight = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportStationarySkylight"));
const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const auto CVarSupportPointLightWholeSceneShadows = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportPointLightWholeSceneShadows"));
const auto CVarSupportAllShaderPermutations = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportAllShaderPermutations"));
const auto CVarVertexFoggingForOpaque = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.VertexFoggingForOpaque"));
const auto CVarAllowStaticLighting = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.AllowStaticLighting"));
const auto CVarSupportSkyAtmosphere = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportSkyAtmosphere"));
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/BasePassRendering.cpp:2183
Scope (from outer to inner):
file
function ELightMapPolicyType FBasePassMeshProcessor::GetUniformLightMapPolicyType
Source code excerpt:
const bool bUseVolumetricLightmap = Scene && Scene->VolumetricLightmapSceneData.HasData();
static const auto CVarSupportLowQualityLightmap = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmap) || (CVarSupportLowQualityLightmap->GetValueOnAnyThread() != 0);
ELightMapPolicyType LightMapPolicyType = LMP_DUMMY;
switch (LightMapInteraction.GetType())
{
case LMIT_Texture:
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/BasePassRendering.cpp:2284
Scope (from outer to inner):
file
function TArray<ELightMapPolicyType, TInlineAllocator<2>> FBasePassMeshProcessor::GetUniformLightMapPolicyTypeForPSOCollection
Source code excerpt:
const bool bPlatformAllowsHighQualityLightMaps = AllowHighQualityLightmaps(FeatureLevel);
static const auto CVarSupportLowQualityLightmap = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmap) || (CVarSupportLowQualityLightmap->GetValueOnAnyThread() != 0);
// Retrieve those values or have as global precache params (if not known then we have to assume they can be used for now)
const bool bAllowIndirectLightingCache = true;// Scene&& Scene->PrecomputedLightVolumes.Num() > 0;
const bool bUseVolumetricLightmap = true;// Scene&& Scene->VolumetricLightmapSceneData.HasData();
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/LightMapDensityRendering.cpp:267
Scope (from outer to inner):
file
function bool FLightmapDensityMeshProcessor::TryAddMeshBatch
Source code excerpt:
bool bAllowHighQualityLightMaps = AllowHighQualityLightmaps(FeatureLevel) && LightMapInteraction.AllowsHighQualityLightmaps();
static const auto SupportLowQualityLightmapsVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!SupportLowQualityLightmapsVar) || (SupportLowQualityLightmapsVar->GetValueOnAnyThread() != 0);
if ((!bTranslucentBlendMode || ViewIfDynamicMeshCommand->Family->EngineShowFlags.Wireframe)
&& ShouldIncludeMaterialInDefaultOpaquePass(*Material))
{
if (!bMaterialMasked && !Material->MaterialModifiesMeshPosition_RenderThread())
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/LightMapRendering.cpp:48
Scope (from outer to inner):
file
function bool LightMapPolicyImpl::ShouldCompilePermutation
Source code excerpt:
bool LightMapPolicyImpl::ShouldCompilePermutation(ELightmapQuality LightmapQuality, const FMeshMaterialShaderPermutationParameters& Parameters)
{
static const auto CVarProjectCanHaveLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
static const auto CVarSupportAllShadersPermutations = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportAllShaderPermutations"));
const bool bForceAllPermutations = CVarSupportAllShadersPermutations && CVarSupportAllShadersPermutations->GetValueOnAnyThread() != 0;
// if GEngine doesn't exist yet to have the project flag then we should be conservative and cache the LQ lightmap policy
const bool bProjectCanHaveLowQualityLightmaps = bForceAllPermutations || (!CVarProjectCanHaveLowQualityLightmaps) || (CVarProjectCanHaveLowQualityLightmaps->GetValueOnAnyThread() != 0);
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/RayTracing/RayTracingMaterialHitShaders.cpp:490
Scope (from outer to inner):
file
function bool FRayTracingMeshProcessor::TryAddMeshBatch
Source code excerpt:
{
static const auto CVarSupportLowQualityLightmap = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmap) || (CVarSupportLowQualityLightmap->GetValueOnAnyThread() != 0);
switch (LightMapInteraction.GetType())
{
case LMIT_Texture:
if (bAllowHighQualityLightMaps)
#Associated Variable and Callsites
This variable is associated with another variable named CVarSupportLowQualityLightmaps
. They share the same value. See the following C++ source code.
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/LightMap.cpp:1212
Scope (from outer to inner):
file
function void FLightMapPendingTexture::CreateUObjects
Source code excerpt:
Textures[CoefficientIndex] = nullptr;
// Skip generating simple lightmaps if wanted.
static const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmaps) || (CVarSupportLowQualityLightmaps->GetValueOnAnyThread() != 0);
if ((!bAllowLowQualityLightMaps) && CoefficientIndex >= LQ_LIGHTMAP_COEF_INDEX)
{
continue;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/LightMap.cpp:1233
Scope (from outer to inner):
file
function void FLightMapPendingTexture::CreateUObjects
Source code excerpt:
NumVirtualTextureLayers[CoefficientIndex] = 0;
// Skip generating simple lightmaps if wanted.
static const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmaps) || (CVarSupportLowQualityLightmaps->GetValueOnAnyThread() != 0);
if ((!bAllowLowQualityLightMaps) && CoefficientIndex >= LQ_LIGHTMAP_COEF_INDEX)
{
continue;
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/LightMap.cpp:3321
Scope (from outer to inner):
file
function bool FQuantizedLightmapData::HasNonZeroData
Source code excerpt:
{
// Don't look at simple lightmap coefficients if we're not building them.
static const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const bool bAllowLowQualityLightMaps = (!CVarSupportLowQualityLightmaps) || (CVarSupportLowQualityLightmaps->GetValueOnAnyThread() != 0);
const int32 NumCoefficients = bAllowLowQualityLightMaps ? NUM_STORED_LIGHTMAP_COEF : NUM_HQ_LIGHTMAP_COEF;
for (int32 CoefficentIndex = 0; CoefficentIndex < NumCoefficients; CoefficentIndex++)
{
if ((LightmapSample.Coefficients[CoefficentIndex][0] != 0) || (LightmapSample.Coefficients[CoefficentIndex][1] != 0) || (LightmapSample.Coefficients[CoefficentIndex][2] != 0))
{
#Loc: <Workspace>/Engine/Source/Runtime/RenderCore/Private/ReadOnlyCVARCache.cpp:63
Scope (from outer to inner):
file
function void FReadOnlyCVARCache::Initialize
Source code excerpt:
const auto CVarSupportStationarySkylight = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportStationarySkylight"));
const auto CVarSupportLowQualityLightmaps = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportLowQualityLightmaps"));
const auto CVarSupportPointLightWholeSceneShadows = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportPointLightWholeSceneShadows"));
const auto CVarSupportAllShaderPermutations = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportAllShaderPermutations"));
const auto CVarVertexFoggingForOpaque = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.VertexFoggingForOpaque"));
const auto CVarAllowStaticLighting = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.AllowStaticLighting"));
const auto CVarSupportSkyAtmosphere = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.SupportSkyAtmosphere"));
#Loc: <Workspace>/Engine/Source/Runtime/RenderCore/Private/ReadOnlyCVARCache.cpp:83
Scope (from outer to inner):
file
function void FReadOnlyCVARCache::Initialize
Source code excerpt:
bEnableStationarySkylight = !CVarSupportStationarySkylight || CVarSupportStationarySkylight->GetValueOnAnyThread() != 0 || bForceAllPermutations;
bEnablePointLightShadows = !CVarSupportPointLightWholeSceneShadows || CVarSupportPointLightWholeSceneShadows->GetValueOnAnyThread() != 0 || bForceAllPermutations;
bEnableLowQualityLightmaps = !CVarSupportLowQualityLightmaps || CVarSupportLowQualityLightmaps->GetValueOnAnyThread() != 0 || bForceAllPermutations;
bAllowStaticLighting = CVarAllowStaticLighting->GetValueOnAnyThread() != 0;
bSupportSkyAtmosphere = !CVarSupportSkyAtmosphere || CVarSupportSkyAtmosphere->GetValueOnAnyThread() != 0 || bForceAllPermutations;
// mobile
bMobileHDR = CVarMobileHDR->GetValueOnAnyThread() == 1;
bMobileAllowMovableDirectionalLights = CVarMobileAllowMovableDirectionalLights->GetValueOnAnyThread() != 0;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/BasePassRendering.cpp:70
Scope: file
Source code excerpt:
ECVF_ReadOnly | ECVF_RenderThreadSafe);
static TAutoConsoleVariable<int32> CVarSupportLowQualityLightmaps(
TEXT("r.SupportLowQualityLightmaps"),
1,
TEXT("Support low quality lightmap shader permutations"),
ECVF_ReadOnly | ECVF_RenderThreadSafe);
static TAutoConsoleVariable<int32> CVarSupportAllShaderPermutations(