Area Lights

Area lights are light sources with a real physical size, which makes their lighting softer and more natural than point lights. I implemented them by sampling random points on the surface of the light and calculating how much they contribute to a point being shaded. The main challenge was keeping the brightness consistent, since the light’s angle and distance affect how strong it appears.

Without Area Lights
With Area Lights

Normal Mapping

Normal mapping adds small visual details using a texture so surfaces appear shaped without adding extra geometry. I extended the shading code to read normals from a texture and transform them into the correct world-space direction. The hardest part was getting the transformed directions consistent—one small mistake could flip the lighting or make the grooves look wrong.

Without Normal Mapping
With Normal Mapping

Rough Dielectric

A rough dielectric is a material that both reflects and lets light pass through—like real glass—but can appear blurry depending on roughness. I combined the ideas from the existing glass and metal materials in the codebase and followed a reference paper to handle both reflection and refraction in a single model. The hardest part was getting the refracted light to behave correctly, since even a small error made the entire material turn black.

Roughness 0.0
Roughness 0.3
Roughness 0.5

Bloom Post Processing

Bloom adds a soft glow around bright areas, making lights feel more natural and less harsh. I implemented it by identifying the brightest pixels, blurring them, and blending the result back into the image. The challenge was balancing the glow—too strong and the entire image becomes washed out, too weak and the effect disappears.

Without Bloom
With Bloom