看料理鼠王的动作预览时,感觉他们的画面很柔和,没有死黑,暗部细节很自然,不像环境光那样平,而且光源很统一,没有错乱的明暗交界线,下午,实现了一下,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平行光,但效果不错,有点全局光的味道。