r.ShadowQuality
r.ShadowQuality
#Overview
name: r.ShadowQuality
The value of this variable can be defined or overridden in .ini config files. 22
.ini config files referencing this setting variable.
This variable is created as a Console Variable (cvar).
- type:
Var
- help:
Defines the shadow method which allows to adjust for quality or performance.\n 0:off, 1:low(unfiltered), 2:low .. 5:max (default)
It is referenced in 10
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of r.ShadowQuality is to define the shadow method in Unreal Engine, allowing developers to adjust the balance between visual quality and performance for shadow rendering.
This setting variable is primarily used by the rendering system, specifically the shadow rendering subsystem. It’s referenced in various parts of the engine, including the core runtime, renderer, and movie render pipeline.
The value of this variable is set in multiple places:
- It’s initialized with a default value of 5 in the ConsoleManager.cpp file.
- It can be modified through the scalability system (sg.ShadowQuality).
- It can be overridden in the MoviePipelineGameOverrideSetting for high-quality movie rendering.
The variable interacts with several other variables and systems:
- It’s associated with CVarShadowQuality, which is used in the scalability system.
- It affects the EngineShowFlags, specifically the DynamicShadows flag.
- It’s used in conjunction with other shadow-related variables like r.Shadow.DistanceScale and r.Shadow.RadiusThreshold.
Developers should be aware of the following when using this variable:
- The value ranges from 0 to 5, where 0 turns off shadows, 1 is low quality (unfiltered), and 5 is maximum quality.
- Changes to this variable are render thread safe and can be adjusted for scalability.
- Setting it to 0 will disable dynamic shadows entirely.
Best practices for using this variable include:
- Use it in conjunction with the scalability system for automatic quality adjustments based on hardware capabilities.
- Consider performance implications when setting higher quality levels, especially on lower-end hardware.
- For movie rendering or high-quality screenshots, set it to the maximum value of 5.
Regarding the associated variable CVarShadowQuality: The purpose of CVarShadowQuality is to provide a scalability-specific control for shadow quality. It’s part of the engine’s scalability system and allows for easy adjustment of shadow quality across different hardware configurations.
This variable is used in the Scalability namespace and is set through the scalability system. It interacts with the main r.ShadowQuality variable, effectively controlling it through the scalability settings.
Developers should be aware that changes to CVarShadowQuality will trigger callbacks that update the engine’s rendering settings. Best practices include using this variable when implementing scalability options in game settings menus, allowing players to adjust shadow quality as part of overall graphics quality presets.
#Setting Variables
#References In INI files
<Workspace>/Engine/Config/BaseDeviceProfiles.ini:905, section: [Android_Vulkan_SM5 DeviceProfile]
<Workspace>/Engine/Config/BaseScalability.ini:129, section: [ShadowQuality@0]
<Workspace>/Engine/Config/BaseScalability.ini:153, section: [ShadowQuality@1]
<Workspace>/Engine/Config/BaseScalability.ini:177, section: [ShadowQuality@2]
<Workspace>/Engine/Config/BaseScalability.ini:204, section: [ShadowQuality@3]
<Workspace>/Engine/Config/BaseScalability.ini:231, section: [ShadowQuality@Cine]
<Workspace>/Engine/Config/Android/AndroidScalability.ini:49, section: [ShadowQuality@0]
<Workspace>/Engine/Config/Android/AndroidScalability.ini:58, section: [ShadowQuality@1]
<Workspace>/Engine/Config/Android/AndroidScalability.ini:67, section: [ShadowQuality@2]
<Workspace>/Engine/Config/Android/AndroidScalability.ini:76, section: [ShadowQuality@3]
<Workspace>/Engine/Config/IOS/IOSScalability.ini:49, section: [ShadowQuality@0]
<Workspace>/Engine/Config/IOS/IOSScalability.ini:58, section: [ShadowQuality@1]
<Workspace>/Engine/Config/IOS/IOSScalability.ini:67, section: [ShadowQuality@2]
<Workspace>/Engine/Config/IOS/IOSScalability.ini:76, section: [ShadowQuality@3]
<Workspace>/Projects/Lyra/Config/Android/AndroidScalability.ini:17, section: [ShadowQuality@0]
<Workspace>/Projects/Lyra/Config/Android/AndroidScalability.ini:20, section: [ShadowQuality@1]
<Workspace>/Projects/Lyra/Config/Android/AndroidScalability.ini:25, section: [ShadowQuality@2]
<Workspace>/Projects/Lyra/Config/Android/AndroidScalability.ini:30, section: [ShadowQuality@3]
<Workspace>/Projects/Lyra/Config/IOS/IOSScalability.ini:17, section: [ShadowQuality@0]
<Workspace>/Projects/Lyra/Config/IOS/IOSScalability.ini:20, section: [ShadowQuality@1]
<Workspace>/Projects/Lyra/Config/IOS/IOSScalability.ini:25, section: [ShadowQuality@2]
<Workspace>/Projects/Lyra/Config/IOS/IOSScalability.ini:30, section: [ShadowQuality@3]
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:3646
Scope: file
Source code excerpt:
static TAutoConsoleVariable<int32> CVarShadowQuality(
TEXT("r.ShadowQuality"),
5,
TEXT("Defines the shadow method which allows to adjust for quality or performance.\n"
" 0:off, 1:low(unfiltered), 2:low .. 5:max (default)"),
ECVF_Scalability | ECVF_RenderThreadSafe);
static TAutoConsoleVariable<int32> CVarMotionBlurQuality(
#Loc: <Workspace>/Engine/Plugins/MovieScene/MovieRenderPipeline/Source/MovieRenderPipelineCore/Private/MoviePipelineGameOverrideSetting.cpp:83
Scope (from outer to inner):
file
function void UMoviePipelineGameOverrideSetting::ApplyCVarSettings
Source code excerpt:
{
MOVIEPIPELINE_STORE_AND_OVERRIDE_CVAR_INT(PreviousShadowDistanceScale, TEXT("r.Shadow.DistanceScale"), ShadowDistanceScale, bOverrideValues);
MOVIEPIPELINE_STORE_AND_OVERRIDE_CVAR_INT(PreviousShadowQuality, TEXT("r.ShadowQuality"), 5, bOverrideValues);
MOVIEPIPELINE_STORE_AND_OVERRIDE_CVAR_FLOAT(PreviousShadowRadiusThreshold, TEXT("r.Shadow.RadiusThreshold"), ShadowRadiusThreshold, bOverrideValues);
}
if (bOverrideViewDistanceScale)
{
MOVIEPIPELINE_STORE_AND_OVERRIDE_CVAR_INT(PreviousViewDistanceScale, TEXT("r.ViewDistanceScale"), ViewDistanceScale, bOverrideValues);
#Loc: <Workspace>/Engine/Plugins/MovieScene/MovieRenderPipeline/Source/MovieRenderPipelineCore/Private/MoviePipelineGameOverrideSetting.cpp:207
Scope (from outer to inner):
file
function void UMoviePipelineGameOverrideSetting::BuildNewProcessCommandLineArgsImpl
Source code excerpt:
InOutDeviceProfileCvars.Add(FString::Printf(TEXT("r.Shadow.DistanceScale=%d"), ShadowDistanceScale));
InOutDeviceProfileCvars.Add(FString::Printf(TEXT("r.Shadow.RadiusThreshold=%f"), ShadowRadiusThreshold));
InOutDeviceProfileCvars.Add(TEXT("r.ShadowQuality=5"));
}
if (bOverrideViewDistanceScale)
{
InOutDeviceProfileCvars.Add(FString::Printf(TEXT("r.ViewDistanceScale=%d"), ViewDistanceScale));
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/ShowFlags.cpp:455
Scope (from outer to inner):
file
function void EngineShowFlagOverride
Source code excerpt:
{
static const auto ICVar = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.ShadowQuality"));
if(ICVar->GetValueOnGameThread() <= 0)
{
EngineShowFlags.SetDynamicShadows(false);
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/ShadowRendering.cpp:250
Scope (from outer to inner):
file
function uint32 GetShadowQuality
Source code excerpt:
uint32 GetShadowQuality()
{
static const auto ICVarQuality = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.ShadowQuality"));
int Ret = ICVarQuality->GetValueOnRenderThread();
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
static const auto ICVarLimit = IConsoleManager::Get().FindTConsoleVariableDataInt(TEXT("r.LimitRenderingFeatures"));
if(ICVarLimit)
#Associated Variable and Callsites
This variable is associated with another variable named CVarShadowQuality
. They share the same value. See the following C++ source code.
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:3642
Scope: file
Source code excerpt:
"<0: use default setting (default -1)\n"
" 0: no effect on static lighting, 0 is free meaning no extra rendering pass\n"
" 1: AO affects the stat lighting"),
ECVF_Default);
static TAutoConsoleVariable<int32> CVarShadowQuality(
TEXT("r.ShadowQuality"),
5,
TEXT("Defines the shadow method which allows to adjust for quality or performance.\n"
" 0:off, 1:low(unfiltered), 2:low .. 5:max (default)"),
ECVF_Scalability | ECVF_RenderThreadSafe);
static TAutoConsoleVariable<int32> CVarMotionBlurQuality(
TEXT("r.MotionBlurQuality"),
4,
TEXT("Defines the motion blur method which allows to adjust for quality or performance.\n"
" 0:off, 1:low, 2:medium, 3:high (default), 4: very high"),
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:48
Scope: file
Source code excerpt:
Scalability::DefaultQualityLevel,
TEXT("Scalability quality state (internally used by scalability system, ini load/save or using SCALABILITY console command)\n")
TEXT(" 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3"),
ECVF_ScalabilityGroup | ECVF_Preview);
static TAutoConsoleVariable<int32> CVarShadowQuality(
TEXT("sg.ShadowQuality"),
Scalability::DefaultQualityLevel,
TEXT("Scalability quality state (internally used by scalability system, ini load/save or using SCALABILITY console command)\n")
TEXT(" 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3"),
ECVF_ScalabilityGroup | ECVF_Preview);
static TAutoConsoleVariable<int32> CVarGlobalIlluminationQuality(
TEXT("sg.GlobalIlluminationQuality"),
Scalability::DefaultQualityLevel,
TEXT("Scalability quality state (internally used by scalability system, ini load/save or using SCALABILITY console command)\n")
TEXT(" 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3"),
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:584
Scope (from outer to inner):
file
namespace Scalability
function void InitScalabilitySystem
Source code excerpt:
}
CVarResolutionQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeResolutionQuality));
CVarViewDistanceQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeViewDistanceQuality));
CVarAntiAliasingQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeAntiAliasingQuality));
CVarShadowQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeShadowQuality));
CVarGlobalIlluminationQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeGlobalIlluminationQuality));
CVarReflectionQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeReflectionQuality));
CVarPostProcessQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangePostProcessQuality));
CVarTextureQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeTextureQuality));
CVarEffectsQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeEffectsQuality));
CVarFoliageQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeFoliageQuality));
CVarShadingQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeShadingQuality));
CVarLandscapeQuality.AsVariable()->SetOnChangedCallback(FConsoleVariableDelegate::CreateStatic(&OnChangeLandscapeQuality));
#if WITH_EDITOR
ScalabilityShaderPlatform = GMaxRHIShaderPlatform;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:886
Scope (from outer to inner):
file
namespace Scalability
function void SetQualityLevels
Source code excerpt:
if (GetQualityLevels() != ClampedLevels || bForce)
{
SetQualityLevelCVar(CVarResolutionQuality, ClampedLevels.ResolutionQuality, GScalabilityQualityLevelsOverride.ResolutionQuality, bForce);
SetQualityLevelCVar(CVarViewDistanceQuality, ClampedLevels.ViewDistanceQuality, GScalabilityQualityLevelsOverride.ViewDistanceQuality, bForce);
SetQualityLevelCVar(CVarAntiAliasingQuality, ClampedLevels.AntiAliasingQuality, GScalabilityQualityLevelsOverride.AntiAliasingQuality, bForce);
SetQualityLevelCVar(CVarShadowQuality, ClampedLevels.ShadowQuality, GScalabilityQualityLevelsOverride.ShadowQuality, bForce);
SetQualityLevelCVar(CVarGlobalIlluminationQuality, ClampedLevels.GlobalIlluminationQuality, GScalabilityQualityLevelsOverride.GlobalIlluminationQuality, bForce);
SetQualityLevelCVar(CVarReflectionQuality, ClampedLevels.ReflectionQuality, GScalabilityQualityLevelsOverride.ReflectionQuality, bForce);
SetQualityLevelCVar(CVarPostProcessQuality, ClampedLevels.PostProcessQuality, GScalabilityQualityLevelsOverride.PostProcessQuality, bForce);
SetQualityLevelCVar(CVarTextureQuality, ClampedLevels.TextureQuality, GScalabilityQualityLevelsOverride.TextureQuality, bForce);
SetQualityLevelCVar(CVarEffectsQuality, ClampedLevels.EffectsQuality, GScalabilityQualityLevelsOverride.EffectsQuality, bForce);
SetQualityLevelCVar(CVarFoliageQuality, ClampedLevels.FoliageQuality, GScalabilityQualityLevelsOverride.FoliageQuality, bForce);
SetQualityLevelCVar(CVarShadingQuality, ClampedLevels.ShadingQuality, GScalabilityQualityLevelsOverride.ShadingQuality, bForce);
SetQualityLevelCVar(CVarLandscapeQuality, ClampedLevels.LandscapeQuality, GScalabilityQualityLevelsOverride.LandscapeQuality, bForce);
OnScalabilitySettingsChanged.Broadcast(ClampedLevels);
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/Scalability.cpp:918
Scope (from outer to inner):
file
namespace Scalability
function FQualityLevels GetQualityLevels
Source code excerpt:
if (!GScalabilityUsingTemporaryQualityLevels)
{
Ret.ResolutionQuality = CVarResolutionQuality.GetValueOnGameThread();
Ret.ViewDistanceQuality = CVarViewDistanceQuality.GetValueOnGameThread();
Ret.AntiAliasingQuality = CVarAntiAliasingQuality.GetValueOnGameThread();
Ret.ShadowQuality = CVarShadowQuality.GetValueOnGameThread();
Ret.GlobalIlluminationQuality = CVarGlobalIlluminationQuality.GetValueOnGameThread();
Ret.ReflectionQuality = CVarReflectionQuality.GetValueOnGameThread();
Ret.PostProcessQuality = CVarPostProcessQuality.GetValueOnGameThread();
Ret.TextureQuality = CVarTextureQuality.GetValueOnGameThread();
Ret.EffectsQuality = CVarEffectsQuality.GetValueOnGameThread();
Ret.FoliageQuality = CVarFoliageQuality.GetValueOnGameThread();
Ret.ShadingQuality = CVarShadingQuality.GetValueOnGameThread();
Ret.LandscapeQuality = CVarLandscapeQuality.GetValueOnGameThread();
}
else
{