关于Wrap Lighting与皮肤SSS

最近在弄手机上的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图就是用了这样的采样贴图:

fig16-02a.jpg

黑白交接的地方给一点红色,用于模拟皮肤的感觉,这个也是现实中出现的情况。所以最后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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值