Example Lighting Workflow for Unreal Engine 5 with Detailed Parameter Explanations

One of the most technical aspects of lighting is making it look good without sacrificing performance. In today’s tutorial, we’ll be diving into that. Let’s dive right in: what tools do we have in our arsenal to achieve good lighting?

  • HDRI (Essential for realistic "sky textures" and useful if you want to use an HDRI ambient light cubemap.)
  • Directional Light (Used for shadows, since HDRIs do not cast any shadows.)
  • Height Fog (Enhances depth and visual fidelity; we don't need to rely on volumetric fog.)
  • SkyAtmosphere (Essential. It creates a physically based atmosphere around the level and performs the necessary calculations, such as how light interacts with the planet’s atmosphere, sun/moon lighting, and horizon gradients.)

Before we dive into it, there are a few definitely-100%-must-know things that I want to mention. If you have no prior knowledge of how “lighting” works in real life and how UE5 handles shadows, I definitely suggest reading these as well.

Must Know 01: A quick, nifty tool to access almost all types needed to start creating exterior lighting in your level (Environment Light Mixer)

Lazy Loaded Image

This built-in little tool gives you access to almost everything (Directional Light, HDRI Backdrop, Sky Atmosphere, Volumetric Cloud, Exponential Height Fog) to start lighting your scene.

Lazy Loaded Image

I'll be using everything here in default, except I have made some minor changes to my exposure settings in my post-processing.

Must Know 02: Light Type Shadow Resolution

Every single light source you place in your level has its own individual shadow resolution scale. This is the shadow "resolution" that determines how detailed the shadows will be when cast by this specific light source. Some other things worth mentioning:

  • If you are going to use baked lighting, lightmap resolution settings are adjusted individually in every mesh's details panel.
  • Performance-wise, replacing static lighting with stationary lights (For example, we can adjust how many of them cast shadows, whether they cast dynamic shadows, and stuff like that.) can achieve the same performance. There’s no reason to rely on baked lighting; you can ship your game without using pre-computed lighting unless you really need to squeeze every bit of FPS you can get.

So this parameter on UE5 lights (Directional, Spot, Point, Rect) basically controls how detailed the shadows cast by that light should be. By default, it comes at 1; increasing it to 2 already makes you see a significant difference. 3 and beyond could be useful in some specific cases, but most of the time the difference between 2 and 3 is negligible, considering we also need to keep the game as optimized as possible, and this is a heavy-on-hardware option. In most cases, 2 will give you a very nicely detailed shadow. You can tell how much the quality improves if you have a tree around with moving branches and leaves:

Lazy Loaded Image

Shadow Resolution Scale: 0 vs 1 vs 2

Lazy Loaded Image

Shadow Resolution Scale: 3 vs 5

In some cases, you will get almost no improvement, so remember: this is a heavy feature; use it wisely.

Lazy Loaded Image

Shadow Resolution Scale: 0 vs 3

Must Know 03: Contact Shadow Length

This option simply decides how far a light casts small, detailed shadows right at the surfaces where geometry meets other geometry. “Tight shadows” that appear in crevices, corners, and where objects touch the ground in othert words. Only affects shadows very close to surfaces.

  • Very low (0 – 10 cm): Tiny shadows, subtle crevices only.
  • Medium (20 – 50 cm): Normal contact shadows, crevices and object bases visible.
  • High (100+ cm): Contact shadows extend farther, can look unrealistic if too large.
  • Directional Light (Sunlight): 50–100 cm is common outdoors for subtle ground contact shadows.
  • Point/Spot lights (Indoor): 10–50 cm for tight shadows under furniture or objects.
Lazy Loaded Image

Contact Shadow Length: 0 vs 500

Lazy Loaded Image

Contact Shadow Length: 0 vs 1

Lazy Loaded Image

Contact Shadow Length: 1 vs 0.2

Must Know 04: What the hell does the sky atmosphere do, and why do we need it?

Any cinematic or high-quality atmosphere needs light scattering. Sky Atmosphere does exactly that: it simulates light scattering in the atmosphere. The simulation works by modeling Rayleigh and Mie scattering. Rayleigh scattering primarily determines how blue the sky appears, while Mie scattering contributes to hazy skies and bright halos around the sun.

Lazy Loaded Image

Bright halos around the sun

Lazy Loaded Image

Hazy skies

In addition to these, Sky Atmosphere can react to time-of-day changes; if your game requires such a system. When paired with a 'Directional Light' marked as 'Atmosphere Sun Light,'' it renders the sun disk based on atmospheric scattering and affects overall atmospheric brightness and color as well. But most importantly, it also provides a physically accurate distance fog (Aerial Perspective / Atmospheric Fog) that blends realistically with sky colors and changes with altitude; for example, when standing on a mountain.

One feature that we are interested in Sky Atmosphere for us is the Height Fog Contribution. Height Fog Contribution in UE5’s SkyAtmosphere controls how much the SkyAtmosphere influences the appearance of Exponential Height Fog (ExponentialHeightFog actor) that we are going to place in our level. This option, in other words, decides how much blending happens between the SkyAtmosphere and the ExponentialHeightFog actor. Higher values (1.0 → 2.0+) mean that the height fog inherits more sky/atmospheric color. Lower values (0.0 → 0.5) are used to achieve a specific and/or cinematic look.

Lazy Loaded Image

Height Fog Contribution: 5 vs 0

Lazy Loaded Image

Height Fog Contribution: 6 vs 0

Lazy Loaded Image

Height Fog Contribution: 0.5 vs 2.0

Lazy Loaded Image

Height Fog Contribution: 0

Question: Do you need a skylight if your level already has an HDRI and a directional light?

Answer: No, you don’t need a Skylight if you already have an HDRI Backdrop and a Directional Light.

Must Know 05: Shadow Bias & Shadow Bias Slope

In simple terms, what this option does is make the shadows sharper. It is also used in cases to prevent shadow acne, which is a flickering or dark speckled artifact caused by a surface shadowing itself.

Lazy Loaded Image

Shadow Bias: 1.0 vs 0

Lazy Loaded Image

Shadow Bias: 0 vs 1.0 vs 0.04

  • Very low (0–0.1): Shadows may show shadow acne (tiny artifacts). You can see in the image above, the values 0 and 0.04 create these lines, which are the shadow artifacts because the value for this scene is very low.
  • Medium (0.2–0.5): Balanced, shadows appear normally without acne.
  • High (0.6+): Shadows float off the surface (“peter-panning”), look detached.
  • Use small values for precise shadows, especially on thin or small objects.
  • Increase slightly if you see acne, but don’t overdo it or shadows will appear detached.
Lazy Loaded Image

Shadow Bias: 1

Lazy Loaded Image

Shadow Bias: 0

Lazy Loaded Image

Shadow Bias: 0 vs 0.1 vs 0.3 vs 0.7 (See how the shadows look ‘patchy’ on the bollards when the value is too low.)

Now let's talk about Shadow Slope Bias. By editing our Shadow Slope Bias value, we made our shadows sharper. But we wanna soften the edges and stuff a bit. And that's when we use Shadow Slope Bias. It can also be used to reduce shadow artifacts on surfaces angled toward the light!

  • 0–0.5: Standard slope handling, sharper shadows on steep surfaces
  • 1–2: Reduces acne on angled surfaces, slightly softens shadows near slopes
  • >2: Can make shadows on angled surfaces float away, similar to high Shadow Bias
Lazy Loaded Image

Shadow Slope Bias: 0 vs 1

Lazy Loaded Image

Shadow Slope Bias: 0.5

What makes lighting good?

  • Avoiding a flat environment and managing shadow direction
  • Understanding engine and light type limitations
  • Maintaining harmony among different components
  • Shadow map quality and factors that affect shadow quality

HDRi Backdrop


Here, I will start adding an HDRI backdrop to my scene and begin adjusting the lighting. I’ll go through each important step here. This is not a follow-along tutorial, so take what you learn here and apply it to your own scene. First, bring your texture into the engine and assign it to the HDRI backdrop. When we drop something into the level, Unreal places it in the world and adjusts the location of the object based on where you dropped it. So the first thing to do is reset its location to its default values, which should be 0, 0, 0:

Lazy Loaded Image

Reset the location to (0, 0, 0).

When it comes to intensity, the HDRi plugin offers us two options. These determine how bright we want our HDRi texture (i.e., the sky texture itself) to be without affecting the landscape, as well as the intensity value that controls the ambient cubemap over the landscape.

Lazy Loaded Image

Adjusting the intensity here in this component (HDRIBackdrop) will increase the brightness of the sky texture/dome, but not the lighting intensity (ambient cubemap) of the world.

Lazy Loaded Image

To enable the ambient cubemap of the HDRI plugin, you gotta switch to the geometry section, set your source type from "SLS Captured Scene" to "Cubemap," and select the same HDRI texture you’re using for your sky texture/dome.

Lazy Loaded Image

Now we can decide here how much it (the ambient cubemap) should brighten our world, without affecting the brightness of the sky texture/dome.

Let me underline this part again: notice how the HDRI doesn’t cast any shadows but only provides some ambient light.:

Lazy Loaded Image

HDRi Ambient Cubemap Intensity: 10000

Lazy Loaded Image

HDRi Ambient Cubemap Intensity: 0

And this is exactly why we need other types of light sources, such as directional lights, rectangle lights, etc., to create shadows.

    These are the settings you never need to touch in the HDRi component panel:

  • Lighting Distance Factor: Controls how far away the HDRI is considered to be when generating light and shadows. In other words, it scales the apparent distance of the HDRI environment. A value of 1.0 represents the standard distance, giving a normal cinematography look. At 0.2, the HDRI feels very close to the scene, making shadows sharper and the light more directional, contrasty, and reactive. At 5.0, the environment feels extremely distant, softening shadows and creating more uniform, even, and global lighting.
  • Use camera projection: Set to false (By default, it is set to false.). When enabled, it projects the HDRI texture from the camera’s point of view instead of mapping it to a sky dome. On → the HDRI behaves like a backdrop pasted behind the camera (a 2.5D trick), which is not ideal for gameplay or free-moving cameras because the background won’t look correct as the player moves. Off → the HDRI behaves like a world sky dome, creating a real 3D environment. It can be useful for fake backgrounds, if you don’t want the sky to “move” as the camera moves, camera projection keeps it fixed.
  • Lower Hemisphere is Solid Color: Don’t touch it. Setting it to true causes more light bouncing and can be heavy on movable lights. SkyLight normally captures lighting from all directions (360°). But below the horizon (lower hemisphere), you often want: a) scene objects not affecting skylight from below, b) a color fill instead (usually black or dark blue). When enabled: Light coming from below the horizon is replaced with a constant color. It can be useful in some cases, for example you have some unwanted “upward bounce lighting”. This would help with that, but 99% of the time, you don't need to experiment with these settings.

