次表面反射普遍用在皮肤, 植物叶子, 蜡烛和玉这类物体上. 之前在Signed Distance Fields in Real-time Rendering最后用SDF模拟过. 其他常规做法比较复杂, 我以为其中最为简单的要数Eric Penner[2]的方法, 但是其计算量还不是最低的, 同年的GDC里, DICE的工程师Colin和Marc[1]给出了一个非常hack的快速模拟, 基本算法仅消耗13个ALU指令, 虽然其基本物理不正确, 但是看起来的效果却非常令人满意.
他们的做法原理主要是利用AO, 一般情况下大家用AO模拟GI的阴影, 利用的是某一点被光线照到的概率. Colin和Marc根据Sousa[3]的启发非常聪明的利用这个特性: AO也可以表示物体内部光线在物体内部穿射时候的概率, 来快速模拟BSDF(BRDF + BTDF). 这个方法的缺点是需要预先烘焙的一个AO图, 并且对非凸包图形效果模拟不够好. 虽然如此, 但是这个方法对计算量的是所有SSS模拟中最少的, 所以还是非常推荐大家灵活使用。
下面是利用Colin的方法渲染的效果:
使用的shader指令统计:
一些制作tip:
- 物体的Reverse AO我是在Max里烘焙的.
- AO最好不要有“全黑”或者“全白”, 不然特定角度看起来会非常假.
- AO这张图分辨率不需要很高,但是采样时候需要很高,不然噪点也会影响最终效果。
如果跟lightmap混合使用,可以做出非常精美的效果, 下图是寒霜2里的效果:
Talk is Cheap, Enjoy Yourself!
[1] Colin Barré-Brisebois, Marc Bouchard, GDC 2011, Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look, 2011.
[2] Eric Penner, SIGGRAPH 2011, Pre-integrated Skin Shading, 2011.
[3] Sousa, Tiago. “Vegetation Procedural Animation and Shading in Crysis,” GPU Gems 3, Hubert Nguyen, Ed., Addison-Wesley, 2008: pp. 373-385.