次表面散射Subsurface Scattering(SSS)

一. 概述

前面BRDF,冯氏光照方程考虑的是光在物体表面的相互作用,讨论的是在物体表面光线如何被反射,以及被发射的量等问题。而实际上光线除了被反射,还有一部分是穿透表面进入物体内部在材质里发生散射。光线在物体材质内部的散射往往使得整体效果更加柔和,这种显现被称作次表面散射。对于皮肤在明暗的衔接处散射往往引起微弱的倾向红色的颜色偏移。背光效果图如下:

无散射效果图 SSS效果图

      次表面散射Subsurface Scattering(SSS)_第1张图片       次表面散射Subsurface Scattering(SSS)_第2张图片

明显可以看出经过次表面反射计算的效果更加真实。


二. 实现方式


对SSS的实现方式有很多,在此只介绍一种简单的用深度映射模拟吸收的方式。该方法的基本思想是:光在材质中的传播的越远,它的散射和吸收的越厉害。为模拟此效果我们需要计算光在材质中传播距离。计算传播距离的方式则是通过深度图,具体步骤如下:

1. 以光源为视点渲染整个场景,存储光源到物体对象的最近距离。

2. 在相机空间绘制对象时,先将顶点数据转化到光源视点空间,由光源深度图读出深度信息与该顶点在光源空间距离灯光的距离(深度)做差,求出光在物体对象中的传播距离如下图:

次表面散射Subsurface Scattering(SSS)_第3张图片

注: 在灯光空间绘制深度图时,记录Object对象距离灯光的最近距离如di1 di2(Object 上半部分)。 在视图空间绘制时do1 do2时,先将do1 do2转化到灯光空间(转化到灯光空间后 di2 do2将会有相同的x y值 zi2 zo2为其在灯光空间的深度信息也就是到灯光的距离)用两者在灯光空间深度值做差可以计算出光在该点传播的距离。

3. 由距离s可以通过美术给的一张一维颜色索引取得颜色值,也可以通过指数e(-s)*lightColor计算最终颜色。

你可能感兴趣的:(图形学理论,游戏编程)