次表面预设类型着色模型

渲染逼真人体皮肤的能力,对于任何现代电子游戏引擎来说都不可或缺。为了满足此需求,虚幻引擎 4 (UE4) 现在提供了一种专门用于皮肤或蜡状表面的明暗处理方法,称为 次表面预设类型。 次表面预设类型着色模型具有与次表面着色模型类似的属性,其关键区别在于渲染方式有所不同。 次表面预设类型使用基于屏幕空间的渲染方法,因为这有助于更好地显示人体皮肤上的微妙次表面效果,而反向散射是仅在少数情况(例如,耳朵)下才会出现的次级效果。 以下文档将阐述什么是次表面预设类型以及如何在工作中使用它们。

不使用次表面预设类型

不使用次表面预设类型

使用次表面预设类型

使用次表面预设类型

特别感谢 Lee Perry-Smith 和他的公司 Infinite Realities 提供 3D 扫描头部模型及协助。

什么是次表面预设类型

次表面散射轮廓存储关于次表面散射渲染方式的信息。 它可以像任何其他 Actor 一样创建、共享并保存在 内容浏览器 中。 次表面散射轮廓通过存储美工驱动的数据来工作,这些数据与次表面中应该散射的光线距离、次表面颜色以及光线退出对象后具有的衰减颜色相关。 然后,可以将此数据应用于次表面材质,以影响次表面的外观。 您也可以采用交互方式来调整次表面预设类型,这表示您无需重新编译材质即可看到编辑结果。

启用、创建和使用次表面预设类型

要在某个材质中使用次表面预设类型,您必须先在该材质的 细节(Details)面板中将 着色模型(Shading Model)设置为 次表面预设类型(Subsurface Profile),从而使该材质能够使用次表面预设类型。 通过在 次表面预设类型(Subsurface Profile)输入中输入另一个次表面预设类型,您可覆盖用于此材质的次表面预设类型。

次表面预设类型的默认设置接近于白种人皮肤。但请注意,这只是呈现栩栩如生的皮肤所需的要素之一。请始终确保纹理的底色适合于次表面散射轮廓。

启用次表面预设类型

另外,也可以在材质实例中覆盖次表面预设类型。为此,您需要先打开要更改的材质实例。 然后,在该材质实例的 细节(Details)部分中启用 覆盖次表面预设类型(Override Subsurface Profile),接着在 次表面预设类型(Subsurface Profile)输入中提供要使用的次表面预设类型。

6.png

要创建次表面预设类型,请先在 内容浏览器右键单击。然后,选择 材质与纹理(Materials & Textures)选项,并选择 次表面预设类型(Subsurface Profile)选项。

创建次表面预设类型

如果未指定任何次表面预设类型,那么它将使用默认的次表面预设类型,即白种人皮肤。

内容浏览器 中,使用 鼠标左键双击 次表面预设类型可将其打开,然后进行编辑。 打开后,您可调整次表面散射轮廓的各个属性,方法如下:使用键盘输入数值,或使用 鼠标左键单击 颜色条以显示取色器。

调整次表面预设类型

  • 散射半径(Scatter Radius):执行散射的距离(采用世界空间单位)。

  • 次表面颜色(Subsurface Color):次表面颜色可用作次表面效果的权重。黑色表示不会发生次表面散射。 白色表示所有光线都进入材质并向四周散射。非灰阶值可以对进入表面的 颜色成分进行更多控制,从而产生外观更加复杂的明暗处理。

  • 衰减颜色(Falloff Color):衰减颜色用于定义光线进入材质后的材质散射颜色。 如果您希望在看到散射的区域实现更加复杂的明暗变化,那么应该避免在此处使用鲜艳的颜色。

请记住,整个计算是节能的,因此无法通过散射创建更多光线(与旧/其他次表面方法不同)。

材质输入通道

“屏幕空间”次表面明暗处理轮廓与“照亮”明暗处理模式没有很大的区别,它们之间的主要区别在于“金属色”(Metallic)输入的用途已改变,不可使用。

底色(Base Color)输入:“底色”(Base Color)输入照例用于漫射照明。因为“屏幕空间”次表面散射不应该更改颜色或亮度,而仅仅将光线重新分布到邻近像素,所以没有额外的次表面散射颜色。 因此,如果某个材质应该以特定颜色散射,那么需要将该颜色表示为底色的组成部分。 底色应该是最终颜色,就像是从无法区分散射与漫射光线的遥远距离观察材质一样。

