2025年3月18日

Evergine 中的次表面散射 (SSS)

简介

Evergine 已集成对次表面散射 (SSS) 解决方案的支持,这是实现照片级真实感材质的重要特性。这将显著提升对复杂材质(如皮肤、蜡、大理石及其他光线穿透并在表面下散射后透出的半透明表面)的表现力。

什么是 SSS?

图 1 不同的半透明材质(皮肤、蜡和树叶)

次表面散射 (SSS) 是一种解释光线与半透明或部分透明材质交互方式的机制。与仅考虑表面反射的标准着色模型不同,SSS 考虑了光线如何进入材质、在其内部反弹并从不同点射出的过程。这种效果对于捕捉有机和半透明物体特有的柔和、漫射光晕至关重要,使其看起来更加逼真。

图 2 标准表面与 SSS 表面在光线行为上的差异。

Evergine 实时实现

目前,还无法实时渲染物理精确的 SSS。不过,Evergine 使用了一种优化的 SSS 解决方案,在性能和真实感之间取得了平衡。我们借鉴了 Jorge Jimenez 创建的解决方案,详见这篇文章。

为此,我们在 Evergine 中创建了一个新的 SSSEffect,并将 SSS 渲染分为两个不同的部分:

透射(半透明)

图 3 耳朵处特有的皮肤透射现象。

透射是指光线穿过半透明物体的现象,常见于耳朵和鼻孔等区域。

这在新的 SSSEffect 中实现,利用了灯光的阴影贴图。对于每个像素,我们计算渲染像素与阴影贴图深度之间的距离。这有助于我们了解该点表面的厚度,从而计算出有多少光线可以穿透。

下图说明了这些概念:

图 4 点 z1 和 z2 被投影到灯光的阴影贴图中,使我们能够计算两点的深度。

为了完善此效果,我们设置了距离限制,并使用渐变函数为光线着色。

漫射模糊

该效果依赖于高效的 Compute Shader (SSSBlur),它利用扩散配置文件(Diffusion Profile)在屏幕空间中应用漫反射模糊,从而呈现出丰富的色彩效果。它非常适合柔化皮肤细节并模拟光线散射。

为实现此效果,SSSEffect 会根据着色器参数计算模糊效果的强度,并将其存储在 GBufferPass 的 Distortion 附件(具体为 B 通道)中。随后,DefaultPostprocessing Graph 会使用该纹理并执行两个 SSSBlur 渲染阶段(水平和垂直 Pass),结合法线纹理、深度和相机视场角(FOV)生成最终结果。

图 5 应用两种渲染技术后的最终结果。

在项目中创建 SSS 材质

为材质添加 SSS 属性非常简单,只需按照以下说明操作(在 Evergine Studio 中):

  • 打开一个材质或创建一个新材质。选中它以启动材质编辑器。
  • 点击 FX 组合框,打开项目中可用效果的列表。
  • 选择 SSSEffect。这将保留之前 StandardEffect 的参数。
  • 使用以下参数自定义您的材质:
    • SSS Scatter:(默认 0.045) 定义 SSS 效果的“宽度”,即光线在表面下可散射的最大距离。
    • SSS Intensity:(默认 0.1) 控制效果的强度。
    • SSS Bias:(默认 0.003) 调整计算透射时的收缩距离,有助于避免伪影(类似于阴影贴图中的深度偏移)。
    • SSS Translucency Color:(默认 D05749FF)透射效果的颜色。
    • SSS Translucency Texture: 用于调整模型不同区域半透明颜色的颜色纹理。
    • SSS Scatter Texture:对 SSS Scatter 参数应用乘法因子,用于表现表面厚度的变化。
  • 下一步是在场景中添加一个后处理图实体。
  • 选中后处理图(Postprocessing Graph)实体。在 SSS 选项卡中,勾选 Enabled 复选框。这将启用 SSS 漫反射模糊效果。
  • 调整其参数:
    • 质量:设置每通道的模糊采样数。有 3 个选项:
      • SSS_QUALITY_OFF
      • SSS_QUALITY_1
      • SSS_QUALITY_2
    • SSS Width Factor:(默认值为 0.075)材质中 SSS Scatter 参数的校正因子。

配置好材质和后处理参数后,您就能获得像这只漂亮的手一样令人印象深刻的效果。

总之,SSS 的实现是我们朝着创建逼真、能与用户互动且栩栩如生的角色和化身这一目标迈出的又一步。敬请期待更多更新!

Antonio avila
作者
Antonio Ávila
Plain Concepts Research