Posted on June 02, 2025 - Updated on October 25, 2025
The aim of this work is to to present to the uninitiated what a BRDF is. We follow by discussing the most notorious BRDFs in the literature. Each BRDF is also implemented using a graphics API.
Before focusing on BRDFs, we need to take a step back and spend some time talking about the rendering equation. We do this because BRDFs are just one piece of the puzzle.
The rendering equation, as was introduced by Kajiya in 1986 [1], is presented below.
This equation states that the light going from \(x'\) to \(x\) is the sum of the emitted light from \(x'\) to \(x\) and the total light that is reflected toward \(x\), by \(x'\), from all other surface points.
Another form for the rendering equation, and the one that you will most probably find in the literature, is the following.
This form of the rendering equation follows the same idea as the one above. It states that the amount of light going out of point \(x\), along direction \(\omega_o\), is the sum of the light emitted by \(x\), along \(\omega_o\), and the reflected light at \(x\), along \(\omega_o\).
The rendering equation is what unifies all various rendering algorithms. As you may guess, light is a central aspect of rendering, especially if we want it to be believable, plausible, or even physically accurate. Any non trivial rendering algorithm is, in some way, trying to simulate how light works, how light behaves and interacts with matter. This means that any rendering algorithm is trying to solve the rendering equation. More precisely, it is trying to find a solution to the rendering equation. Solution that, in most cases, either cannot be found, because it doesn't exist, or it would be too complex to do so. Thus, what rendering algorithms find when trying to solve the rendering equation is just an approximate solution. One that, nonetheless, yields satisfying results.
To build an intuition for Lambert's law, consider the following example. Suppose we have a plane, lit by uniformly distributed and parallel light rays. The rays will intersect the plane at various points. We denote with \(d\) the distance between each intersection point and its neighboring points. Being the rays uniform, the various distances are all equal to \(d\). Suppose we rotate the plane as seen in the figure. If we look at the new distance, denoted \(d'\), between the various intersection points and their neighbors, we see that \(d' > d\).
Being the points further apart, it makes sense to say that the density of light hitting the plane has decreased. Thus, each surface point of the plane is receiving less light. When the plane is perpendicular to the light rays, the density of light is at its highest. The angle between the plane's normal and the negated light vector is 0 degrees. When the plane is parallel to the light rays, the density of light is 0. The angle between the plane's normal and the negated light vector is 90 degrees. The most appropriate function to model this behavior is the cosine.
Looking at the rendering equation, we have already met the idea of a function that tells us how light, hitting a surface point, gets reflected off of it. This function is called a bidirectional reflectance distribution function, or BRDF for short.
In the first form of the rendering equation, the BRDF is represented by function \( \rho(x, x', x'') \). In the second form of the rendering equation, the BRDF was denoted by function \(f_r(x, \omega_i, \omega_o)\). Throughout the rest of our discussion, we will denote a generic BRDF using the latter notation.
The idea of a BRDF was first presented by Nicodemus, in 1965 [2]. A BRDF \(f_r(x, \omega_i, \omega_o)\) is formally defined as the ratio of the reflected radiance, along direction \(\omega_o\), to the incoming irradiance, coming from direction \(\omega_i\), both incident on surface point \(x\).
For simplicity's sake, being less formal but hopefully more clear, we can imagine a BRDF to be defined as the ratio of outgoing and incoming light, the first along direction \(\omega_o\), the second along direction \(\omega_i\), both being incident at surface point \(x\).
A BRDF tells us how light gets reflected off a surface. The way in which light interacts with a surface, in particular how incident light gets reflected off a surface, entirely depends on the surface's characteristics, that is the surface's material. Surfaces with very different materials, interact with light in very different ways. Think, for example, of how wood and metal differently reflect light.
It is clear that, BRDFs are tightly related to surface materials. In particular, since different materials reflect light in different ways, we need to change how a BRDF behaves, depending on the surface material. There are two ways in which we can do so:
Note that, in practice, most people make use of a hybrid approach. In order to model all the materials needed to render a scene, different BRDF implementations are used, each one having additional parameters. This is because, most BRDF implementations, specialize on a specific set of materials that they manage to model with satisfying results.
Above we have mentioned the idea of BRDF implementations. We have yet to see how a BRDF is implemented. As Ward [4] puts it, there are two approaches: the empirical approach and the theoretical approach.
An empirical model for a BRDF is just a formula, with additional parameters, used for tweaking it. The main characteristic of an empirical model is that it is not derived following the laws of physics. The author just noticed something about how a given material, or class of materials, interacted with light, and from that observation came up with a formula for the BRDF. From this, we can surely understand that the additional parameters exposed by an empirical model are not of any physical significance.
A theoretical model for a BRDF is an attempt at approximating the real BRDF of a material, or class of materials. This approximation is derived leveraging the laws of physics that we know. The additional parameters exposed by a theoretical model have some physical significance behind them.
Earlier we said that a BRDF implementation is just an attempt at approximating a real world BRDF. The simplest way in which we can approximate a function is sampling it and finding an approximating function for the samples. Well, it turns out that we can sample a BRDF. We just need a gonioreflectometer.
The idea of sampling a BRDF is very simple, but it's not easy to put it into practice. Measuring a BRDF using a gonioreflectometer is a laborious and expensive process. Moreover, we go through a lot of work just to sample a single BRDF. If we were to need more materials for a scene, this approach would not scale. Nonetheless, sampling a BRDF has its uses, both for validating and for coming up with various BRDF implementations.
We can use the BRDF samples we got from the gonioreflectometer to check whether they match the output of our BRDF implementation. If we have a BRDF implementation with additional parameters, we can check whether or not there is a set of said parameters that yields as output the same value as the sample. If this isn't the case, we know our BRDF implementation cannot model the sampled material.
We can also use the BRDF samples we got from the gonioreflectometer to come up with a new BRDF implementation. This is done by analyzing patterns present in the samples to come up with a new model.
Suppose we came up with our own BRDF model. We would like to know whether or not our model is physically plausible, i.e. respect the laws of physics. We know that we can use a gonioreflectometer to sample a BRDF and use the samples to validate our model. If the results coming from the model and the samples don't match, we know that the model is not physically plausible. In the case of a model with additional parameters, if the model and the samples were to match, we would still know nothing about its correctness. We would need to sample a lot BRDFs and this wouldn't be realistic. Is there a more general rule that can help us understand whether or not our model is physically plausible? It turns out that, any physically plausible BRDF implementation must satisfy the following three properties: positivity, Helmholtz reciprocity and energy conservation [3].
The BRDF implementation must always be positive. Negative reflectance is not allowed.
The BRDF implementation must follow Helmholtz reciprocity principle. This means that, if we were to swap the incoming and outgoing directions, the reflectance would be the same.
The BRDF implementation must follow the law of conservation of energy, i.e. energy can neither be created nor destroyed. This means that the amount of outgoing light cannot be greater than the amount of incoming light.
Having a basic understanding of how light interacts with matter, in particular of how light is reflected is very important when studying various BRDF models. When reading about theoretical models, having this knowledge is essential for understanding the model. When reading about empirical models, having this knowledge is still useful. This is because, many empirical models, although not physically plausible, are inspired by the behavior of light-matter interaction. Thus, regardless of what kind of model we are talking about, having knowledge of how light behaves comes in very handy.
We start our discussion by stating that there are two different ways in which light is reflected, that is, there are two kinds of reflections: diffuse and specular. In the next sections we are going to understand the nature of these kinds of reflections.
Diffuse reflection happens when a light ray, hitting a surface, scatters in many directions. This happens because the light ray actually goes inside the surface. Once inside, the ray starts scattering around. At the end, a portion of the scattered light exits the surface in random directions, some of it near the initial entry point.
It is interesting to note that, during the ray scattering inside the surface, part of the ray's light gets absorbed. The scattered rays going out of the surface will then be colored. This is exactly what gives color to objects.
Specular reflection happens when a light ray, hitting a surface, gets reflected in a mirror-like way. The characteristic of specular reflection is that it reflects all incoming light.
How to obtain the reflected light ray is described by the law of reflection. The law of reflection states that the angle of reflection of a ray equals the angle of incidence, and that the ray, the reflected ray, and the surface normal, at the point of incidence, all lie on the same plane, i.e. the plane of incidence.
The angle of reflection is the angle between the reflected ray and the surface normal, at the point of incidence.
Likewise, the angle of incidence is the angle between the ray and the surface normal, at the point of incidence.
It is interesting to note that, in general, specular reflection increases as the angle of incidence increases. This means that, at grazing angles, specular reflections will be more prominent. This behavior is described by the Fresnel equations.
TODO