F / L面部光照研究EXPERIMENTAL RENDERING NOTES返回研究展示 ↗
研究背景 / 先理解问题SHAPE BEFORE SHADING

关于一张脸上的明暗

为什么二次元的脸,
需要专门设计阴影?

卡通面部的明暗是一种造型语言。
我们希望它能随来光变化,
也希望它保留清晰、简洁的形状。

真实的局部起伏,
未必是想要的阴影轮廓。

常规漫反射根据表面法线和来光方向计算明暗。半兰伯特把这个响应重新映射,但仍然依赖局部法线:鼻梁、嘴角、脸颊的细小起伏,都可能改变明暗分界。

再把连续照度分成亮、暗两档时,这些变化可能变成零碎色块。对追求大块、平顺阴影的二次元面部来说,几何上的合理,不一定等于画面上的理想。

这是造型目标与几何响应的差异,不能简单归结为“模型坏了”。修改法线、专门设计面部阴影等,都是可选路线。

网络资料中的角色面部,脸颊和嘴部出现复杂的块状阴影
文献图例 / 局部法线与面部明暗配图引自鸟笼的知乎文章 [1],保留原图“@刻学徒”水印。原文提及《GUILTY GEAR Xrd -SIGN-》技术解说;本图不是本项目实验结果。
设计目标

让阴影跟随光照,让轮廓服从角色的画风。

先设计明暗,再把它存进 SDF。

这里讨论用于面部明暗控制的 SDF 贴图,
不是用于光线求交的三维 SDF 几何体。

A

准备几个代表来光方向的黑白设计稿

先决定不同方向下,额头、鼻梁与脸颊应该怎样分区。黑白图记录的是希望得到的阴影形状,而不是人物的颜色贴图。

八张不同来光方向的面部黑白阴影设计图,按 a 至 h 排列
文献图例 / 多个方向的目标明暗引自知乎 [1];原图水印 @刻学徒。图中 a–h 是设计样本,不代表本项目的角度标签。
B

把离散设计合成为连续控制纹理

通过距离场等方式在不同设计之间建立连续变化,得到一张灰度控制图。运行时可以从中选出与来光方向对应的明暗分界。[1]

灰度值是控制信号,不是最终肤色,也不是场景真实照度。实际面部资产的编码方式可能不同,应以对应生成器与着色器为准。

由多方向设计得到的连续灰度面部阴影控制图
合成控制图,引自知乎 [1]。保留原图水印,点击可查看原图。
C

渲染时读贴图,结合来光方向得到明暗

头部局部来光方向→确定左右侧与阈值→按 UV 采样 SDF→阈值/软过渡→明暗遮罩

公开实现 ChiliMilk/URP_Toon 会读取预计算的 SDF 阴影贴图,按来光侧调整采样,再结合方向量、阈值与羽化参数求明暗。它的说明还要求对称的面部 UV。[2]

URP Toon 材质面板,包含 FaceSDFShadow、SDF 贴图槽、阴影阈值和羽化控制
原作者材质面板:可以看到 SDF 贴图输入、Shadow1Step 与 Shadow1Feather。ChiliMilk/URP_Toon [2]

把阴影设计学成边界,
把真实照明留给光线追踪。

沿用 SDF 提供的造型目标,
改变运行时获取主明暗分布的方式。

传统 / TEXTURE-DRIVEN

查一张设计好的控制图

  1. 准备多方向明暗设计 → SDF 控制贴图
  2. 运行来光方向 + UV 采样 → 明暗遮罩
  3. 着色由着色器决定明暗区的颜色与照明

主要控制数据驻留在贴图中。

本方法 / LIGHT-DRIVEN PREDICTION

由来光预测一条平滑边界

  1. 训练SDF 目标边界 + 采样来光 → 回归模型
  2. 预测新来光统计 → 24 个系数 → 主明暗遮罩
  3. 合成遮罩控制亮度 + Cycles 提供照明颜色

主边界由模型参数与来光统计重建。

01

主阴影不必再查 SDF 图

当前预测函数只读取来光特征和模型参数,不在推理时查询原 SDF 贴图。重建边界后,可以在待着色的图像采样位置直接求出遮罩;无需先烘焙一张新的主阴影纹理才能定义明暗。

02

继续利用真实的光线追踪

Cycles 负责直接光、遮挡和间接漫反射。脸旁红板产生的局部红色来自真实反弹;风格化阶段调整照明亮度,保留去噪后的逐点 RGB 比例,再结合人物贴图。

03

平滑约束控制阴影形状

模型输出少量样条系数,每一行只生成一个主分界。嘴部偶然较暗,不再自动成为孤立黑洞。边界软度与照明颜色可以分别调整。

本项目45度 Cycles 原始面部照明,包含红板的间接反射
A 原始 Cycles 光照
本项目45度原始预测边界加鼻影形成的遮罩
B 预测主边界 + 鼻影
本项目45度保留人物贴图与反射颜色的合成结果
C 保色照明合成

本项目 +45°、同一场景的三个阶段,使用未加红线校准的预测版本。上方网络图例用于解释传统方法,不是同场景的性能对照。

“无需额外阴影贴图”具体指什么?

方法层面
主边界预测可以直接产生明暗数值,不依赖运行时采样原始 SDF 阴影贴图;仍需要少量辅助光照采样,不能称为零额外计算。
当前演示
为接入 Blender 合成器,现有工程仍把预测结果存为 37 帧遮罩序列。直接在渲染过程中求遮罩、完全省去序列贴图,是后续集成方向。
仍然保留
训练阶段的 SDF 监督、人物颜色贴图和独立鼻影参数。主边界使用固定相机下的图像坐标;人物与鼻影贴图仍通过 UV 读取。

传统 SDF 也可以与光线追踪结合。因此,本研究的优势是来光驱动的边界预测与保色光照合成的组合,而不是“只有这种方法能做光追”。当前操作发生在 Cycles 输出之后,尚未写入每次反弹过程;跨角色、自由视角和多光源泛化仍需验证。

继续阅读 / 方法推导从来光特征到边界系数,具体怎样求?↗

图例有出处,结论有边界。

  1. [1]
    鸟笼 · 知乎文章 ↗

    本页三张背景图与相关介绍依据用户提供的原文节选及直链。配图保留“知乎 @刻学徒”水印,不将转载文章作者等同于图片原创者。原文引用的游戏技术资料仅作为图例背景,不作为本项目对官方实现的验证。

    著作权归原作者及相应权利人所有;非商业引用注明出处,商业使用需联系权利人授权。

  2. 延伸
    MIZI · 二次元角色卡通渲染—面部篇 ↗

    由用户提供文章推荐,供进一步阅读;本页未将未核验的全文内容用作证据。

  3. [2]
    ChiliMilk / URP_Toon · 固定版本原始资料 ↗

    已读取 README 与 ToonInput.hlsl,并下载原作者 SDF 材质面板。该实现明确使用预计算阴影纹理;这里对传统流程的说明以此公开实现为例,不代表所有游戏使用完全相同的算法。

  4. 本项目
    边界预测函数与当前实现 ↗

    预测函数、已保存的 +45° 实验结果及工程约定用于说明本方法。训练覆盖、评估指标与使用限制见研究档案。