Lazy Loaded Image

Lower Hemisphere is Solid Color: False (Default)

Lazy Loaded Image

Lower Hemisphere is Solid Color: True

HDRI Skylight Cubemap Resolution

Defines the resolution of the HDRi cubemap used for lighting/how bright the HDRi makes the landscape. Higher values mean sharper lighting detail and more accurate reflections, but heavier on performance. Common values are usually 256 or 512 for games, can be increased to 1024+ for cinematic quality.

Lazy Loaded Image

Cubemap Resolution: 8

Lazy Loaded Image

Cubemap Resolution: 2048 vs 512

Lazy Loaded Image

Cubemap Resolution: 256 vs 512

HDRI Ambient Cubemap: Source Cubemap Angle

It controls the rotation value of the cubemap texture used in "HDRIBackdrop > Skylight". The value here rotates the ambient light without rotating the actual sky texture/HDRIBackdrop dome. Extremely useful if you want to rotate the light direction (ambient light) but keep the backdrop image (sky texture/dome) fixed.

Lazy Loaded Image

Source Cubemap Angle: 0

Lazy Loaded Image

Source Cubemap Angle: 115

Making sure the HDRI does not collide with your mesh

Another issue you might have and not realize what’s causing it is the HDRi colliding with an asset in your level, for example:

