最近一位朋友试着在 UE4 复现了一下新笑傲江湖手游的材质,不过只做了面部和眼睛的。现在这个材质被我直接打开,看看他到底干了什么
先看一下目标效果
- 新笑傲江湖角色预览
以及 UE4 中各种灯光方向下的效果
- 原本的灯光
- 转个角度的灯光
然后是整个材质的连线图
首先是面部的颜色贴图
因为 UE4 和 Unity 的 UV 上下颠倒,所以这里给 V 乘了个 -1
然后就是按照类似预积分皮肤或者卡通渲染那一套,采样一张 Ramp/LUT 图,用来当做光照结果
然后 UV 的 U 坐标,可以用法线点乘灯光方向,然后乘 0.5 再加 0.5,将结果从 -1~1 映射为 0~1。而 V 坐标直接输入就好。
很多卡通渲染的 ramp 图并没有 V 方向,加入 V 方向只是为了方便制作不同的皮肤质感。在预积分皮肤的渲染里,这个 V 方向可以用预计算曲率的倒数。
这里灯光方向用 MaterialParameterCollection 代替。
可以获得以下结果
- 海星
然后是要混合颜色贴图和上面的光照结果。
在此之前,需要将颜色贴图转一下颜色空间
这里的转线性空间,用的是 Unity CG.cgnic 里的算法
颜色贴图部分预览
将光照结果和颜色贴图和灯光颜色给乘起来
最后得到一个这样的结果,我们称之为 Ramp 颜色部分吧
下一部分,反射部分
没有什么好说的,直接采样,然后转线性空间,然后和线性空间的颜色贴图相乘
这个 0.3 不太清楚是怎么想出来的
反射结果
........................面部嘛,卡通嘛,反射弱一些很正常
可以做个 0.454 次方看一下,多少还是有点颜色的
下一部分,才疏学浅,没有联想到现成的公式套入,只能是猜猜这是干嘛的了。如果有小伙伴看出这是哪个论文的魔改实现,请务必告诉我
四舍五入就大概是将 (1-NoL) 做个二次方,然后乘个强度
用代码写一遍,方便观看
最终结果如下
然后乘上没有转线性空间的颜色贴图颜色
然后将上面三部分全部加起来,线性转 gamma
线性转 gamma 依然是 Unity 里的
得出结果如下
事情到这里还没有结束
根据 NoL 结果混合两盏灯的颜色,一个顺光,一个逆光。
得出结果如下
然后乘上没有转线性空间的颜色贴图颜色
然后加到上面那个转到 Gamma 空间的颜色
奇迹发生了,出现了类似游戏中的画面
后面还有一些颜色混合和雾之类的东西,就不提了
另外,如果需要在 UE4 中正常预览,需要在输出的地方,转成线性空间
因为 UE4 中,Tonemapper 会进行一次 pow(x,0.454) 的操作。而这个材质所有空间转换是按 Unity 写法,手动做的
下一章写写眼睛的材质