A Simple Explanation of Real-Time Dynamic Lighting for Gaussian Splatting
Daniel Skaale
Gaussian Splatting represents 3D scenes as millions of colored "splats" (like oriented paint blobs). Each splat has:
The colors are "baked in" from the original camera capture—they can't respond to new lights you add to the scene.
Traditional 3D lighting needs surface normals (arrows pointing perpendicular to surfaces) to calculate how light hits objects. For example:
But Gaussian Splats are billboards—flat quads that always rotate to face the camera. They don't have real surface geometry or normals.
Instead of computing real surface normals (which don't exist), I use a clever approximation:
View Direction = Surface Normal
Effective Normal = normalize(CameraPosition - SplatPosition)
The key insight: Since splats always face the camera AND represent surfaces that were visible during capture, the direction from the splat to the camera is a reasonable guess for the surface orientation.
1. Compute fake normal: Use view direction as if it were a surface normal
2. Calculate lighting: Use standard lighting math (Lambert shading)
Brightness = max(0, normal · lightDirection)
3. Apply attenuation: Lights fade with distance using squared falloff
Attenuation = 1 - (distance/range)²
What you get:
What you don't get:
In One Sentence
"I fake lighting on Gaussian Splats by pretending the view direction is the surface normal, which gives plausible real-time dynamic lighting without needing actual geometry."