Lazy Loaded Image

As you can see here, my HDRi backdrop collides with my 'cave' assets and creates this white silhouette around them.

To get rid of this 'artifact,' we can move it up in the location (Z) so it doesn't collide with our mesh anymore:

Lazy Loaded Image

Setting the location of my HDRi in the Z direction.

If you have ever worked with HDRIs in UE5, you might already know that they can be rotated only around the Z axis:

Lazy Loaded Image

Rotating the HDRi along the Z-axis: 01

Lazy Loaded Image

Rotating the HDRi along the Z-axis: 02

Now the question is, what if we need to rotate our texture in the Y direction? Then the projection center comes in help. The projection center can be considered as the Y rotation in such occasions:

Lazy Loaded Image

I want the 'moon kinda looking' part of my texture/dome to appear at the top part of my cave, so I start rotating it in the Z direction around the projection center.

Lazy Loaded Image

Sometimes you might need to enter very high values here to make the HDRi rotate.

Earlier, I was only able to rotate my HDRi plugin around the Z axis in the HDRi (rotation) itself; now I am changing the projection center (Z axis) so it can move up exactly here:

Lazy Loaded Image

Now pay attention, how the moon will be located right at the top of where my cave ends.

Lazy Loaded Image

We can go back to the HDRi's own rotation value to place the moon in the center.

