[Bf-cycles] Shadow Catcher BSDF
lukas.stockner at freenet.de
Wed Feb 11 19:59:46 CET 2015
I've been trying out how to implement a shadow catcher in Cycles, but
apparently there are many different approaches.
My current idea is: At the point being shaded, evaluate the direct
light, but also separately accumulate the contribution of lights without
considering occlusion (the shadow_blocked check). Then, a shadow ratio
can be calculated from "L_regular / L_no_occlusion". The shadow ratio is
then used in a Holdout-like setup to set alpha and terminate the ray.
For non-camera rays a diffuse BSDF is generated, but that could easily
solved by adding a BSDF input to the shadow catcher node which allows to
set a non-camera BSDF. By using an AlphaOver in the compositor, this can
be easily combined with a suitable background.
There are two problems with this approach: First of all, it doesn't
consider indirect lighting such as caustics or, which is more important,
diffuse light. Therefore, the area around objects on the shadow catcher
looks slightly darker than it should look. And secondly, the standard
implementation "calculate both values, divide, set alpha" inside the
shader doesn't work, because both values must be accumulated separately.
This could be implemented as an auxiliary internal pass, though, so that
the division is performed in the buffer code. Still, not as nice and
clean as I had hoped for.
Another approach is
basically works with a difference. However, as far as I see, that needs
a really precise and accurate scene (for example, in the page 9 example,
a wrong color for the plane would instantly give weird-colored shadows).
Also, it produces negative colors in the difference image, which will
probably cause havoc in the compositor.
So, my question would be: Are there any approaches that might work
better? Am I overlooking something? If not, would one of these
approaches be useful?
Any input is most appreciated :)
More information about the Bf-cycles