原神角色渲染03
高光

lightmap的r通道是区分高光区域的信息,以0.1为间隔。每一层代表不同的材质的高光。我数了一下迪西娅这张似乎有7层,分别是(0,0.2,0.5,0.6,0.7,0.8,0.9,1),我通过数学运算来分别提取这些层。(运算原理和之前提取ramp区域的一样,把要提取的值移到0上,然后取绝对值再把其他部位变成1),值得一提的是,要把lightmap的压缩给关了,不然提取出来的黑色部位不是死黑也就是不是0值,估计原理还是和之前一样,压缩后图像精度下降了。
灰度值为0的地方,看起来是皮肤和一些布料啥的。

灰度值为0.2的地方,看起来是皮靴?

灰度值为0.5的地方,看起来好像还是皮制品

0.6-1.0的高光范围。

我后面在扩大范围后进行了一个减0.1的操作来降噪。至于为什么能,仔细想一下就懂了。

所以其实看完各层高光后可以发现,除了1.0是金属,其他都是非金属,有大佬直接划分高光为金属非金属两种,不过我觉得在游戏里面应该还是对各层高光进行了不同的高光强度的划分。但是我这里也直接分为两种吧,后面要细化的时候再改,反正改也很简单。

我直接以1.0值的划分来作为一个金属与非金属区域的mask。然后非金属区域的高光直接乘以b通道的高光强度,金属区域的高光再乘上个基础色。

上面那个是基础效果,下面我们来对金属的高光进行优化。首先便是采样这个金属高光图,据说使用方式和matcap一样。那么我们就按那个方法来采样。采样方法可以看我之前的专栏。

采样结果以及乘上基础色后。我测试了一下,应该是用这个matcap后就不用布林冯了。

融合各高光后的结果。(虽然可能乍一看还看不出啥)

补充1:可视化法线矢量

补充2:ramp优化(或者说改动)
之前使用smoothstep的ramp过渡我还是感觉有点硬(虽然卡渲好像就是要这种硬的),但是我去角色演示里面看了下好像还是有点软的。

所以,我在半兰伯特那里进行了修改,不使用smoothstep,而是用自己想的数学运算。(我发现我好喜欢用数学运算来改变各种映射,其实只要想清楚原理,这种映射挺简单的)

我解释一下这个运算过程吧,如下图。

唉我现在竟然能想出这种映射,希望未来的我不会退步到想不出这种运算,甚至看还不懂。