柔和材质SoftShader (Maya节点)


看料理鼠王的动作预览时,感觉他们的画面很柔和,没有死黑,暗部细节很自然,不像环境光那样平,而且光源很统一,没有错乱的明暗交界线,下午,实现了一下,3delight的shaderdl出了点问题不能编译rsl了,于是继续用Maya节点搞定…

原理

原理很简单,简单说下吧,说多了有被众神笑话的危险。

普通的Lambert是根据Shader表面法线和光线的点积计算亮度,结果小于0时截取到0,

C=clamp(0,1,(L dot N))

所谓的SoftShader就是以能显示更多的细节为目的,以失去写实度为代价,稍微改进了下,将点积的结果[-1,1]转换到了[0,1],这样原本小于0被截取的细节重新归一化后就成为了0~0.5之间的值,而原本0~1的亮部压缩到了0.5~1.

C=(L dot N)*.5+.5

实现

以下是Maya的实现节点网络:

说明

主要路线为灯光方向向量和法线向量点乘,输入到ramp的v坐标,从而调节ramp的亮度分布可以任意调节shader的颜色。

黄色区域使用相机的矩阵把camera space的法线转化为world space。

蓝色区域为取得灯光的阴影,调节亮度后输入到ramp的color gain来形成阴影。

里面一个locator,受灯光旋转约束,用来取得方向向量。

对比

左为默认lambert,暗部死黑

中为普通lambert,调亮ambient,虽然暗部变亮,但毫无细节

右为软软的SoftShader,很好的利用了0~1的范围

加Bump后更明显:

同样是一盏灯,只有右图的暗部能看到细节。

测试



上图开启阴影,Maya Software渲染,高抗锯齿,时间七八秒,场景只有1平行光,但效果不错,有点全局光的味道。