另外,我们这个3S还负责背光物体半透明的外观,但是出于效率的原因,我们以一种更简单的方式来处理这两种效果。我们采用了两种方法,第一种是只适用于薄的物体,通常我们说的叶子。第二种是用来处理通用的半透明物体。两者之间主要的区别,对于相对薄的物体,由于几何体本身是薄的,所以它的正面和背面的阴影是相同的。所以我们在DCC工具中 烘焙一张厚度图来获取,对于厚的物体重用正面的阴影状态显然是不行的,所以我们使用的是shadowmap和距离参数结合的方式来获取厚度。
这个优化我们同样为很多移动客户进行了定制,后面我们有案例。
我们看一下两种效果的对比。第一张图是薄的物体,可以看到它模拟树叶透光的效果。后面就是这个耳朵。我们可以看到这个厚和薄之间的区别,两个参数之间的。
再来看一下纯效率方面的优化。G-Buffer Pass,根据材质类型去标记它的stencil,这样可以减少不必要的3S pass像素的绘制,我们还标记次表面照明缓冲区,以避免在3S pass期间执行逐像素模板测试,还实现了一个基本的LOD的系统。对采样分布进行随机逐像素的旋转。
最后我们再来看看整个的效率表现。在PS4上,我们限制在每个像素21个采样,使用CS进行卷积合并diffuse和specular lighting buffers,GPU整个耗时在1.16毫秒左右。由于今天时间有限,所以我就先讲这么多,关于皮肤这块。有兴趣的同学可以后面再交流。