Bidirectional Reflectance Distribution Function (BRDF)
A Bidirectional Reflectance Distribution Function (BRDF) defines how light is reflected off of a surface, without accounting for internal scattering or transmittance. The function takes as arguments the direction to the light source (\(\omega_i\)), and the outgoing direction of the light (\(\omega_o\)). It then returns the ratio of the reflected radiance (\(L\)) along the direction \(\omega_o\) to the irradiance (\(E\)) incident on the surface from the direction \(\omega_i\). This means that the evaluation of the BRDF has units of \(sr^{-1}\).
For a BRDF to be physically based, it must obey three properties:
Positivity: \(f_r(\omega_i, \omega_o) \geq 0\)
Helmhotz Reciprocity: \(f_r(\omega_i, \omega_o) = f_r(\omega_o, \omega_i)\)
Energy conservation: \(\int_{\Omega} f_r(\omega_i, \omega_o) \left(\omega_o \cdot \hat{n}\right) d\omega_o \leq 1\)
Lambertian BRDF
As an example, lets consider the simplest physically based BRDF: The Lambertian BRDF. The Lambertian BRDF is a diffuse reflectance model that is invariant to the viewing direction meaning that it reflects the same radiance in all directions. We’ll now briefly derive it to get a sense of how it works.
To start, let us define the albedo (\(\rho\)) as being the proportion of incident light that is diffusely reflected by a surface. Therefore, albedo can be defined as:
That is to say, if we consider the sum of the incident light from all possible directions \(\omega_i \in \Omega\), and evaluate the BRDF for a given observer direction \(\omega_o\), the result is the albedo (\(\rho\)). Because we are after some \(f_r(\omega_i, \omega_o)\) that is invariant to the viewing direction, we know that it must be a constant value and so can be pulled out of the integral:
We can now rewrite things to express the BRDF in terms of the albedo (which is often known for a given material):
Integrating over the solid angle is most easily done by first reparameterizing into spherical coordinates. That is to say, we can rewrite:
where \(\theta\) is the angle away from the surface normal (\(\hat{n}\)), and \(\phi\) is the azimuth angle around the normal. Notice then, that we can simply rewrite \(\left(\omega_i \cdot \hat{n}\right)\) as \(\cos{\theta}\). Substituting this into our new spherical integral gives us a trivial integral to evaluate:
Substituting this into Eq (6) gives us the trivial (and expected) lambertian BRDF:
Microfacet-based BRDFS
Although it may not seem like it, in reality, all reflections are specular. Things appear to reflect light diffusely only because, at a microscopic level, their surfaces are rough. Thus even though at any given point the light is specularly reflected, the local normal at that point may be pointed in a wide range of directions, and so the reflection at any given point may not be specular on a macroscopic scale. Simple BRDFs such as the lambertian model simply approximate this behavior macroscopically, but this makes it difficult to then account for other behaviors such as polarization. Even ignoring polarization, simple BRDFs can produce unrealistic results.
Microfacet-based models improve upon this, by directly modeling the microscopically rough nature of a surface as a collection of “microfacets”. These microfacets are not actually part of your geometry, but you can think of them conceptually as helping us determine a new local normal, with which we can compute a specular reflection. If we define a material to be perfectly smooth, all of these microfacets are aligned with the true surface normal, and so we’ll get specular reflections as we expect. If we define a material to be rough, we’ll see the microfacet normals distributed all around the local normal, and so we’ll get reflections which appear diffuse. Because we are representing the surface roughness continuously from 0 to 1, any value inbetween will appear “glossy”, which indeed is what we would intuitively expect a material to look like.
This topic is rather large however, so we will leave it for a new section: Microfacet BSDFs.