using System;
using UnityEngine.Serialization;
namespace UnityEngine.Rendering.HighDefinition
{
///
/// A volume component that holds settings for the global illumination (screen space and ray traced).
///
[Serializable, VolumeComponentMenu("Lighting/Screen Space Global Illumination")]
[SupportedOnRenderPipeline(typeof(HDRenderPipelineAsset))]
[HDRPHelpURL("Ray-Traced-Global-Illumination")]
public sealed class GlobalIllumination : VolumeComponentWithQuality
{
bool UsesQualityMode()
{
// The default value is set to quality. So we should be in quality if not overriden or we have an override set to quality
return (tracing.overrideState && tracing == RayCastingMode.RayTracing && (!mode.overrideState || (mode.overrideState && mode == RayTracingMode.Quality)));
}
#region General
///
/// Enable screen space global illumination.
///
[Tooltip("Enable screen space global illumination.")]
public BoolParameter enable = new BoolParameter(false, BoolParameter.DisplayType.EnumPopup);
///
///
[Tooltip("Controls the casting technique used to evaluate the effect. Ray marching uses a ray-marched screen-space solution, Ray tracing uses a hardware accelerated world-space solution. Mixed uses first Ray marching, then Ray tracing if it fails to intersect on-screen geometry.")]
public RayCastingModeParameter tracing = new RayCastingModeParameter(RayCastingMode.RayMarching);
///
/// Controls the fallback hierarchy for indirect diffuse in case the ray misses.
///
[Tooltip("Controls the fallback hierarchy for indirect diffuse in case the ray misses.")]
[FormerlySerializedAs("fallbackHierarchy")]
[AdditionalProperty]
public RayMarchingFallbackHierarchyParameter rayMiss = new RayMarchingFallbackHierarchyParameter(RayMarchingFallbackHierarchy.ReflectionProbesAndSky);
///
/// Controls the fallback hierarchy for indirect diffuse in case the ray misses.
///
[Tooltip("Rendering Layer Mask to use when sampling the Adaptive Probe Volumes.\nThis is only used if Rendering Layers Masks are enabled for the active Baking Set.")]
[AdditionalProperty]
public RenderingLayerMaskParameter adaptiveProbeVolumesLayerMask = new RenderingLayerMaskParameter(UnityEngine.RenderingLayerMask.defaultRenderingLayerMask);
#endregion
#region RayMarching
///
/// The thickness of the depth buffer value used for the ray marching step
///
[Tooltip("Controls the thickness of the depth buffer used for ray marching.")]
public ClampedFloatParameter depthBufferThickness = new ClampedFloatParameter(0.1f, 0.0f, 0.5f);
GlobalIllumination()
{
displayName = "Screen Space Global Illumination";
}
///
/// Defines if the screen space global illumination should be evaluated at full resolution.
///
public BoolParameter fullResolutionSS = new BoolParameter(true);
///
/// The number of steps that should be used during the ray marching pass.
///
public int maxRaySteps
{
get
{
if (!UsesQualitySettings())
return m_MaxRaySteps.value;
else
return GetLightingQualitySettings().SSGIRaySteps[(int)quality.value];
}
set { m_MaxRaySteps.value = value; }
}
[SerializeField]
[Tooltip("Controls the number of steps used for ray marching.")]
private MinIntParameter m_MaxRaySteps = new MinIntParameter(32, 0);
// Filtering
///
/// Defines if the screen space global illumination should be denoised.
///
public bool denoiseSS
{
get
{
if (!UsesQualitySettings())
return m_DenoiseSS.value;
else
return GetLightingQualitySettings().SSGIDenoise[(int)quality.value];
}
set { m_DenoiseSS.value = value; }
}
[SerializeField, FormerlySerializedAs("denoise")]
private BoolParameter m_DenoiseSS = new BoolParameter(true);
///
/// Defines if the denoiser should be evaluated at half resolution.
///
public bool halfResolutionDenoiserSS
{
get
{
if (!UsesQualitySettings() || UsesQualityMode())
return m_HalfResolutionDenoiserSS.value;
else
return GetLightingQualitySettings().SSGIHalfResDenoise[(int)quality.value];
}
set { m_HalfResolutionDenoiserSS.value = value; }
}
[SerializeField]
[Tooltip("Use a half resolution denoiser.")]
private BoolParameter m_HalfResolutionDenoiserSS = new BoolParameter(false);
///
/// Controls the radius of the global illumination denoiser (First Pass).
///
public float denoiserRadiusSS
{
get
{
if (!UsesQualitySettings())
return m_DenoiserRadiusSS.value;
else
return GetLightingQualitySettings().SSGIDenoiserRadius[(int)quality.value];
}
set { m_DenoiserRadiusSS.value = value; }
}
[SerializeField]
[Tooltip("Controls the radius of the GI denoiser (First Pass).")]
private ClampedFloatParameter m_DenoiserRadiusSS = new ClampedFloatParameter(0.6f, 0.001f, 1.0f);
///
/// Defines if the second denoising pass should be enabled.
///
public bool secondDenoiserPassSS
{
get
{
if (!UsesQualitySettings())
return m_SecondDenoiserPassSS.value;
else
return GetLightingQualitySettings().SSGISecondDenoise[(int)quality.value];
}
set { m_SecondDenoiserPassSS.value = value; }
}
[SerializeField]
[Tooltip("Enable second denoising pass.")]
private BoolParameter m_SecondDenoiserPassSS = new BoolParameter(true);
#endregion
#region RayTracing
///
/// Controls the fallback hierarchy for lighting the last bounce.
///
[Tooltip("Controls the fallback hierarchy for lighting the last bounce.")]
[AdditionalProperty]
public RayMarchingFallbackHierarchyParameter lastBounceFallbackHierarchy = new RayMarchingFallbackHierarchyParameter(RayMarchingFallbackHierarchy.ReflectionProbesAndSky);
///
/// Controls the dimmer applied to the ambient and legacy light probes.
///
[Tooltip("Controls the dimmer applied to the ambient and legacy light probes.")]
[AdditionalProperty]
public ClampedFloatParameter ambientProbeDimmer = new ClampedFloatParameter(0.0f, 0.0f, 1.0f);
///
/// Defines the layers that GI should include.
///
[Tooltip("Defines the layers that GI should include.")]
public LayerMaskParameter layerMask = new LayerMaskParameter(-1);
///
/// The LOD Bias that HDRP adds to texture sampling in the global illumination.
///
[Tooltip("The LOD Bias that HDRP adds to texture sampling in the global illumination. A higher value increases performance and makes denoising easier, but it might reduce visual fidelity.")]
public ClampedFloatParameter textureLodBias = new ClampedFloatParameter(7.0f, 0.0f, 7.0f);
///
/// Controls the length of GI rays in meters.
///
public float rayLength
{
get
{
if (!UsesQualitySettings() || UsesQualityMode())
return m_RayLength.value;
else
return GetLightingQualitySettings().RTGIRayLength[(int)quality.value];
}
set { m_RayLength.value = value; }
}
[SerializeField, FormerlySerializedAs("rayLength")]
private MinFloatParameter m_RayLength = new MinFloatParameter(50.0f, 0.01f);
///
/// Controls the clamp of intensity.
///
public float clampValue
{
get
{
return m_ClampValue.value;
}
set { m_ClampValue.value = value; }
}
[SerializeField, FormerlySerializedAs("clampValue")]
[Tooltip("Controls the clamp of intensity.")]
private MinFloatParameter m_ClampValue = new MinFloatParameter(100.0f, 0.001f);
///
/// Controls which version of the effect should be used.
///
[Tooltip("Controls which version of the effect should be used.")]
public RayTracingModeParameter mode = new RayTracingModeParameter(RayTracingMode.Quality);
// Performance
///
/// Defines if the effect should be evaluated at full resolution.
///
public bool fullResolution
{
get
{
if (!UsesQualitySettings())
return m_FullResolution.value;
else
return GetLightingQualitySettings().RTGIFullResolution[(int)quality.value];
}
set { m_FullResolution.value = value; }
}
[SerializeField, FormerlySerializedAs("fullResolution")]
[Tooltip("Full Resolution")]
private BoolParameter m_FullResolution = new BoolParameter(false);
// Quality
///
/// Number of samples for evaluating the effect.
///
[Tooltip("Number of samples for GI.")]
public ClampedIntParameter sampleCount = new ClampedIntParameter(2, 1, 32);
///
/// Number of bounces for evaluating the effect.
///
[Tooltip("Number of bounces for GI.")]
public ClampedIntParameter bounceCount = new ClampedIntParameter(1, 1, 8);
// Filtering
///
/// Defines if the ray traced global illumination should be denoised.
///
public bool denoise
{
get
{
if (!UsesQualitySettings() || UsesQualityMode())
return m_Denoise.value;
else
return GetLightingQualitySettings().RTGIDenoise[(int)quality.value];
}
set { m_Denoise.value = value; }
}
[SerializeField, FormerlySerializedAs("denoise")]
[Tooltip("Denoise the ray-traced GI.")]
private BoolParameter m_Denoise = new BoolParameter(true);
///
/// Defines if the denoiser should be evaluated at half resolution.
///
public bool halfResolutionDenoiser
{
get
{
if (!UsesQualitySettings() || UsesQualityMode())
return m_HalfResolutionDenoiser.value;
else
return GetLightingQualitySettings().RTGIHalfResDenoise[(int)quality.value];
}
set { m_HalfResolutionDenoiser.value = value; }
}
[SerializeField, FormerlySerializedAs("halfResolutionDenoiser")]
[Tooltip("Use a half resolution denoiser.")]
private BoolParameter m_HalfResolutionDenoiser = new BoolParameter(false);
///
/// Controls the radius of the global illumination denoiser (First Pass).
///
public float denoiserRadius
{
get
{
if (!UsesQualitySettings() || UsesQualityMode())
return m_DenoiserRadius.value;
else
return GetLightingQualitySettings().RTGIDenoiserRadius[(int)quality.value];
}
set { m_DenoiserRadius.value = value; }
}
[SerializeField, FormerlySerializedAs("denoiserRadius")]
[Tooltip("Controls the radius of the GI denoiser (First Pass).")]
private ClampedFloatParameter m_DenoiserRadius = new ClampedFloatParameter(0.6f, 0.001f, 1.0f);
///
/// Defines if the second denoising pass should be enabled.
///
public bool secondDenoiserPass
{
get
{
if (!UsesQualitySettings() || UsesQualityMode())
return m_SecondDenoiserPass.value;
else
return GetLightingQualitySettings().RTGISecondDenoise[(int)quality.value];
}
set { m_SecondDenoiserPass.value = value; }
}
[SerializeField, FormerlySerializedAs("secondDenoiserPass")]
[Tooltip("Enable second denoising pass.")]
private BoolParameter m_SecondDenoiserPass = new BoolParameter(true);
///
/// Controls the number of steps used for the mixed tracing
///
public int maxMixedRaySteps
{
get
{
if (!UsesQualitySettings() || UsesQualityMode())
return m_MaxMixedRaySteps.value;
else
return GetLightingQualitySettings().RTGIRaySteps[(int)quality.value];
}
set { m_MaxMixedRaySteps.value = value; }
}
[SerializeField]
[Tooltip("Controls the number of steps HDRP uses for mixed tracing.")]
private MinIntParameter m_MaxMixedRaySteps = new MinIntParameter(48, 0);
///
/// When enabled, global illumination generated by moving objects will not be accumulated, generating less ghosting but introducing additional noise.
///
[AdditionalProperty]
[Tooltip("When enabled, global illumination generated by moving objects will not be accumulated, generating less ghosting but introducing additional noise.")]
public BoolParameter receiverMotionRejection = new BoolParameter(true);
#endregion
internal static bool RayTracingActive(GlobalIllumination volume)
{
return volume.tracing.value != RayCastingMode.RayMarching;
}
}
}