If you have worked on atmospheric 3D environments in Unity, you know that default lighting often feels flat without true volumetric fog or light shafts. Rendering dynamic volumetric lighting—especially in the Universal Render Pipeline (URP)—has historically been a major headache. Built-in solutions either consume huge amounts of GPU bandwidth or suffer from awful bilinear upsampling artifacts around geometry edges.
Volumetric Lights 2 solves this problem by providing a lightweight, customizable raymarching engine built specifically for modern Unity pipelines. Instead of relying on brute-force post-processing fog volumes that process empty screen space, this asset takes a hybrid geometric-raymarched approach. It bounds volumetric shafts within actual geometry meshes (cones, spheres, cubes, or custom light volumes) and executes targeted screen-space raymarching inside those bounds.
In my experience optimizing interior lighting for desktop and console projects, this geometric bounding approach saves massive amounts of GPU fill rate. You get rich mist, dynamic shadows, animated noise, and dust particles without torching your frame budget.
The asset goes far beyond basic light shafts, offering deep render pipeline controls and shader optimizations that allow high-end visual fidelity on modest hardware setups.
The core engine attaches custom mesh instances to lights (Point, Spot, Directional, and Area lights). The fragment shader calculates sample points only where camera rays intersect these volumes. By skipping empty pixel passes entirely, GPU fill-rate demands drop significantly compared to full-screen volume fog solutions.
Real-time occluders are evaluated during the raymarch loop. Volumetric Lights 2 reads shadow maps directly from Unity light sources, allowing objects to cast true volumetric shadows through fog and light cones. You can control shadow jittering, raymarch step counts, and sub-surface scattering values to eliminate banding visual artifacts.
To keep fog from looking like static plastic cones, the package incorporates 3D noise textures directly inside the raymarching pass. It also includes an integrated GPU particle pass for atmospheric dust specs that react naturally to light intensity and attenuation parameters.
While any 3D environment benefits from light shafts, Volumetric Lights 2 fits particularly well into specific production pipelines:
Getting your first volumetric light running takes under two minutes once the package is imported into your project.
If you are running URP, open your Universal Render Pipeline Asset scriptable object. Add the Volumetric Lights Render Feature to your Forward Renderer Data asset. This allows the rendering engine to inject volumetric passes into the opaque/transparent render queues correctly.
Select any Unity Light component (Spotlight or Point Light work best for testing) and click Add Component -> Volumetric Light. The asset will automatically generate the corresponding proxy mesh bounds and assign the required volumetric material.
You can adjust volumetric parameters dynamically at runtime to create flashing alarm lights, flickering torches, or fluctuating atmospheric density. Here is a practical C# script showing how to drive volumetric intensity and noise programmatically:
using UnityEngine;
using VolumetricLights;
[RequireComponent(typeof(Light))]
public class DynamicLightPulse : MonoBehaviour
{
private VolumetricLight volLight;
private Light baseLight;
[Header("Pulse Settings")]
public float pulseSpeed = 3.0f;
public float minDensity = 0.02f;
public float maxDensity = 0.15f;
[Header("Color Shifts")]
public Color startColor = Color.cyan;
public Color endColor = Color.magenta;
void Awake()
{
baseLight = GetComponent<Light>();
volLight = GetComponent<VolumetricLight>();
if (volLight == null)
{
volLight = gameObject.AddComponent<VolumetricLight>();
}
}
void Update()
{
// Calculate smooth wave factor
float wave = Mathf.PingPong(Time.time * pulseSpeed, 1.0f);
// Interpolate volumetric density and light color
volLight.density = Mathf.Lerp(minDensity, maxDensity, wave);
Color currentLightColor = Color.Lerp(startColor, endColor, wave);
baseLight.color = currentLightColor;
volLight.mediumAlbedo = currentLightColor;
}
}
Here is my honest takeaway based on actual project deployments and stress testing across target platforms.
| Category | VFX / Shaders |
|---|---|
| Latest Version | v20.2.1 (2 tracked releases) |
| File Size | 51.31 MB |
| Added to Platform | May 28, 2026 |
| Views | 9 views |
| Downloads | 2 downloads |
| Favourites | 1 favourites |
| Official Store | Buy Original License on Unity Asset Store → |
| Issue with Package? | Report Broken Link → |