您的位置:首页 > 其它

关于Wrap Lighting与皮肤SSS

2017-07-05 16:21 393 查看
最近在弄手机上的SSS皮肤,查资料的时候碰到Wrap Lighting这个概念,这里简单总结一下。

这个说白了就是Half Lambert的高级版,或者说Half Lambert是Wrap Lighting的一个特例。Wrap Light直译的话就是用光包裹住整个物体,让原来黑暗(即N*L<=0)的部分亮起来的意思。如果是标准Lambert的话,有很大一部分地方是黑的,让整个物体显得比较平,而Wrap Light会有一个光的过度,并且"soft“整个物体的感觉。如下图:



图片引用自Valve的Half Life 2引擎技术分享,最右边的上下两张图可以看出来,使用Half Lambert效果更好一点。

Wrap Light公式为:

float diffuse = max(0, dot(L, N));
float wrap_diffuse = max(0, (dot(L, N) + wrap) / (1 + wrap));

所以Half Lambert相当于wrap值为1的情况,具体项目中,wrap值会按照美术的感觉来走。

早期的皮肤材质就是用这样的方法来制作的,并没有什么道理可讲,就是粗暴的觉得这样很好看而已。其中还包括,使用wrap后的N*L来去采样一个一维的贴图,类似下面的图:

下面的图是使用效果,C图就是用了这样的采样贴图:



在黑白交接的地方给一点红色,用于模拟皮肤的感觉,这个也是现实中出现的情况。所以最后diffuse的公式变成了wrap后的N*L再加上这个采样过后的Scatter数值,或者直接是用采样后的数值作为diffuse数值(当然这个采样贴图本身需要好好制作)。具体公式每个游戏都不一样,但是原理就是这样:使用Wrap
Light的Diffuse。

这样的算法还是很实用的,但是在现在,已经有点不够用了,其中原因有:在PBR大行其道的今天,这种完全没有能量守恒的算法会让整个物体过于明亮,所以有大牛就据此修改了Wrap Light,让其保证能量守恒:
http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/
并且,在现如今都使用SH作为环境光的情况下,环境光如何使用Wrap Light呢:
http://blog.selfshadow.com/2011/12/31/righting-wrap-part-1/
还有,如果这个算法是用于模拟皮肤的SSS效果的话,并没有考虑到真正的skin diffusion
profiles和皮肤表面的curvature,仅仅是看起来有点像的样子,这些都需要进行修改:
http://advances.realtimerendering.com/s2011/Penner%20-%20Pre-Integrated%20Skin%20Rendering%20%28Siggraph%202011%20Advances%20in%20Real-Time%20Rendering%20Course%29.pptx
上面这篇文章是在Forward Rendering的情况下如何做皮肤SSS的,和大行其道的后处理SSSSS并不一样,效果也还不错,Order 1886,NV的Facework插件均使用了这个算法。

引用:

1. https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch16.html
2. http://www.valvesoftware.com/publications/2006/SIGGRAPH06_Course_ShadingInValvesSourceEngine.pdf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SSS skin wrap light