Volume Materials

This is an attempt to put together Cycles materials with semi-realistic volume scattering and absorption, based on this paper. The values I’m using come from the end of the document, where the authors share scattering, absorption, and first moment data for a list of materials. So far the node setup seems to work well for anything below a certain threshold of scattering, at which point a subsurface scattering or even simple diffuse would work better.

In order, we see: olive oil, opal (arbitrary values), blue curacao, red wine, and glycerine soap.


This is the node setup for these materials. The base scattering density is set to 500, and the individual color values are attenuated based on the assumed size of 1 blender unit in mm (since the values from the paper are listed in mm[SUP]-1[/SUP]). I’m currently trying to determine if separating the three scattering colors is necessary. This was done since the HG phase functions are supposed to be different for each color, but I’m not sure it has a visible effect in blender. Without that, the node setup becomes much simpler. One could certainly use a simple color input for the scatter and absorption; I did it this way to allow directly inputting the values from the table.


The main issue I’m having getting these perfected is that some of the materials should clearly have a negative anisotropy. This was added for the opal material above, producing the yellow/blue variation. There is almost certainly a more accurate way of assigning the scattering anisotropy values, but the math is over my head unfortunately.

For completeness, here is a demonstration of how the setup fails when used with higher scattering values. The materials are mustard and whole milk. I’m guessing that these materials would require huge numbers of bounces to reach the correct color, which is a really inefficient use of render time.


Hmm, that’s interesting, thanks moony! I went down basically the same thought process after reading about fake dispersion glass. For the time being I’ll simplify the nodes and just try to set the anisotropy by eye. For most of the materials I’ve tried that seems to work all right (since the values are mostly pretty close). Do you have any insight into plausible anisotropy values for different materials? All I’ve found so far is various versions of “opal should be negative!”

Next step is trying to work out a similar real-world-scale factor for subsurface scattering.

I think this is only true if you have a single scatter node with pure RGB. As you mentioned, it seems like it combines the multiple nodes, then applies anisotropy separately. For instance, these three renders are with my added-together-unnecessarily RGB scatter nodes. Lit from behind the sphere. Left to right is 0.9, 0, and -.9 anisotropy, so it’s clearly applied.


Disregard this post. Thought I was detecting a different reaction to emitter planes vs point lights, but was in error. Both lighting methods do seem to show anisotropy in this setup.

Holy crap these are good. I don’t understand how people are able to build complex materials based on mathematic formulas and such.

spiderbrigade: this looks like a useful setup… any chance you could post either a .blend or some of the material RGB/BU input values along with the missing FresnelShader layout? (the Harvard paper link times out for me so it would be helpful if more of the details were in this thread)

Couldn’t get the paper either.

Paper can still be found in the guts of waybackmachine

Thanks eppo, got it… note to self: always good to check wayback. These are some nice looking volumetric materials to play with if you can afford the compute cost.

Thanks. Yeah, didn’t think to try wayback :slight_smile:

Can anyone share details about the lighting setup used to produce the test images?