陈栋梁

材质美术:次表面散射材质教程


次表面散射材质是现实中一种非常常见的材质,如玉石、大理石、蜡烛、苹果、牛奶、皮肤,等等。这类材质的特点是:明暗交界线比较柔和,其本身并不透明,但能产生“透光”的现象。
image

本教程将通过几个例子来讲解次表面散射材质在引擎编辑器中的使用方法。下面先来欣赏几个在引擎中实时渲染的结果,并附上精彩demo:
demo传送门
image
image
image

次表面散射材质的创建

次表面散射效果是通过BackScatterMethod这个方法来实现的。首先需要在Material卷展栏中创建一个BackScatterMethod,如下图所示:
image

进入BackScatterMethod的属性面版,来到ToneMode下拉选择框:
image

ToneMode一共有三种模式:ToneMap、ToneMath0、ToneMath1。属性面版中的Omega、ScatterColor、Tone Texture三个属性分别与之对应。当选择“ToneMap”模式时,只有Tone Texture属性被激活;当选择“ToneMath0”模式时,只有Omega属性被激活;而当选择“ToneMath1”模式时,只有ScatterColor属性被激活。从性能角度考虑,我们建议尽量使用“ToneMap”模式。

接下来将分别以皮肤、玉石、蜡为例,依次讲解ToneMap、ToneMath0和ToneMath1模式的使用方法。

一、皮肤材质

首先准备好我们的人头模型,并为其设置好基本光照。此处漫反射使用了BasicDiffuseMethod。
image

然后将我们创建的BackScatterMethod拖拽到该模型对应的Material上,进入BackScatterMethod的属性面版。将ToneMode设置为ToneMap模式。在ToneMap模式下,Tone Texture是其专属的属性。在此我们需要导入如下图片作为Tone Texture:
image

这是一张专门用于皮肤透光效果的贴图。如要用于其他不同颜色的透光材质,可尝试调整上图的色相。

接下来看看CurvatureMode下拉选择框,它的作用是选择曲率信息的来源。一共有三个选择:1、CurvatureMap,曲率取自贴图;2、CurvatureColor,曲率取自顶点色的其中一个通道;3、CurvatureConst,曲率为常数。在这里无需过多地关注“曲率”的本来意义,只需知道,在这里曲率只是用来描述物体透光程度的信息即可。

首先来看看CurvatureMap模式,我们采用纯手绘贴图的方式,来指定模型哪些区域容易透光,哪些区域不容易透光。本例所使用的CurvatureMap如下图所示:
image

我们希望模型在耳朵、眼皮、鼻翼、嘴唇这些部位透更多的光,于是在贴图上画上白色,而其他区域则填充上深灰色(注意不是纯黑色,而是深灰色。纯黑色意味着完全不透光)。绘制贴图的原则是:越容易透光的区域越白,反之越黑。另外注意黑白之间的过度要平缓。
[
再来看CurvatureColor模式,曲率信息(即透光程度信息)取自顶点色的其中一个通道。这就需要我们对模型进行一些预处理:将上面这张绘制好的贴图烘焙到顶点色的其中一个通道里。贴图烘焙顶点色的详细操作方法可参看《场景美术:顶点色烘焙教程》。相比起使用CurvatureMap的方式,使用顶点色更加节省资源。如视觉效果上不产生明显缺陷,且顶点色不会被其他功能占用的话,可用该模式来取代CurvatureMap模式。

最后是CurvatureConst模式。透光程度是一个常数,即模型任意区域的透光能力都是一样的。

最后需要注意的属性是CurvatureScale。这是个整体调节透光程度的参数,范围是[0,10]。在本例中,CurvatureScale被设置成3.0。

至此,带有透光效果的皮肤材质就完成了。下面来看看有无透光效果的对比:
image

二、玉石材质

接下来通过玉石材质讲解ToneMath0模式的使用。在ToneMath0模式下,没有了Tone Texture属性,取而代之的是Omega属性。Omega属性有三个分量,依次表示R、G、B,取值范围均为[0,1]。在引擎内部,实质上是使用这三个分量,通过数学拟合的方式生成了一张Tone Texture。用数学生成Tone Texture的好处是,该贴图永远不会失真,且可以通过调节参数灵活地改变贴图的外观,以适应不同的透光材质。但该方法的缺点也是明显的,它需要在运行时实时地算出该贴图,开销比较大。

首先,把我们的玉石模型导入引擎编辑器,并设置好基本光照(漫反射部分使用BasicDiffuseMethod,高光部分使用CelSpecularMethod):
image

为该模型的Material添加BackScatterMethod,将ToneMode设置为ToneMath0。这是一块绿色的玉石,我们希望它能透出黄色的光。那么我们把Omega属性设置为(R=1.0, G=1.0, B=0.0)就可以了。这是因为R与G混合得到的就是黄色。

在调节Omega属性的时候,最好遵循一个原则:R、G、B三个分量至少有一个接近最大值,且至少有一个值较小(0.4以下)。当数值最大的两个分量不相等时,可以实现带有色调变化的透光。例如,当R=0.37, G=1.0, B=0.56时,呈现如下透光效果:
image

基本规律是:三个分量从小到大依次是R,B,G,那么从明暗交界线开始到完全背光面的颜色渐变就是(R+B+G)→(B+G)→(G),也就是白→青→绿。如果要应用到皮肤材质上,我们推荐将参数设置成R=1.0,G=0.35,B=0.25。

接下来,把CurvatureMode设置成CurvatureConst,赋予模型一个统一的透光度即可。玉石材质与皮肤材质不一样,即使不进行严格的透光度控制也不容易影响真实感。

最后把CurvatureScale设置为最大值10,至此玉石材质便完成了。下面来看看有无透光效果的对比:
image

三、蜡材质

最后通过蜡材质来讲解ToneMath1模式的使用。ToneMath1模式下,只有ScatterColor属性被激活。我们可以直接在色盘上选择透光颜色。实质上,引擎内部同样是通过数学拟合生成了一张Tone Texture。ToneMath1与ToneMath0的不同之处在于,1只能实现纯色的透光(但对大部分情况已足够),但性能开销相对于0要小一些,且参数直观。

以上面使用过的人头模型为例,先将其设置成白色,然后添加BackScatterMethod,将ScatterColor设置成橙色,CurvatureMode设为CurvatureConst ,CurvatureScale设为10:
image

这样,一个蜡人便完成了。下面看看有无透光效果的对比:
image

PS:

① 本文为次表面散射材质的使用教程;
② 如果有疑问或者错误不足之处,请和TA组联系!欢迎交流,我们会及时补充纠正!