Subsurface Scattering (2004)

[column width=377px margin_left=120px margin_top=80px]
Figure 1: A teapot with subsurface scattering rendered in real time.

Subsurface Scattering

Subsurface scattering is the effect of light hitting a surface and instead of being reflected, it penetrates the material, is scattered inside of the material, and then exits in a different point on the surface.

Figure 2: The incoming light is reflected in different directions on the surface (left) The incoming light enters the material and exits in another place(right)

The light can even go all the way through the material making the material translucent. The effect can be observed in materials such as milk, marble and skin.

Calculating the scattering

For each point on the surface we must find the amount of scattered light from every other surface point. We approximate the calculation by assuming that the distance between the two surface points, are very small and can be considered as local illumination. We can simplify even further by having each point on the surface represented by a small area. We use the vertices of the model as surface points, this way we have a discreet version of the integral.

The area represented by a vertex can be found by finding the combined area of the triangles sharing the vertex, and dividing this area by three. We also must make sure to not receive light from vertices in shadow. To do this we create a shadow map for each light source.We just have to make sure the entire model is covered in the shadow map.


To achieve real time rendering speeds, we have a precalculation step, where we precalculate the amount of scattered light for each vertex. When we render the scene, we can use these saved calculations.

Calculation of scattered light

The amount of scattering changes depending on the direction to the light source. Since we don’t know the position of the light source in the pre calculation step,

[column width=377px margin_left=46px margin_top=80px]

we have to calculate for each possible light position, unfortunately we have an infinite number of possible light positions. Instead, we will calculate the scattering for a number of uniformly distributed light directions. In [1] the show that we need about 200 light sources to get a nice result.

Figure 3: The model surrounded by 198 uniformly distributed lights.

For each light source we calculate the amount of outgoing light for each vertex.


When we have calculated the amount of scattering, then we can see the result. We would like to move the light position around the model. To achieve this we can find the direction to the light source and find the 4 nearest light directions and interpolate between the respective values of the scattering of those light directions.


In Figure 4, we can see a model of the monster with and without subsurface scattering. With subsurface scattering the surface looks softer. In Figure 1, by using subsurface scattering, we can make the teapot look like it’s made out of candy.

Figure 4: Diffuse (left) diffuse + sss (right) By using only the diffuse we get a very harsh look, with the addition of subsurface scattering we get a much softer result.


[1] X. Hao, T. Baby, and A. Varshney. Interactive Subsurface Scattering for Translucent Meshes. In Proceedings 2003 ACM Symposium on Interactive 3D Graphics, page to appear, april 2003.

Comments are closed.