别再死磕光线追踪了!用Unity Shader Graph 5分钟搞定皮肤/玉石SSS次表面散射效果
用Shader Graph零代码实现次表面散射:5分钟打造皮肤与玉石质感
次表面散射(Subsurface Scattering,简称SSS)是光线穿透半透明材质后发生散射的物理现象,它让皮肤呈现血色、玉石展现温润感、蜡烛散发柔和光晕。传统实现需要复杂的光线追踪或繁琐的数学公式,而本文将展示如何完全通过可视化节点在Unity中快速搭建SSS效果。
1. 核心原理与Shader Graph设计思路
次表面散射的本质是光线在材质内部的"旅行"过程。当光线射入皮肤或玉石时,部分光子会在材质内部多次反弹后从不同位置射出,形成特有的光晕效果。专业渲染器通过蒙特卡洛模拟计算光子路径,而实时渲染则需要简化模型。
Shader Graph实现三大简化策略:
- 背光增强:模拟光线穿透薄区域(如耳廓)的透光现象
- 颜色偏移:短波光(蓝紫)易被吸收,长波光(红黄)散射更远
- 边缘柔化:明暗交界处添加渐变过渡,避免生硬分界
提示:移动端推荐使用厚度图方案,PC端可尝试屏幕空间模糊以获得更精确效果
2. 厚度图方案实战配置
2.1 准备厚度贴图
厚度图存储模型各部位的相对厚度信息,白色表示厚区域,黑色对应薄区域。制作方法:
- Blender烘焙:
# 在Blender的Shader Editor中连接节点: [Geometry Node] → [Pointiness] → [ColorRamp] → [Image Texture Bake] - Substance Painter输出:
- 使用"Thickness"生成器
- 导出时选择R8单通道格式
2.2 Shader Graph节点搭建
关键节点连接流程:
| 节点类型 | 参数设置 | 功能说明 |
|---|---|---|
| Dot Product | A: ViewDir, B: -LightDir | 计算基础背光强度 |
| Power | Exponent: 3-5 | 控制光晕衰减曲线 |
| Sample Texture 2D | UV: 模型UV, Texture: 厚度图 | 读取局部厚度数据 |
| Multiply | A: 背光强度, B: 厚度值 | 合成最终散射强度 |
// 等效代码逻辑(仅示意,实际用节点实现) float sss = pow(saturate(dot(viewDir, -lightDir)), 4.0) * thickness;2.3 参数调试技巧
- 颜色控制:在Multiply后添加Color节点,设置为粉红色(皮肤)或青白色(玉石)
- 边缘锐度:调整Power节点的指数值,越大则光晕范围越小
- 性能优化:关闭厚度图的mipmap生成,改用Bilinear过滤
3. 预积分LUT方案进阶实现
3.1 创建查找纹理
预积分LUT(Lookup Texture)将复杂计算提前烘焙到2D纹理中:
| 纹理坐标 | 物理含义 | 数值范围 |
|---|---|---|
| U轴 | N·L点积 | [-1, 1] → [0, 1] |
| V轴 | 表面曲率 | 低曲率→0,高曲率→1 |
LUT制作步骤:
- 在PS中创建512x512纹理
- 横向渐变:左蓝右红
- 纵向叠加:顶部增加绿色通道
3.2 动态曲率计算
实时曲率通过法线变化率估算:
[Normal Vector] → [DDX] → [DDY] → [Length] → [Saturate]注意:移动端可改用预烘焙的曲率贴图替代实时计算
3.3 节点网络优化
- 纹理采样:LUT设置为Clamp寻址模式,Filter Mode设为Bilinear
- 混合策略:用Lerp节点混合传统漫反射和SSS效果
- 性能对比:
- 厚度图方案:1次纹理采样 + 2次数学运算
- LUT方案:2次纹理采样 + 3次数学运算
4. 跨平台效果调优策略
4.1 移动端适配方案
Android/iOS最佳实践:
- 使用Half精度(Shader Graph的Precision设置为Half)
- 合并厚度图与曲率图到RGBA两个通道
- 禁用实时阴影接收(用烘焙阴影替代)
参数推荐值:
- 背光强度:0.3-0.5 - 散射范围:0.2-0.4 - 颜色饱和度:皮肤(1.2,0.8,0.8),玉石(0.9,1.1,1.3)4.2 PC端增强技巧
- 添加屏幕空间模糊后处理(需配合Stencil缓冲)
- 结合深度图实现动态厚度计算
- 使用双面渲染(Cull Off)提升边缘透光感
4.3 性能监测指标
通过Frame Debugger观察:
- Overdraw:控制在1.5以下
- Shader复杂度:ALUs不超过50
- 带宽占用:纹理采样不超过4次
5. 材质实例:皮肤与玉石对比实现
5.1 人类皮肤特征还原
三层结构模拟:
- 表皮层:高光反射较强(Specular 0.3-0.5)
- 真皮层:主导次表面散射(RGB(255,220,200))
- 皮下组织:影响厚度分布(脸颊薄、鼻梁厚)
特殊处理:
- 耳廓区域单独标记厚度
- 添加汗毛高光(Anisotropic节点)
- 结合Micro Normal贴图增强细节
5.2 玉石材质特性表现
关键参数:
- 折射率(IOR): 1.6-1.7 - 散射系数: RGB(0.8,1.2,1.5) - 密度衰减: 指数曲线控制效果增强:
- 添加边缘色散(Chromatic Aberration)
- 结合环境贴图反射
- 使用顶点动画模拟内部纹理流动
在最近的角色项目中,将厚度图方案应用到手游角色皮肤,在骁龙865设备上保持60fps的同时,获得了接近主机级的透光效果。调试中发现将背光计算的Power值从4降到3,能在中低端设备上获得更好的性能与视觉平衡。