人体皮肤可看作薄薄的苍白色层,其表面下方是更有活力的红色,这就是默认颜色的外观。人体皮肤的可见散射距离大概是 1.2 厘米,这是次表面预设类型的默认值。

金属色(Metallic)输入:使用次表面预设类型时,“金属色”(Metallic)输入通道不可用,这是因为“金属色”(Metallic)输入的 GBuffer 空间的用途已改变,无法容纳次表面预设类型数据。

“不透明度”(Opacity)输入:“不透明度”(Opacity)输入通道用来屏蔽次表面散射的影响。 其工作方式为:使用 0 到 1 范围内的值来支持在次表面散射强度的不同区域之间平滑过渡。 例如,如果将值 0 输入到“不透明度”(Opacity)输入,那么将禁用次表面散射。 输入值 1 将显示次表面散射的整个范围。 为了更好地控制次表面散射的加强或减弱,最好使用蒙版纹理。
蒙版纹理中值接近于 1(即,白色)的区域将具有最强的次表面散射效果,而接近于 0(即,黑色)的区域的效果不明显。 调整次表面颜色有助于在区域过暗时进行补偿,请记住,使用较亮的颜色将导致更多次表面散射。

在这里,您可以看到如何使用蒙版来使用一个材质渲染两种表面类型。请注意,过渡比较柔和,并且不限于三角形边界。

技术细节

目前,次表面散射轮廓着色模型与“照亮”区别不大(朗伯漫射,GGX 镜面反射,无金属色)。 大部分魔法在计算所有光线之后的后处理过程中发生。

次表面散射轮廓基于 Jorge Jimenez 的工作。请确保查阅他的网页,以获得有关如何使 3D 图像更加逼真的许多有用提示。

我们将非镜面反射(并非依赖于视图)的光线影响分隔开,以便在次表面材质上支持镜面反射并向下采样,从而提高性能。 与高斯模糊类似,我们使用两遍(假定内核可分离)后处理过程来过滤图像。 过滤内核依赖于次表面散射轮廓,后者存储在 GBuffer 中(每个场景最多 255 个活动轮廓)。 此内核具有彩色权重以及特定的取样位置,它们在轮廓中可进行比例调整(以每厘米单位数定义)。 在最终步骤中,我们将散射光线的影响与完整的解析图像进行重新组合。为了将依赖于视图的光线与并非依赖于视图的光线分隔开,我们在场景颜色阿尔法通道中存储一个加权项。 这种近似法需要 64 位的渲染目标(请参阅 r.SceneColorFormat),并且适用于大部分情况。

它会成功地剔除镜面反射,但对于这些镜面反射像素,您将获得更加去饱和度且并非依赖于视图的颜色。您可以通过将两个 32 位渲染目标用于所有照明通道加以改善。它们具有相同的存储带宽,但在某些硬件上,速度可能较慢。这可能是我们想要更改的情况(已增加代码复杂性)。

在以下示例中,我们在应用模糊之前去除了镜面反射。请注意,在最后的图像(最右边的图像)中,镜面反射清晰而平滑。这就是我们想要实现的效果。

在以下示例中,我们在应用模糊之前未去除镜面反射。请注意,在最后的图像(最右边的图像)中,镜面反射显得暗沉并且有点拉伸。这不是渲染此效果的正确方法。

比例调整和控制台命令

您可使用一些比例调整和性能控制台命令,来帮助在高品质视觉效果与更好的性能之间进行良好平衡。

r.SSS.Scale:允许禁用后处理过程或调整效果,以便快速加以试验。

r.SSS.SampleSet:允许减少所使用的样本,以加快效果的运行速度。但是,这意味着效果质量欠佳或产生渲染失真。

下图显示系统的更多一些内部信息。您可使用 ShowFlag.VisualizeSSS 1 来启用此视图。

虽然次表面散射轮廓着色模型在渲染皮肤方面取得很大进步,但在处理能力方面还是有所局限。 请注意,随着此系统变得越来越完美,此列表可能会有变化。

  • 此功能在非延迟(移动)渲染模式下无法工作。

  • 设置较大的屏幕散射半径会导致在极端照明条件下显示带状失真。

  • 目前,没有光线反向散射。

  • 目前,当 SSS 材质被非 SSS 材质遮挡时,会出现灰色轮廓。

特别鸣谢

特别感谢 Lee Perry-Smith 和他的公司 Infinite Realities 提供头部模型及协助。 另外,特别感谢 Jorge Jimenez 发布他的实现,因为此功能以他的工作成果为基础。