作业三笔记
phong:视角方向和光反射方向越重合,越亮。

前面这里是求视角方向和光反射方向的重合程度,首先对光方向求反(因为默认是指向光源)然后用反射节点求出光关于法线方向的反射方向,然后点积视角方向得出重合程度。
这一大串节点其实可以萎缩成下面这三个,原因一目了然。

上面求出重合程度后,还需要做两个处理输出,一个是去掉负值,一个是改变高光范围。power节点取大于一的幂的时候,值越大,暗处会越暗(0-1时)(具体看上上篇笔记)。

blinn phong:视半角方向和法线方向越重合,越亮。
节点和上面差不多,重合,处理。

两者差别,phong质量更高,尤其逆光处,但开销会比bphong大一些。

下面的内容是oldschool(即兰伯特加布林冯的shader)的代码实现。并以此,我讲一下个人目前对代码的理解。
首先是暴露参数,这个ppt讲得很清楚,不多说。

然后排除掉模板部分,剩下有四大部分,首先是输入结构和输出结构(可以理解为java的类(因为我对java比较熟一点,下面我都用java来类比吧))输入类里面的成员变量写的是要从模型中取读什么数据。然后输出类就是经过顶点着色器方法后,返回的输出类中的成员变量有啥。
顶点着色器就可以理解为一个返回值为输出类,输入值为输入类的方法。在下面例子中,输入类从模型中取读了顶点和法线信息。然后把输入类传入顶点着色器方法,方法中首先新建一个对象o,然后给o这个输出类对象的三个属性赋值。比如o.posWS,表示物体的顶点世界位置。(注意虽然叫做输入类输出类,但实际上他们代表的对象都是物体。)这个物体的顶点世界位置需要用物体的自身顶点位置信息,乘以一个变换矩阵,才得到,然后赋给输出类的posWS属性。其他也是一样,通过对输入类的信息或者unity自带的信息处理,给输出类定义的变量赋值。

顶点着色器返回的o会进入像素着色器,然后连连看里面节点的功能,也是在这里实现。这个代码应该挺好理解的,首先吧需要用到的向量准备好,然后需要的点乘也准备好,最后实现模型。

上面的是blinnphong的代码,稍加修改(不会的就看连连看出来的代码)就可以实现冯的。



然后是上次脑花的复现。

我看了下老师的解析后,做了些自己的改动。
最终总结出来节点分为五个部分:

第一部分是很熟悉的布林冯部分,就是布林冯光照模型。

第二部分我称为脑花部分,UVcood节点记录了采样的UV坐标,乘以不同的值后再连到texture节点就可以对贴图进行不同大小的采样,这里采了一大一小两个样然后乘起来。(我中间加oneminus节点是因为我的贴图太黑了,我想要以白为主,线条为黑的,power节点则是为了加深黑色线条,因为直接乘出来后的黑色线条太浅了,总之都是因为我的贴图找得不够好而做出的修改节点,不是必要的)之后lerp灰色,来让脑花图变灰。


脑花部分乘以布林冯部分,得到一个结合版脑花

第三高光部分,round四舍五入取出高光,然后乘以颜色改变高光颜色。


第四部分是底色部分,这里完全是我自己写的。虽然说几乎是纯色节点,但直接赋予纯色的话会看不出模型轮廓,这里我用取绿通道(差不多获得一个光从上往下照的模型)后,用类似半兰伯特的方法,把亮的部分变得很大(加的时候不是加0.5而是多加点),乘以颜色后获得底色。


第五部分是造出二层底色,首先把上面的结合版脑花power一个值改变高光范围,然后再round,然后加一个值让他变灰而不是纯黑白,然后再clamp(因为上面加后会出现超过1的部分)

得到这样一个灰色的第二色阶范围,用它乘以第四部分,就可以得到两层底色


然后再加上第三部分的高光,即可得结果。

最终效果

油漆效果

我这里用了庄懂大佬优化的方法,还是分部分来解释。

第一部分,是alpha部分,这里用一个噪点图,然后缩放uv后取黑白两色,营造出这种驳杂的alpha。这里取黑白两色可以用round节点,也可以用step节点,但是round节点只能四舍五入,而step节点可以取截取的范围,从而调节驳杂的斑纹的大小。

这里尤其需要注意的一点是,一定要用单色通道而不是RGB通道,否则由于分通道截取结果不同,会导致结果有杂色。


第二部分,前面都是熟悉的phong,但是在调整高光值的地方,连的是一个lerp节点,这个lerp节点以alpha为根据,输出两个不同的高光值(黑的地方输出B值,白的地方输出A值),由此可以调节油漆和金属本身的不同的高光。

第三部分是底色部分,也是熟悉的兰伯特光照,然后乘以两个颜色节点附加不同的颜色,再通过lerp节点,调节油漆和金属颜色。

最后把光照部分和高光部分相加后输出,即可得到结果。