Lazy Loaded Image

I am increasing the brightness of my sky texture/dome (so no ambient cubemap adjustment) so we can see the sky a bit better. (Part: 01)

Lazy Loaded Image

I am increasing the brightness of my sky texture/dome (so no ambient cubemap adjustment) so we can see the sky a bit better. (Part: 02)

Directional Light Tricks

Did you know that "Directional Light" has its own built-in light shaft system, so you don’t need to rely on volumetric fog for beautiful shafts? Volumetric fog is stunning, but it’s very heavy on performance; 10 to 20 FPS or even more, depending on your level. Here’s how to activate it, and remember: this feature is only available for the Directional Light type:

Lazy Loaded Image

Light Shaft Occlusion: Set it to true to get beautiful light shafts! Then activate Light Shaft Bloom to make 'em even brighter!

Lazy Loaded Image

Don't forget to set "Light Shaft Bloom" to true!

Lazy Loaded Image

Bloom Scale: 5 vs 2

Working With The Light Shafts

Next, we can work on positioning our lift shafts/godrays. To do this, we can manipulate the data found in the "Light Shaft Override" section. What this option does is decouple the visual "God Rays" (Light Shafts) from the actual rotation of your Directional Light, allowing us to override the default value and change the position of our light shafts:

Lazy Loaded Image

Light Shaft Override Direction: 0 (Default)

Lazy Loaded Image

Light Shaft Override Direction: (Modified)

Occlusion Depth Range (Directional Light)

The value here represents a distance in Unreal Units (cm) and means, anything closer to the camera than this distance will not occlude (block) the light shafts. Anything further than this distance will cast a shadow into the light shafts. Some of the usage cases that I can think of off the top of my head are usually like this:

  • Removing Viewport Clutter: If you are walking through a forest, you might want the massive trees in the distance to cast beautiful light shafts, but you don't want a tiny leaf or a piece of grass passing 5cm from the camera lens to suddenly "black out" the entire screen effect.
  • Character Issues: If you have a first-person weapon or a character's arm close to the camera, it can often create distracting, blocky shadows in the screen-space light shafts. By increasing the Occlusion Depth Range, we can make the light "ignore" the character and only focus on the environment.
  • Optimization/Stability: It helps keep the light shaft effect stable. Since these are screen-space effects, objects very close to the lens occupy a huge portion of the screen, which can make the God Rays jump or disappear erratically.
Lazy Loaded Image

