PDA

View Full Version : Lambert shading and soft shadows from scratch in nodal

Dan_Ritchie
09-12-2014, 12:42 PM
There are times when it can be advantagous to create a shader from scratch in Nodal.

The Lambert shader is one of the most used and typical shading models in 3D. Here's how to make one from scratch.

Soft shadows are easy to create using the raytrace node.

And one more on sub-surface scattering with a different aproach.

OnlineRender
09-12-2014, 01:54 PM
knocking it out the PARK.............................................. .. cheers!

Dan_Ritchie
09-12-2014, 05:46 PM
The nodes

Sensei
09-12-2014, 06:40 PM
Unfortunately it's not entirely correct way.
When you reverse normal vector by multiplying by -1,-1,-1 (you can actually use math > vector > scale -100%)
and then dot will return value result is in range -1 .... +1
so if you would save it in format that's storing floating point values (like EXR or so),
info about -1 will be still there in image and might cause further issues during post-processing.
You should make sure that value is properly clamped.
After dot product there should be math > scalar > max with 0 as 2nd input.
After that we can be sure result is in range 0...+1

Clamping can be done in Effects window, Processing tab "Limit Dynamic Range",
but IMHO better do it in nodes..

Dan_Ritchie
09-13-2014, 11:41 AM
Unfortunately it's not entirely correct way.
When you reverse normal vector by multiplying by -1,-1,-1 (you can actually use math > vector > scale -100%)
and then dot will return value result is in range -1 .... +1

Yes, but dot product can produce a negative number regardless of if we multiply by -1 or not, because normals can always have a negative direction.

We can prove that there is a negative value by adding an ABS to the output from dot product.
124228

It's easy to solve using a logic node. Id rather use logic than a clamp because clamp required you to set an upper limit, which is non kosure for HDR, although I suppose you could pass the original value through, but I was trying to keep it programmy.

The logic reads something like "if input<0 then output=0 else use original input"
124229

Sensei
09-13-2014, 12:14 PM
Math > Scalar > Max
1st input - dot result
2nd input - 0.0
after that if dot result > 0.0, dot result is used
if it was <0.0, 0.0 is used.
Quick and simple.