F / L面部光照研究EXPERIMENTAL RENDERING NOTES
研究手记 / 2026.10STYLIZED FACE RENDERING第 01 辑
LIGHT,
then SHAPE.

从来光统计到面部阴影形状

本次研究

用少量曲线参数预测卡通阴影边界,再与 Cycles 的真实照明合成。

关注两个问题:阴影形状能否平顺?
间接反射的颜色能否保留?

查看旋转实验 ↘
用户提供的浅海青与奶油白插画视觉参考
色彩与构图参考 01 / SEA BREEZE
图
01
+45°
同一光照
45度Cycles真实照明
A Cycles 照明 保留局部形体
45度经过人工校准并含鼻影的遮罩
B 阴影形状 预测+人工校准
45度最终面部效果
C 合成结果 只压平照明
固定角色 · 正面相机 · 单个面光源37 帧 / −90° → +90°研究从这里开始 ↓

我们如何提取出
稳定的 SDF 阴影形状?

不同来光方向下,面部需要不同的阴影设计。我们关注的是:如何从已有的 SDF 明暗中提取平顺、稳定的主边界,并让它随光照连续变化。

以 SDF 明暗作为监督,将阴影轮廓表示为少量曲线参数,再学习从来光统计到边界形状的映射。

为什么使用 SDF?阅读背景与传统做法 ↗

六种来光方向对应的二次元面部阴影设计,蓝色表示阴影区域,红色箭头标示来光方向

阴影边界是怎样算出来的?

训练时学习来光与边界的关系。
预测时用固定权重生成新的明暗形状。

悬停公式中的符号,查看含义 · 键盘 Tab 或触屏轻点也可查看

光照输入 + SDF 边界答案→RBF 特征 + 岭回归五步训练流程 · 左侧场景与训练说明,右侧主要公式
01

准备不同的光照场景

改变灯光方向、大小和强度,生成训练案例。这版用了 204 个训练案例,另外留出验证和测试案例。

N=34×2×3=204(T1)

固定人物和相机:34 个角度大小 × 左右两侧 × 3 组灯面大小、强度与采样变化。每个案例对应一组输入和答案;同一方位的三组案例共享目标边界。

02

采样实际光照,作为输入

在脸上选取一些位置,追踪光线,记录光从哪里来、贡献有多大。

把观测汇总成按光照贡献加权的平均来光方向。输入来自采样结果,不直接使用灯光的设定角度,也不使用脸型几何特征作为预测输入。

d¯=∑jejdj∑jej,θ=atan2(|d¯x|,d¯z)(T2)
φk(θ)=exp[−(θ−μk)22σ2],zk=φk−φ¯ksk(T3)

dⱼ 是采样来光方向,eⱼ 是直接照明贡献。θ 由统计方向计算,左右侧另行记录。RBF 将方向展开成 24 个特征:μₖ 为固定中心,σ = 0.4 弧度。φ̄ₖ 与 sₖ 来自训练集;极小标准差以 1 替代。最终得到标准化特征 z。

03

从 SDF 目标中提取“正确边界”

将已有 SDF 明暗显示到固定相机视角下,逐行寻找黑白分界,平滑细小、偶然的突起,再用平滑曲线压缩成24 个曲线系数。

这些系数是模型需要学习的答案,共同控制曲线形状,不分别代表 24 个具体面部部位。它们与第二步的光照输入对应同一个训练场景。

b(y)=∑k=124akBk(y)(T4)

y 是归一化图像纵坐标,b(y) 是该行边界的横向位置。Bₖ(y) 是预先固定、平滑重叠的三次 B 样条基函数;aₖ 是从 SDF 目标边界拟合的 24 个系数之一。它们共同描述整条曲线。这里 b(y) 表示边界函数,与第四步的回归偏置 b 不同。

04

训练“光照 → 曲线系数”的对应关系

将每个案例的光照输入与 24 个目标系数配成一组,训练RBF 特征 + 岭回归模型:看到这种来光方向,就输出相应的阴影边界。

减小预测系数与目标系数的误差,用正则项限制参数过大;通过验证集比较设置,选择兼顾准确度与边界平滑程度的版本。

这是关于 W、b 的凸二次优化问题,通过线性方程组求解。这里的最优针对系数拟合目标,不等于最终图像 IoU 或视觉效果的全局最优。

a^=zW+b(T5)
minW,b∑i=1N‖ziW+b−a*i‖22+λ‖W‖F2(T6)
W*=(ZTZ+λI)−1ZTA0(T7)
b*=a¯(T8)

N = 204;zᵢ ∈ ℝ²⁴ 是标准化光照特征,aᵢ* ∈ ℝ²⁴ 是目标样条系数;W ∈ ℝ²⁴ײ⁴ 与 b ∈ ℝ²⁴ 为优化变量,λ = 0.01。偏置 b 不参与正则惩罚。由于 Z 已按训练均值中心化,令 A₀ = A − 1ā,求得 W* 后,b* = ā。实际求解线性方程,不显式计算逆矩阵。W 是回归映射权重,与旧光路类别权重 γg 不同;岭正则限制参数,并非直接惩罚图像边缘。

05

用未参与训练的场景检查效果

