Dipole for SSS

The SSS Dipole shader implements all the relevant dipole models for subsurface scattering available in computer graphics.. namely Standard, Better and Directional dipoles. They are of particular interest because they are better (at matching real life reference materials) than diffusion SSS and way faster than raytraced (random walk) SSS.

Let's see its GUI and main parameters.

Color, Radius, Scale and Anisotropy are the same parameters we find on the Standard Material SSS rollout. The overall scale for better precision is however around 10x bigger than the one for standard material (0.1 becomes 1.0 for the overall same appearance).

Compared to standard (material) diffusion we provide additional parameters to model the surface boundary Fresnel effect. This will darken the object silhouette. IOR param is the index while Weight param controls the amount of the effect. Below we use a default Fresnel of 1.33 with a 0.7 weight (while above on the same model, we don't use any Fresnel effect).

With the Physical Measurements parameters we can input values in their original form (Color and Radius are derived) using extinction (SigmaA) and scattering (SigmaB) coefficents.  We can find almost infinite references to match any material we may need to. These values are actually measured values granted to match very well the original real life materials. The Unit Scale then provide a way to scale the inputs to match the overall size of the scene. The Anisotropy param instead is the scalar version of the Average Cosine we find in the table (ie. add all three values and divide by three). Here are some of them :

Here we did input values for 'potatos' and so get back colors and scattering properties of potatos 🙂 

Let's see the Settings parameters.

The SSS GI Lookup is used when a GI ray hits the SSS material (even the same SSS material can do a GI lookup and hit itself).. what to do there ? Evaluate the 'Full SSS' as we do for plain camera rays, evaluate an Hybrid SSS where stochastically we mix SSS with plain diffuse or just do a plain Lambertian (aka diffuse) lookup (ie. no SSS evaluated at all). Why all of this ? Because we can drastically cut render times while maintaing almost the same overall appearance.

The setting above, beside it can bring super fast render times, has also a big impact on how translucent materials will look eventually. For example while standard Arnold diffusion don't even allow this, with both SSS Diffusion and SSS Dipole we can approach bleeding SSS for translucency which in turn gives us back some nice shadow coloring from the light that passes through the translucent material.

The diffuse floor has indirect diffuse rays (GI) that hit the SSS material.. to have nice colored shadows from the translucency we need a Full SSS GI lookup. Without, the GI rays would just see a plain diffuse and the shadows would be just dark. If we want to increase the brightness of the shadows we can use the SSS GI Multiplier. To limit the GI bounces that will see a full SSS we do have the SSS GI Depth that when set to -1 it means, no limits (beside the Arnold Ray Depth settings). The second image is Arnold diffusion.. colored shadows there are not an option. 

This is where SSS Dipole comes very handy. Let's say we have translucent panels (probably SSS Diffusion is even better for plain panels as it's faster) to render in an architectural scene.. we don't need random walk SSS there, longer render times and noisier results. Another example is for thick leaves.. not whole forests where it might be better to approach the problem with plain transparency but for thick leaves from indoor plants for example.

We do have one more parameter to see. It's called Single Probe Trace. The long story is that when doing diffusion or dipole SSS we rely on an importance sampling tecnique informally called 'disk tracing'. When the object geometry has features close to each other, while doing disk sampling we may hit more than a single exit point that in turn means we'll have to do more than a single diffuse lookup. This is fine with 'branched pathtracers' like Arnold. However wanting Arnold as a pure pathtracer where for example we use many camera rays with all the other paths set to 2 (or even 1) we can use the above setting. What it does is that it will stochastically (randomly) lookup only one single hit at time.

This is great when we're doing in camera motion blur and/or depth of field.. we need many (many) rays to actually converge because instead to do multiple lookups we do only one.. so we need the law of large numbers to help us 😉 and because we already need these many samples for motion blur and/or DOF then we can go for a stochastic SSS lookup. Below for example we use as many as 20 camera rays (400 samples x pixel).. if we'd go for a full SSS lookup we would waste computation because the scene for what regard SSS may be just over-sampled.. ie. we need many camera rays for the DOF to be smooth not for the SSS.. so we use Single Probe to just supply one single sample to Arnold. Take care that eventually we can take additional samples with the ad-hoc SSS Extra Samples param.. this may help further better balance the scene. For example we generally always use at least 1 added extra sample when using also single probe tracing

Another scenario is for when using Adaptive Sampling. Because adaptive sampling will insist on sampling parts of the image/scene where we have more variance.. checking the Single Probe Trace means that there we'll have more variance because of the single lookup. This sometimes also help balance the scene workload and take full advance of adaptive arnold sampling.

We can see that SSS Dipole works really well also for complex geometries and that the overall appearance is that of ray traced subsurface scattering but with better render times (we really had to check if we did not used randomwalk instead of dipole ;).

Leave a Reply