I E

Sunstone dev log 21: radiometry musings

I’ve been trying to wrap my head around radiometry/photometry so that my physically-based renderer can use the correct units. My notes were getting too long, so here’s the first part.


Irradiance (Wm−2Wm^{-2}) and intensity (Wsr−1Wsr^{-1}) make sense to me.

Irradiance is power over an area:

Intensity is power over a solid angle:

Irradiance is the correct unit for a directional light. The rays it emits are parallel, so there’s no “spreading out”, which is what solid angle accounts for.

Conversely, intensity is the correct unit for a point light, because a point has no area. The point just emits rays at a solid angle around a particular direction.

But I get confused when I try to combine them into radiance (Wm−2sr−1Wm^{-2}sr^{-1}). I have a hard time coming up with a visualisation that’s as clear as the two above.

Something like this?

This diagram is a cross-section, where the unit circle is actually a unit sphere. The line with width AA is actually a circle with diameter AA, which represents a light source. ω\omega is the solid angle subtended by the circular light. So in addition to the area over which we measure power, we can also consider the solid angle that determines how the power spreads with distance from the area. Like how a torch can have a tight or a wide beam?

Some more things that do make sense:

A function from points to irradiance (Wm−2Wm^{-2}) E(p‾)E(\bar{p}) can be integrated over the set of points in an area to compute power:

Φ=∫AE(p‾)dp‾ \Phi = \int_{A} E(\bar{p}) \; d\bar{p}

And a function from directions to intensity (Wsr−1Wsr^{-1}) I(ω‾)I(\bar{\omega}) can be integrated over over the set of directions comprising a solid angle to compute power:

Φ=∫ΩI(ω‾)dω‾ \Phi = \int_{\Omega} I(\bar{\omega}) \; d\bar{\omega}

Therefore, a function from both points and directions to radiance (Wm−2sr−1Wm^{-2}sr^{-1}) can be integrated over an area or a solid angle to give intensity or irradiance respectively:

I(ω‾)=∫AL(p‾,ω‾)dp‾ I(\bar{\omega}) = \int_{A} L(\bar{p}, \bar{\omega}) \; d\bar{p}

E(p‾)=∫ΩL(p‾,ω‾)dω‾ E(\bar{p}) = \int_{\Omega} L(\bar{p}, \bar{\omega}) \; d\bar{\omega}

However, radiance L(p‾,ω‾)L(\bar{p}, \bar{\omega}) is given for an infinitesimal surface perpendicular to ω‾\bar{\omega}, so for these integrals be true to the surface at a particular point they need to account for the point’s normal:

I(ω‾)=∫AL(p‾,ω‾)n‾⋅ω‾dp‾ I(\bar{\omega}) = \int_{A} L(\bar{p}, \bar{\omega}) \bar{n} \cdot \bar{\omega} \; d\bar{p}

E(p‾)=∫ΩL(p‾,ω‾)n‾⋅ω‾dω‾ E(\bar{p}) = \int_{\Omega} L(\bar{p}, \bar{\omega}) \bar{n} \cdot \bar{\omega} \; d\bar{\omega}

In a fragment shader I can compute the radiance at a particular point in the direction of the camera. Then I’d have a framebuffer full of radiance values? But ultimately cameras measure energy (JJ), and I have Wm−2sr−1Wm^{-2}sr^{-1}. I get how to integrate power over time to get energy, but what about the m−2sr−1m^{-2}sr^{-1}?

References

← Sunstone dev log 20: fixing memory bandwidth Newest