接下来一段时间的TA学习会专注在庄懂老师的课程上,一节课整合为一篇文章,主要为课程理论笔记、Unity实操、作业完成 三个部分。
本次为第一节课程的记录,讲解了兰伯特光照模型的数学原理,以及初步使用ShaderForge来实现该模型。作业为一个二分效果的实现。
参考:
(1)庄懂的技术美术入门课-01
(2)ShaderForge官方文档
一、课程理论笔记
1. 兰伯特
众所周知,点积能求出向量间的投影:
如果两个向量同向,点积结果>0 ,
俩向量垂直,没有投影 点积=0 ,
俩向量方向相反,点击结果<0。
所以我们可以想象一下,现在有一个物体和一个光源,该物体上的每个法向量(nDir),与光线向量相反的向量(lDir)进行点积,(看图),将结果进行归一化 该模型上的每个点就都能得到一个数值,并且都在范围[ -1 , 1 ] 之间。[ 0 , 1]对应明度关系中的黑到白,对于<0的值,毕竟也没有比黑色更黑的颜色了,所以索性就将负数全部也改为0,而这个步骤用表达式即为 Max(0,nDir · lDir) ,这就是兰伯特光照模型。
当时我有一个小疑问,难道不是明暗交界线才是最黑的吗?其实这是因为暗面有反光的关系才使得明暗交界线是最黑的,所以如果想要渲染出这种效果,就需要添加一个“反光”的光线(再加个物体上去提供一个有反光的条件即可)。
2. 半兰伯特
兰伯特的结果对于美术来说暗部会太闷,所以为了能够使画面更加通透,就有了半兰伯特模型,而半兰伯特其实就是将一开始得到的[ -1 , 1 ]范围映射到[ 0 , 1 ]中,这样从亮到暗变化的节奏就会变缓一倍,这就是半兰伯特。而做这一步,只需要将[ -1 , 1 ]中的每个值,*0.5,再+0.5。
3. 渐变纹理
为了能够给模型贴上渐变纹理,我们需要把这个黑白关系映射为有色彩倾向的,这个只要我们自己备一个喜欢的渐变色图片即可。之后,我们就需要利用 uv坐标(一个以u为横坐标,v为纵坐标的坐标系),这个坐标的作用就是用来给我们的贴图定位的,告诉我们材质上的每个像素应该定位于模型的哪个点上。此时用前面计算的黑白关系作为该材质的u轴,然后任意取一个常量a作为v轴,之后模型上任意明暗的像素颜色就会在a上找到。
注意这个图片渐变的方向!!!!!可以看到,这个选的渐变色本身的黑白关系是与调子方向是对应的,这样去渲染,最后物体该暗的地方颜色也就是暗的;但是如果我们把这个材质图进行翻转,最后的呈现效果也会完全相反,本该被照得最亮的地方映射的反而是暗色,而暗部是亮色。
那么如果是旋转90°呢?大家有想过吗~
二、课程实践操作
最重要的就是知道想要完成的操作如何用对应的数学公式实现即可,也就是弄懂ShaderForge中右键后这些菜单栏对应的操作:
1. 兰伯特
模型表面法向量:Geometry Data - Normal Dir
光照的反向量:Lighting - Light Direction
点乘:Vector Operations - Dot Product
(可以再添加一个将数据钳制在0-1区间的操作:Arithmetic - Clamp 0-1 )
2. 半兰伯特
乘:Arithmetic - Multiply ,加:Arithmetic - Add
常数:Constant Vector - Value
3. 渐变纹理
将调子和一个常量合并为一个二维向量(形成uv坐标):Vector Operations - Append
材质图:直接拖入
三、作业布置与讲评
1. 作业布置
2. 我的作业
① 二分:
② 再添加描边后就是很卡通的形象啦:
3. 老师讲评
① 可以学一下老师的布局,有模块又节省空间,还有一些能复用的数据可以使用同一节点
② 纹理图的过度卡得太死,可以稍微软一点,卡硬即可,别卡死
③ 可以在同一阶中添加一点变化玩出花样
④ 解答了我的疑惑:为什么我做的草莓模型叶子上那块被果肉挡住的那个位置是亮的!因为这个模型是没有考虑投影的
⑤ 描边暂时不是很顺滑,是需要后处理抗锯齿的,暂不处理
⑥ 大家都太卷了啊啊啊太超纲了吧!!!有些是选择用简单模型做复杂效果,有些是课程内容做复杂模型。另外只是通过修改材质图的画法,也能玩出很多很特别的效果!
⑦ 金属材质不适合用兰伯特模型,因为金属材质镜面反射比较严重,高光是会随着视角变的
下一篇再讲同学作业的具体实现~