Occlusion Depth Range: 0

Lazy Loaded Image

Occlusion Depth Range: 1600+

Source Angle (Directional Light Only)

Directly affects the softness of shadows and the sun halo appearance. This can be considered the "Source Radius" for other light types. When it comes to directional light, you can think of it as just a name change, because for a Directional Light, the radius is measured in degrees since the sun is effectively at “infinity.”

  • Smaller angle (~0.1°): shadows are very sharp, like crisp sunlight on a clear day. sun is a sharp disk with a smaller or almost invisible halo.
  • Larger angle (0.5° – 1° or more): shadows become softer, edges blur, more realistic for slightly hazy or cinematic skies. Mimics how a real sun isn’t a single point of light but has a finite size (~0.53° in the real world). sun appears bigger in the sky, softening the halo glow.

Some other example values:

  • 0.1°: Very sharp shadows, crisp sun disk, great for clear skies.
  • 0.3°: Slightly soft shadows, creates a more natural look.
  • 0.5° – 0.6°: Soft shadows, subtle atmospheric halo, cinematic look.
  • 1°+°: Very soft shadows, sun may look huge, can be good for stylized or hazy atmospheres

Lazy Loaded Image

Source Angle: 5

Lazy Loaded Image

Source Angle: 50

Directional Scattering Start Distance (ExponentialHeightFog)

By default, this value is 0, meaning the atmosphere starts scattering light immediately from the camera's position. By increasing this value, we can create a "clear zone" around the camera, where no atmospheric scattering (haze/fogging of the sky) occurs. It can be used to prevent foggy interiors: For example; if our character is inside a building or a cave, the Sky Atmosphere can sometimes make the air inside look hazy or blueish because it’s calculating scattering everywhere. By setting a Start Distance, we can push that "haze" outside the building. It can also help maintain foreground clarity; in wide landscape shots, we might want a thick, moody atmosphere in the distance but want our immediate foreground (like a character or nearby rocks) to remain crisp and high-contrast.

Lazy Loaded Image

Directional Scattering Start Distance: 10000 (Notice how the fog becomes less thick when we increase this value.)

Directional Inscattering Exponent (ExponentialHeightFog)

Decides how sharply the light scatters through the atmosphere, especially through fog, skyAtmosphere, and volumetrics.

  • Low values (0 → 10): Scattering will be soft and wide. The sun glow will be broad and diffused. Volumetric light shafts will be softer, atmosphere will look more “foggy” or “humid”.
  • Medium values (20 → 50): More realistic, for most Earth-like skies, sun glow becomes more defined, light shafts get a bit sharper.
  • High values (80 → 100+): Scattering becomes very forward-focused, sharper and more pronounced. Sun halo will be tighter and brighter, may look dramatic and stylized
Lazy Loaded Image

Directional Inscattering Exponent: 100 vs 50 vs 5

Lazy Loaded Image

Directional Inscattering Exponent: 4 vs 8

One other option you might see in the Exponential Height Fog component is “Cloud AO (Atmosphere and Cloud)”. What this option does is toggle whether the volumetric clouds (if you have one in your scene) shadow the fog itself. If you don’t have a volumetric cloud in your scene, enabling it will not do anything. This is an option that I rarely use, so I won’t touch it, since I have no clouds in my level anyway, but feel free to experiment with it. Just remember, dynamic shadows are expensive.

Ray-Scattering Scale (SkyAtmosphere)

We already talked how rayleigh scattering primarily determines how blue the sky appears in the "Must Know 04: What the hell does the sky atmosphere do, and why do we need it?" chapter, but it also controls the reddish/orange tint at sunrise and sunset. Higher values mean more scattering. Lower values mean less scattering. 0 means no Rayleigh scattering, in other words, rayleight scattering doesn't contribute to the sky color when it's off.

Lazy Loaded Image

Rayleigh Scattering Scale: 5

Lazy Loaded Image

Rayleigh Scattering Scale: 25

Lazy Loaded Image

Rayleigh Scattering Scale: 0

Mi Scatttering Scale and Color (SkyAtmosphere)

