次表面散射 SSS:皮肤渲染核心技术与实现
次表面散射是什么
次表面散射(Subsurface Scattering,简称SSS)是光线射入半透明物体后,在内部发生多次散射,最终从物体表面不同位置出射的现象。与简单的表面反射不同,SSS使得光线能够穿透物体表面,在内部传播一段距离,导致物体呈现出柔和、通透的质感。最典型的例子是人体皮肤:当光线照射到皮肤时,一部分光进入表皮和真皮层,被血液和组织散射,使皮肤呈现红润的半透明效果。其他如蜡烛、玉石、牛奶、葡萄等材质也表现出明显的SSS特性。在计算机图形学中,模拟SSS对于创建逼真的虚拟角色和生物至关重要。
物理原理与光学特性
SSS的物理基础是光在参与介质(participating media)中的传输。当光进入半透明材质,与介质中的粒子(如皮肤中的细胞、血液)发生散射和吸收。散射系数和吸收系数决定了光的传播路径和衰减。对于皮肤,红光穿透深度较大,而蓝绿光被吸收较多,因此从皮肤透出的光偏红,形成标志性的暖色半透明感。
实时渲染中精确模拟体积散射需要昂贵的路径追踪,因此通常使用近似模型。常见方法包括:
- **纹理空间扩散(Texture Space Diffusion)**:将模型展开到纹理空间,在纹理空间进行模糊,再映射回三维表面。该方法由NVIDIA的Demo团队推广,适合实时应用。
- **屏幕空间模糊(Screen Space Blur)**:渲染场景后,对特定材质的对象在屏幕空间进行深度感知的模糊,高效但物理准确性较低。
- **预积分皮肤着色(Pre-Integrated Skin Shading)**:使用查找表存储不同曲率和光照角度下的散射结果,结合法线贴图模拟细节散射。
- **薄表面透射(Thin Surface Transmission)**:对于薄物体(如耳朵、树叶),计算光线从背面穿透的光照,添加半透明效果。
实时渲染实现要点
在游戏引擎(如Unity、Unreal)中,实现高质量的SSS通常结合多种技术:
- **扩散剖面(Diffusion Profile)**:定义不同颜色通道的散射距离和强度。例如皮肤通常使用红色通道散射距离较长,蓝色通道较短。
- **屏幕空间次表面散射**:在延迟渲染管线中,对皮肤材质的像素在屏幕空间进行多次模糊,根据深度和法线加权,模拟近距离散射。
- **纹理空间扩散**:需要模型有良好的UV展开,且避免UV重叠。将光照结果烘焙到纹理空间,执行高斯模糊,再采样回表面。
- **透射项(Transmission)**:对于耳朵、鼻孔等薄壁区域,计算背光强度,乘以透射颜色,添加到最终着色。
- **散射颜色(Scatter Color)**:控制内部散射的光的颜色,皮肤通常偏红。
- **散射半径/强度(Scatter Radius/Intensity)**:决定光线在内部传播的距离和衰减,影响材质的通透感。
- **透射颜色(Transmission Color)**:光线穿过薄壁后的颜色。
- **纹理权重(Texture Weight)**:控制细节法线对SSS的影响,避免模糊细节。
- **数字人类**:电影、游戏角色皮肤,追求照片真实感。
- **蜡像、玉石、食物**:增强材质的半透明质感。
- **植被**:叶片薄壁透光,模拟阳光穿透叶片的效果。
- **过度散射导致材质显得浑浊**:需平衡散射强度和模糊半径。
- **UV接缝处出现不连续**:纹理空间扩散需处理UV边界。
- **性能消耗过高**:采用降采样、限制模糊半径或使用预积分技术。
实现时需注意:SSS应在线性空间计算,确保能量守恒;散射半径需根据世界空间尺度调整;与PBR材质结合时,需在漫反射项中加入SSS分量。
参数调优与艺术指导
SSS效果高度依赖艺术参数调整,常用参数包括:
调优时需参考真实材质:皮肤散射半径在几毫米到几厘米,且红色通道散射远于蓝色。同时注意性能:屏幕空间模糊可通过降采样减少开销,纹理空间扩散可预计算部分结果。
应用场景与常见问题
SSS广泛应用于:
常见问题包括:
掌握SSS技术,能显著提升角色和有机材质的真实感,是实时渲染进阶的重要环节。
常见问题
次表面散射和透明材质有什么区别?
次表面散射是光进入半透明材质内部散射后出射,导致光在物体内部传播;而透明材质主要涉及透射和折射,光线直接穿过,内部散射较弱。SSS材质如皮肤、蜡,透明材质如玻璃、水。
如何在Unity中实现皮肤SSS?
Unity中可使用HDRP的Subsurface Scattering材质,或使用自定义Shader实现屏幕空间模糊或纹理空间扩散。需注意在线性空间下调整散射剖面参数。
SSS和PBR材质如何结合?
在PBR框架中,SSS通常作为漫反射项的一部分。可以将漫反射光照结果分离出需要散射的部分,应用扩散剖面模糊,再与镜面反射项相加,保持能量守恒。
移动端实时渲染能支持SSS吗?
可以,但需使用轻量级近似,如预积分皮肤着色或简单的屏幕空间模糊,并在低分辨率下执行。需权衡效果与性能。
为什么皮肤渲染中红光散射更明显?
皮肤中的血液和黑色素对蓝绿光吸收较强,而对红光吸收较弱,因此红光穿透深度更大,散射出皮肤的比例更高,使皮肤呈现暖红色调。