这里就简单说下原理吧,使用unity很久之前的一个插件shaderforge,最近几年好像在unity资源商店已经不再维护了,但是有shader forge的官网:在这,碰到节点不会的时候可以查一下官方文档,还是很方便的,节点也比较少。其实可以用ue做,但是ue4节点还不咋熟悉,先用unity熟悉原理,后面转到ue也方便。
先放一下材质的效果:
首先是兰伯特基本原理,这里采用的是半兰伯特模型,兰伯特模型的取值区间是[-1,1],但是这样映射到材质上的话就有一大半的区域是黑色的,因为值小于0的区域默认取值颜色是黑色,所以将兰伯特的取值区间变为[0,1],也就是原有区间先乘0.5再加上0.5。然后采样我们自己的贴图,具体节点如下:
可以看到我的材质球是有两个高光点,且加上了菲涅尔效用,增加材质的通透感。
- 两个高光点是对法向量进行了两次偏移。
- 在最后加上菲涅尔效应。
两个高光点:
- 两个HighLightOffset负责偏移法线的方向。
- 两个HighLight则是“高光点”的阈值,如果偏移后的发现与光方向的点乘结果小于该阈值就输出0,否则输出1。这样可以得到”高光点“,除了高光点,其他区域都为黑色。
- 然后将两个“高光点”使用max进行取值,因为这是对每个顶点进行操作,在单个顶点上,取值大的,黑色的地方相互取值还是黑色,高光点和黑色比较取值,取高光点的值,这样就能让两个高光点同时出现。
- 使用lerp节点,让我们的贴图和高光点混合,类似于使用ps中的图层蒙版,在最上层添加蒙版后,蒙版区域内就会变成下一个蒙版里内容。max的取值只会是0或1。
- 如果高光点max的取值为1,那就输出HighLightColor作为该顶点的颜色,如果max取值为0,就输出半兰伯特模型采样后的颜色作为顶点颜色。
- 最后是菲涅尔项,使用自带的菲涅尔节点,乘上颜色后,与之前lerp的结果进行screen混合,在面板中适当调节参数。最后得到玉石材质结果。