新场景经过光照采样 → 预测 24 个系数 → 生成平滑边界 → smoothstep 柔和过渡,即可得到明暗形状。

此时不读取 SDF 作为答案,也不重新优化光路权重。之后才将明暗遮罩送入“压平照明、保留贴图和光照颜色”的渲染步骤。

用留出场景评估形状误差与阴影 IoU。原测试集曾在迭代中查看;冻结模型后另采 8 个新角度检查,未再据此调参。

a^=zW*+b*(T9)
u(v)=clip(∑k=124a^kBk(v),0,1)(T10)
m=smoothstep(−δ2,δ2,u′−u(v))(T11)

u(v) 表示第 v 行的边界横坐标,用于区分回归偏置 b;Bₖ 是固定的三次 B 样条基函数。u′ 按来光左右侧镜像,δ = 4/320,对应 320 像素图上的 4 像素艺术过渡。每行一个主分界的表示约束避免主遮罩中的独立碎块。当前固定角色、正面视角与单个水平面光源范围已验证。

训练完成后保存

映射权重 W*、偏置 b*、特征均值与标准差,以及固定的 RBF 中心、宽度和 B 样条基函数。新场景直接复用这些参数。

LIGHTING LAYERS +40°
去噪后的照明通道

在照明通道上去噪,再加入设计的阴影。贴图不参与模糊。

形状与照明,分开处理。

低饱和灰绿色环境呼应页面配色,保留 80W 主光、40W 补光与右侧发光板。背景稍作提亮,环境光与面部目标照明亮度保持不变;以下均为同一 +40° 场景的重新渲染结果。

① 两条支路,分别获得形状与照明

↓

② 对照明去噪,保留局部反射颜色

E^=Denoise(Ed+Eind)

只处理照明通道,原材质贴图不参与模糊。

↓

③ 融合鼻影,确定目标照明亮度

mnose=(1−αN)m+αN(1−m)Yt=Ydark+mnose(Ylight−Ydark)

N 为宽、高扩大 12% 后的鼻影遮罩,α 随来光角度变化;
鼻影局部明暗取反,眼眉不增加恒亮保护区域;
Ylight、Ydark 是亮暗区代表照明亮度。

↓

④ 保色亮度映射,再结合原贴图

g=Ytmax(Y(E^),ε),Lfinal=ρ⊙(gE^)

统一缩放 RGB,保留去噪后的逐点颜色比例。
亮度 Y(E) = 0.2126ER + 0.7152EG + 0.0722EB。

ρ:原材质颜色;Ê:去噪照明;ε = 10⁻⁶。采用 peach_nose_invert 版本,512×512、256 采样,Khronos PBR Neutral 显示。暗部照明亮度为参考版的 80%。仅在 Cycles 输出上做合成,不修改每次反弹;不保证能量守恒。沿用原有虹膜材质结果,未添加后续眼眉恒亮区域;无有效照明响应的点保留原始结果。

光源旋转,形状与照明同步变化。

低饱和灰绿色环境与提亮后的背景。
拖动角度,对照原始光照、SDF+鼻影与最终合成。

01 / 原始光照Cycles
+40° 原始光照
02 / SDF+鼻影局部明暗取反
+40° SDF与鼻影
03 / 最终合成保留贴图与光照颜色
+40° 最终合成
−180°−90°0°+90°+180°
+40°

73 帧,每 5° 一帧 · 512 × 512 · Cycles 256 采样。主光 80W,鼻影宽高扩大 12%,暗部照明沿用参考版的 80%;没有新增眼眉恒亮区域。此处为预渲染播放,完整旋转沿用原版边界校准与背光扩展;亮区不足 5% 时,平滑采用当前照明的 90 分位亮度估计,避免鼻影取反后变黑。

实验结果与使用范围

下面是冻结模型阶段的历史评估,
不将后续人工校准计入预测性能。

90° 阴影 IoU

0.8356 → 0.9296

旧光路权重 → 平滑边界预测
新增留出角度 · 平均 IoU

0.8654

冻结后 8 个案例 · ±43 / 83 / 103 / 133°
当前旋转演示

37 frames

−90° 至 +90° · 320 × 320 · 256 spp

已经做到 / 仍需验证

已验证 固定角色、正面相机、单个水平环绕面光源下的形状预测与光照合成。

尚未验证 新脸型、自由转头、多光源和间接光主导场景;近正面的小角度包含训练范围外推。

工程约定 当前 Blender 工程使用对应 37 帧的预计算遮罩。任意移动灯或相机后,仍需重新预测。

查看完整研究演进 +
  1. 按光路属性建立响应矩阵,优化类别权重与补光。
  2. 加入亮暗分区误差与阴影惩罚,尝试保留阴影。
  3. 改为连续软阴影,并在相机与模型交点直接计算。
  4. 预测平滑主边界,避免局部照度形成独立黑洞。
  5. 接入 Cycles 真灯光、照明去噪、鼻影与保色合成。
  6. 调整红板反射,并按红线校准 45° 边界。
FILES / 可复现资料

工程与模型文件

包含已计算的遮罩序列、真实 Cycles 灯光、
鼻影和照明合成设置。

下载 Blender 工程包 ↓解压并保留 controls 文件夹 · F12 查看最终合成