Mie Scattering is where things get a bit interesting. Mie Scattering tells SkyAtmosphere how light interacts with “larger particles such as dust, water droplets, smoke, etc.” and by doing so, it gives the atmosphere a soft, hazy look, especially near the horizon. In other words it helps light “travel” through the shafts, making them more visible.

  • More Mie: Thicker haze, larger, brighter glow.
  • Less Mie: Cleaner, crisper atmosphere, sharper, cleaner sun and it may produce the Bright Sun Halo ("circumsolar region")
Lazy Loaded Image

Mie Scattering Scale: 0.003 vs 1

Lazy Loaded Image

Different Mie colors also affect the appearance of light shafts.

Mie Anisotropy (SkyAtmosphere)

This option basically decides how much light is pushed toward the viewer versus scattered evenly.

  • Value 0: Light scatters evenly in all directions.
  • Value 0.5: Moderately forward-scattering, haze becomes more noticeable, halo around the sun becomes more prominent, particles scatter more light toward the sun’s direction
  • Value 0.8: Strong forward scattering (realistic for Earth). Big, bright sun glow, strong light bleeding in the sun’s direction, horizon looks hazier, very cinematic for sunsets
  • Value 0.9+: Extremely forward scattering, huge intense halo, overexposed-looking sun region, can be used to create alien worlds, very humid atmospheres, fog heavy scenes or for a more stylized look
Lazy Loaded Image

Mie Anisotropy: 0.5 vs 0.8

Lazy Loaded Image

Mie Anisotropy: 0 vs 0.999

Aerial Distance Plane Scale (SkyAtmosphere)

The effect, that makes far-away objects look bluish, hazy, or washed out due to the atmosphere between the camera and the object. In other words, how far the camera “sees” before haze becomes strong. Can be extremely useful for creating fog-heavy scenes.

  • Lower values (0.1 – 1.0): Haze appears much sooner, even on nearby objects, which can make the world appear foggier, more atmospheric.
  • Higher values (2.0 – 10.0+): Haze apppears much farther away, distant objects will look sharper, can be useful in creation of dry environments like deserts or mountains
  • Extremely high (20.0+): Almost no atmospheric fog from distance. Can produce a “clean sky, clean air” look.
Lazy Loaded Image

Aerial Distance Plane Scale: 0 vs 5

Lazy Loaded Image

Aerial Distance Plane Scale: 5 vs 0.2

Source Radius & Soft Source Radius

  • Source radius: The "physical" size of the light source. Especially important for baked/stationary lighting. Directly affects the softness of shadows: larger sources produce softer, blurrier shadows, while smaller sources produce sharper shadows, just like in real life. 0 is the default value, meaning sharp and crisp shadows. 0–10 results in slightly soft edges, 10–50 or more produces very soft shadows. One very important thing to pay attention to is that Unreal Engine doesn’t like colliding light sources, since it needs some extra light-bouncing calculations. In fact, there is a limitation on how many stationary light sources, for example, can overlap with each other. Try to keep the attenuation radius and source radius of a light source from colliding with another one as much as possible.
  • Soft Source Radius: Applies an extra softness multiplier to shadows beyond the base Source Radius. 0 means shadow softness matches the Source Radius exactly. Going beyond 0 means the edges of shadows soften more, looking more natural or cinematic. Very high values can make shadows appear extremely diffused or almost invisible at the edges, so be aware of that.
Lazy Loaded Image

Source Radius: 0 vs 5000 vs 100

Lazy Loaded Image

Source Radius: 0 vs 1000

Lazy Loaded Image

Soft Source Radius: 0 vs 1024

Lazy Loaded Image

Soft Source Radius: 0 vs 1024

Final Words

It took quite a while to write this tutorial, prepare all the screenshots, and find examples, but I think it was worth it. If you enjoy this type of detailed, written tutorials, please consider supporting this website through my Patreon. You can also send your questions to me directly there if you find anything confusing or would like more explanations regarding this topic or other topics. Until then, keep modeling and creating!