Global Illumination refers to the indirect / diffuse lighting caused by the bounces of the light on any surface. In Unity, all lights (directional, spot, point lights) are called “direct lighting” and they can illuminate surfaces that’re directly reachable. Indirect lighting refers to the lighting that’s reflected by those objects and that can also add some lighting to the scene.
Radiant GI computes and adds that indirect/diffuse lighting in real-time producing more natural/realistic lighting in your scenes. It’s important to understand how to setup and configure the settings properly, as indirect/diffuse lighting can be subtle but convenient, to give more realism to your scene.
Radiant GI is a post-processing effect created for the built-in and Universal Rendering Pipeline. It can use the forward or deferred rendering path; however, it’s strongly encouraged to use deferred rendering as it produces more realistic results. Important: make sure you set the same rendering path as in the URP asset!
The effect is designed as a render feature (check the previous setup section) and then, the settings are specified in a post-processing volume inside your scene. This means that you can use the effect as a global volume (affects the entire scene) or only in certain areas (adding the effect to specific post processing volumes):
The settings that can be configured in Radiant GI are:
- Indirect Intensity: the global intensity of the effect. Please note that indirect lighting should be subtle and a complement to regular lighting as well as baked lighting. This means that you should not use a intensity greater than 2 for example. Good values are 0.3, 0.5 or 1 (this will depend on your scene).
- Distance Attenuation: light intensity reduces by the square of the distance. To give more artistic control, we added this setting, so you can specify the attenuation behaviour. A value of 0 means there’s no attenuation. A value of 1 means the indirect intensity will be reduced by the square of the distance to the source light.
- One Ray Bounce: when enabled, Radiant will also use the indirect lighting computed in the previous frame, simulating an additional bounce of the light into the scene. This option is not expensive.
- Max Source Brightness: let you clamp or limit the brightness from the reflecting surfaces. Very bright spots like emissive pixels can add lot of noise. You can reduce the overall noise by setting a very low value to Max Source Brightness, like 0.2, and increasing the Indirect Intensity value. That will create a more uniform indirect contribution for the whole picture.
- Normal Map Influence: enhances lighting on surfaces with normal maps. Reduce this value to produce a foggier effect.
- Luma Influence (only applies in forward rendering path): since albedo data is not available in forward, this setting can add variety and improve results in this mode. Adjust this value to your liking. Set this value to 0 to disable luma influence.
- Near Field Obscurance: darkens surfaces based on occlusion. Produces an effect similar to SSAO with a wide radius adding subtle shadows that are consistent with the indirect illumination. It’s very fast as it’s integrated in the GI pass.
- Organic Light (URP only): this option injects procedural lighting into g-buffers which can also be source for indirect light, producing more natural and interesting environment lighting.
- Ray Count: by default, a single ray is computed per pixel in the screen. However, you choose to use up to 4 rays per pixel. Each additional ray will add considerable overhead to the processing. Usually, a single ray is enough to create a compelling effect. Only use 2 or more rays on higher-end GPU cards.
- Max Distance: the maximum distance where the indirect light can reach. For accuracy, try to reduce this value as much as possible (for example, make sure it just covers the room where the volume is).
- Max Samples: let you specify the maximum number of samples along the ray-march loop. This is a max number and intended to avoid very expensive loops. Values of 24 or 32 usually gives best results.
- Jittering: adds a bit of randomization to the ray-march step size to reduce banding. Useful when using low sample count.
- Thickness: the thickness or depth tolerance is used to determine when the ray hits a surface. This value represents the minimum distance of the ray-march position to a nearby surface to consider a hit. Values of 0.3 to 1 are usually the best.
- Binary Search: when enabled, the algorithm will perform a refinement of the hit position, producing more accurate results. This option will add a bit of overhead to the ray-march loop.
- Smoothing: specify the amount and intensity of blur to reduce noise. The higher this value, the more blur passes are used. A value of 4 will execute the denoiser twice, producing the smoothest illumination.
- Temporal Reprojection: uses velocity buffers and reprojection to accumulate hits over frames and produce a more pleasant/smooth result. It’s recommended that this option is enabled.
- Response Speed: how fast the spatio-temporal filter reacts to changes in the screen. A lower value will produce softer results but can introduce ghosting.
- Chroma Threshold: determines the maximum color difference of the current image with regards to the history buffers. If the threshold is exceeded, the history buffer is clamped to reduce noise.
- Camera Translation Response Speed: when camera moves (changes position only) and to reduce smearing, this setting will reduce the effectivity of the spatio-temporal denoiser.
- Fallback Modes: what to do when a ray misses a target. By default, no fallback is enabled which means that ray won’t add any GI data. To produce a smoother and accurate result, you can enable one or more fallbacks:
- “Reuse Rays”: the asset will check if the ray from previous frame succeeded and reuse it. A value of 0 disables this feature, while a greater value will increase the intensity of old ray hits. Please note that this option can introduce ghosting/smearing in moving objects so try to keep it low. This option is very performant.
- Depth Rejection: when reusing rays, this value represents the maximum allowed depth difference between the history and current buffer. Default value is 1 meter. This check usually produces less disocclusion artifacts.
- “Reflection Probes”: the asset will use the info from nearby reflection probes that have the “Radiant Probe” script attached. Add this script to any probe that you want to be considered by Radiant GI.
- “Reflective Shadow Map” is a technique that renders the scene from the directional light point of view. It’s quite expensive if the directional light rotates. Check dedicated section for details.
Both Reflection Probes and Reflective Shadow Map provides useful fallbacks for light emitters that are not visible in front of the camera. If a reflection probe is used, the reflective shadow map option will be ignored as well as the reuse rays option. However, if the reflective shadow map doesn’t provide light data due to shadows, the Reuse Rays can still be used.
- Raytracer Accuracy: by reducing the raytracer accuracy, performance can be improved. Technically this option is effectively downscaling the input depth buffer to improve GPU cache efficiency.
- Downsampling: let you downscale the input image affecting all render passes, so the entire effect execution is faster (in exchange of quality of course).
Artistic Controls section
- Brightness Threshold: determines the minimum brightness value of a pixel to be considered as indirect source for lighting. Every pixel should cast indirect light (even if it’s very dim) although you may want to limit this effect to certain bright pixels only using this setting.
- Maximum Brightness: clamps the maximum brightness of the resulting GI contribution. This setting let you avoid burning pixels with too much lighting.
- Specular Contribution: determines amount of GI added to metallic/shiny surfaces, reducing overexposition.
- Saturation: adjusts the color saturation of the computed GI. A value of 0 makes the GI grayscale.
- Limit to Volume Bounds: only applies GI within the boundaries of the current volume. Useful to restrict the GI to interior rooms for example, when there’re windows and you don’t want the GI to be computed outside.
- Stencil Check: enabling this option will activate the stencil mask which avoids GI from being applied to specific pixels on the screen. This can be used to avoid GI over certain objects like UI, FPS weapons or any other object that renders also using stencil.
- AO Influence: only available in URP. When native Screen Space Ambient Occlusion (or HBAO in LitAO mode) is used, this setting controls the amount of ambient occlusion applied to the global illumination computed by Radiant.
- Show In Edit More: renders the effect while not in play mode. Currently, Temporal Reprojection is only available in play mode so the result can be quite noisy.
- Debug View: useful to inspect the different buffers used by the effect.
- Compare Mode: let you compare the impact of the effect and the current settings by showing a side-by-side or split screen view of your scene.