作业一卡通材质个人实现思路
最近开始接触unity shader,个人做一些萌新学习笔记和总结。
下面是作业一的总结,有一说一虽然自己做的最终效果不是很完美,但是做的过程还挺好玩的,特别是自己琢磨出描边效果后,还挺有成就感。

首先是渐变色,根据第一节课的映射思路,我直接在ps做了个渐变的映射图

但是这样出来的结果会发现过渡太过硬了

于是我在过渡区域加了渐变,得到映射图2

于是颜色的效果就做好了

然后是描边的效果,我不知道在main面板可以直接添加描边,于是自己想了办法。
首先我想到通过光的方向和法线方向点乘,可以得到根据光的方向渐变的取值,即1到-1。然后在0的周围就是明暗交界线。
那么如果通过摄像机方向和法线方向点乘,那么0的周围就是物体的边缘了。

实际结果和我想的也差不多,但是我想要物体边缘的黑更多一些,现在物体边缘到中心的范围是0到1,想要边缘黑更多,那么就要减一些数值,这里我减上0.25。那么从边缘到中心的范围就是-0.25-0.75.

但是我只想要边缘黑,中间我想要纯白,怎么办呢。其实这一步我尝试了挺多东西(比如加减啥东西,或者blend,clamp啥东西),最后思考后试出了比较好的解决办法,就是乘以一个数值,比如我在这里乘以10,那么从边缘到中间就是-2.5到7.5,我们知道0以下都是黑,1以上都是白,那么黑的范围就会限制在很小的边缘了。

我原本以为这样直接就做出了边缘,接下来就是换颜色的问题,怎么把黑边换成其他颜色的边,弄了半天我才想起来lerp节点,用这个黑白做lerp节点的alpha值,然后ab换上想要混合的颜色。但是直接加会发现一些问题,中间的地方过曝了。

想了一下后明白了,lerp是根据0-1来选取混合的,而我输入的alpha已经是-2.5到7.5了,而恰好,这时候,clamp就用上了,在上面的节点后面clamp0-1,再拿去当alpha,就实现了一个不错的效果。

最后这个和题目的差别应该就在于边缘不够硬了,但是可以把乘的数值调到100。这样看起来就差不多了。

但是,我这个自制的描边效果和直接添加的描边效果在猴头上的表现差距就有些大了,自制的描边效果描边不够均匀且锯齿感明显。


这估计是因为面的法向和镜头到面的方向的点乘在非球物体上不够均匀的分布在边缘导致的。就比如说一个正方体,我的描边是根据该点的法向与镜头方向的垂直程度来判断是否是边缘的,而正方体一个面上所有的点都是朝一个方向,而不是仅仅边缘部位垂直于摄像机方向。而main的描边可以精确选择出视图上渲染出来的物体的边缘

上面正方形的顶上这个面一半黑一半不黑是因为,尽管各个点的法向相同,但是各个点到摄像机的方向是不一样的,越近的点,夹角越小。

注:在blender导出猴头时,需要勾选“应用变换”选项,否则描边会出错。