欢迎光临散文网 会员登陆 & 注册

作业一笔记2:对大佬的模仿和总结

2023-03-19 12:25 作者:绝剑结城  | 我要投稿

看大佬们的作业,真是太卷了,不过也学习到了很多,于是自己尝试模仿大佬作业并自己做一些尝试。

大佬作业

首先是这个有点偏水晶材质的模仿,第一步是半兰伯特光照的映射,这里注意的一点就是映射图的绘制。首先它的亮部是暗的而暗部是亮的,同时最右边的高光处又要亮一点

映射图

然后是两个小高光点的制作,首先把光照方向加上一个vector4进行偏移,然后归一化防止出问题,然后再点乘法向,然后用step把想要的高光范围截出来,最后用max混合在一起后使用clamp钳制,因为点乘的时候出现负数了。

节点
结果

然后以这个作为alpha值,lerp一个高光颜色和上面的半兰伯特光照映射。

结果

然后接下来制作菲涅尔效果。(现在看来我当初自制描边的步骤有很多可以优化的地方,比如这里有菲涅尔,比如if函数和step函数可以直接截取等等)菲涅尔节点乘以颜色就可以改变菲涅尔描边的颜色。

节点图

最后把上面两个成果混合,这个混合节点我还不太懂他的原理。

最终成品

个人模仿

下面是第二个纹理材质的模仿。首先我测试了下屏幕坐标节点的使用,感受了一下不乘深度和乘了深度的区别。

我靠,看了下别的大佬的笔记,感觉人家好屌,我这笔记真肤浅。不过还是记录下吧。

首先是直接连屏幕位置到纹理上去,这时候会把整个屏幕分为一个-1到1的范围。这也是为什么会出现四个图。(虽然看起来像两个,那是因为上下连起来了)(不过screen uvs模式则只有一个图)

对屏幕的划分(normalized和tiled模式)
对屏幕的划分(screen uvs模式)

Depth节点,输出该点到摄像机的距离,越远则值越大(而且通常都很大,只有挨得很近才会小于1),将Depth和屏幕位置相乘,就会有纹理大小会随着缩放改变的感觉(不懂怎么形容,自己去试就懂了),经大佬解释,原理应该是这样的,比如最基础的坐标是-1到1的范围,而乘以depth后,离得远的时候,depth变大,-1到1会变成-10到10,显示图片从4张变成400张,而离得近则相反,这样子,采样的贴图就会近大远小了。

到这里的下一步本来要用上step节点,但我在那上面那个黄色渐变图测试的时候发现一个问题。

把它和兰伯特光照step后的结果竟然是这样,中间有蓝色出现。首先白色和黑色的地方可以理解,因为从贴图采样的数值只在0到1之间,而兰伯特的范围是-1到1,所以会出现黑和白的地方。但中间的蓝色是怎么来的呢?我搜了一下,看到了一个大佬对step节点的解释后才恍然大悟。

这里不多解释了,直接放链接:https://zhuanlan.zhihu.com/p/342055482

然后通过这个理解,我来尝试解释下为什么会出现上面的结果。

首先A是刀口,B是待切割的兰伯特光照。

B
R通道

以R通道为刀口,如果我给的贴图是纯色,那么R通道也是一个单一数值(0-1之间的),而我这里给的贴图是纹理,因此他的R通道也是纹理,那么,纹理怎么做刀口呢,其实也是简单的比大小问题,把两个图重叠,B上比A颜色深(数值小)的部分,全部为黑,比A颜色浅(数值大)的部分,全部为白。

切割后结果

同理切割其他三个通道,再组合起来,即可获得结果。

然后接下来是导入条纹纹理图片,我自己在ps做了一个,但是导入后出现了个问题,条纹不重复了。研究了一下才搞懂,纹理图片的Wrap Mode要设置成repeat(之前导入映射图片都习惯改成clamp了)。

然而在解决好纹理后又出现一个问题,我step出来的材质是这样的,逆光半球一片黑,而面光半球则还是规则的黑白条纹,根本看不出高光。

我研究了半天,才弄明白怎么回事,首先还是用上面的刀片和被切割物体来解释,step就是把被切割物体分为比刀片亮(值大)的部分(全白)和比刀片暗(值小)的部分(全黑)。对于被切割物体来说,逆光的半球小于0,都比刀片暗(刀片的值是黑色条纹为0,白色条纹为1)。所以逆光的被切割物体全黑,这是没问题的。而到了面光半球,对于黑色条纹刀片来说,被切割物体的范围是0到1,都比他亮,所以切割后黑色条纹部位变全白;对于白色条纹刀片来说,被切割物体都比他暗,所以切割后白色条纹部位变全黑。

被切割物体和刀片

最后,我换了黑白直接有渐变的纹理,终于达到了我要的效果。

然后以此为alpha,lerp明暗颜色,然后之前的光照模型再利用,乘以一个颜色后加到lerp的结果后面。然后再加描边。

最终效果

接下来是第三个材质,首先要了解这个frac节点。他说是取小数的节点。以屏幕坐标的u为例,直接输出u的时候,左边是小于0的全黑,右边是0到1的渐变(可看上面屏幕坐标的解释)。

而加入frac节点后,左边-1到0的颜色也变成0到1的颜色了(我印象中其实在ue里面用过这个节点,不过忘了是什么时候了,好像是之前学过一个多重颜色的后处理雾效不过我没做笔记),其实我感觉这不算是真正意义上的取小数,-0.9你取小数怎么是0.1呢,不过大致懂这个意思就行了,就是让0到1不断重复。

然后把屏幕位置乘以一个值后再frac,就会有下面的结果。因为原本是-1到1,四个格子,然后乘以10变成-10到10,但看上去还是四个格子,因为uv轴都是负为黑正为白,但加上frac节点后,就会以1为单位划分格子了。

然后接下来使用一个remap映射节点在上面的每个格子中,横轴纵轴取值都是0到1,而remap节点可以把这0到1的映射改到其他范围,这里改成-0.5到0.5,也就是变成每个格子是以原点为中心uv轴范围都是-0.5到0.5。

然后再通过一个length节点,生成一个程序化点阵。length节点的作用是获取向量的模长,上面那个图中,中心为(0,0)模长就是0,所以是黑色,其他点以此类推。

这时候看另外一边,这一部分是熟悉的兰伯特光照,但乘了一个投影节点,可以让材质接受自身和其他物体的投影。

然后接下来这一步就很重要,它把1到0remap成-0.5到2。这是为什么呢?

首先了解下power节点,其实就是求val的exp次幂。val是上面我们求的屏幕空间点阵,我们现在想把他变成亮处的点变小,暗处的点变大。这些点阵的值的范围是0到1,小数求幂有几种结果:负数幂时,结果肯定大于1,都为白;小数幂时,结果会变大,幂越小值越大但始终小于1大于它自身;大于1的幂时,幂越大,值越小,且范围是0到它自身。得到这个规律后,我们想看,点变小,也就是黑色范围变小,也就是值变大,如果从亮部过渡到暗部我们给她power一个0到1的渐变,是不是就符合要求了。

power0到1

但这个还不够彻底,我们想要亮部死白和暗部死黑,所以需要负数和大于1的部分,这就是为什么上面吧1到0remap成-0.5到2的原因。

power-0.5到2

然后再通过round节点,进行四舍五入,保留非黑即白,则可得到结果。

至于个人尝试。。。。好吧,暂时没灵感。

作业一笔记2:对大佬的模仿和总结的评论 (共 条)

分享到微博请遵守国家法律