This is still a work in progress, with many related features and improvements left to implement (including single scattering, multicolored objects (I already support separate scattering parameters for the R, G, and B components), and a variety of little things), but I've structured everything with these things in mind, and now coding most of them should be relatively straightforward.
A lot went into this. Check out my previous couple posts for some background information, implementation details, and a list of resources I've used. To summarize, my multiple scattering implementation is primarily based on Jensen and Buhler's 2002 paper A Rapid Hierarchical Rendering Technique for Translucent Materials, with the help of many other resources as well (many of which I listed in a previous post). At some point, I'd like to post more implementation details and write about the specific challenges involved, such as designing a good architecture, storing separate point clouds for separate objects, making it compatible with other features like instancing and transformations, extending the model to multiple wavelengths, and identifying a couple errors and ambiguities in the paper.
Here's an image would be nearly impossible to render without a combination of approximate multiple scattering and environment map importance sampling:
That bunny has a perfectly smooth surface. I've also added support for rough surfaces:
Just as with my physically-based diffuse / specular model, what's reflected specularly from the surface is not available to take part in subsurface scattering, so the system conserves energy.
And for reference, here's a quick render of an opaque bunny (not exactly the same color) in the same place:
As you can tell, the scattering bunnies above are highly translucent compared to this one.
And for reference, here's a quick render of an opaque bunny (not exactly the same color) in the same place:
As you can tell, the scattering bunnies above are highly translucent compared to this one.
Very nice!
ReplyDelete