皮肤的实时3S渲染(OpenGL + GLSL)

人的皮肤之所以看上去比较柔和自然,主要是由于各层皮肤对光线的散射,通过实验测试表明,光线接触到皮肤时,有大约96%被皮肤各层散射了,只有大约4%被反射。下面就是光线经过皮肤散射和反射的示意图(摘录自Gary J. Katz的"Skin Rendering"):

这种皮肤各层对光的散射就是次表面散射效果(SubSurface Scattering),简称3S效果。这种效果的一种计算模型是Jensen的BSSRDF模型。BSSRDF中计算Rd的方程如下:

次表面散射分为2种:Single Scattering和Multiple Scattering,因为皮肤散射是以Multiple Scattering为主,所以这里我只计算皮肤的Multiple Scattering效果。我这里采用的方法是Carsten Dachsbacher和Marc Stamminger的论文"Translucent Shadow Maps"中描述的方法,就是以光源为视点来计算得到Irradiance Map, Depth Map和Normal Map,分别用来存储Incoming Irradiance , Depth和Normal(以光源为视点)。这里比较关键的是如何从Camera Space转换到Light Space,窃以为Paul's Project的关于空间转换的示意图很是经典,清晰明了,让人一看即明白,现摘录如下:


我这里使用OpenGL+GLSL来实现Translucent Shadow Maps,首先用FBO来渲染3张Texture:Irradiance Map, Depth Map和Normal Map,然后通过获取每个Fragment的Irradiance, Depth和Normal,根据上面所讲的公式来计算Rd,然后通过hierarchical filtering(通过MipMaps)来模拟Multiple Scattering,这里采用的是"Translucent Shadow Maps"论文中的21采样点过滤法,如下图所示:

最后的实现效果截图如下:



上图左边的3张图分别是:Depth Map, Irradiance Map和Normal Map(以光源为视点)。

下一步工作:

1。优化,提高效率;
2。支持纹理贴图;
3。支持动画。

欢迎广大同好交流、批评和指正,any comment will be welcomed!

posted @ 2008-04-21 03:24  Skyman  阅读(3602)  评论(0编辑  收藏  举报