Journal

Auto Hair Card Extraction for Smooth Hair with Differentiable Rendering

Zhongtian Zheng, Tao Huang, Haozhe Su, Xueqi Ma, Yuefan Shen, Tongtong Wang, Yin Yang, Xifeng Gao, Zherong Pan, Kui Wu

LIGHTSPEED; University of Utah

一句话总结

本文提出首个自动化管线,把 strand 级头发模型转换为受数量预算限制的 hair card 模型:核心是一种把每根发丝在纹理空间编码为 2D 投影曲线的可微表示,从而用可微渲染做端到端优化,在极少数量的卡片与纹理下仍保留发型外观。

研究背景

在电影、游戏与 VR 中,逼真的头发对角色可信度至关重要,但一个人头皮约有 10 万到 15 万根发丝。strand 级头发能真实表达动态与视觉细节,但计算昂贵;hair card(贴有纹理的扁平四边形条带,近似发簇外观)因简单高效,长期是实时应用与低性能平台(移动游戏、NPC、远距离 LoD)的主流表示。

问题在于:目前工业界高度依赖美术手工制作 hair card——先制作若干含不同发丝数量与卷曲度的卡片纹理,再手动从头皮向外拉伸每张卡片,调节长度、宽度与朝向。在卡片数与纹理数受严格预算约束下,手工制作一个既省资源又高保真的低分辨率 hair card 模型极其费时,往往需要资深美术数天到数周。

尽管已有大量工作从单视图、多视图或 CT 重建 strand 级头发,却缺少把这些 strand 转成实时可用 hair card 的方法。Unreal Engine 虽提供了自动卡片生成工具,但在卡片预算受限时质量常不足以用于生产。把 strand 转 card 面临的核心挑战包括:卡片数与纹理尺寸的严格预算、发型高度不规则且形态多变,难以在简化的同时保留细节。

方法

输入是 strand 头发模型 \(H=\{S_i\}\)(每根发丝为等距采样的分段线性曲线)加头部网格 \(M_{head}\);输出是由 \(n_c\) 张卡片与 \(n_t\) 张纹理组成的 hair card 模型 \(M_{output}\),通常 \(n_c \gg n_t\)(多张卡片共享纹理以省纹理空间)。整体管线分为聚类、卡片几何初始化、显式纹理表示、纹理约减、联合优化五步。

发丝聚类。 采用形状相似度度量 \(\gamma(S_i,S_j)=\sum_{k=1}^{n_s}\lVert s_{i,k}-s_{j,k}\rVert_2^2/n_s\) 量化两根发丝的逐样本距离,用 k-means 把 \(H\) 分成 \(n_c\) 个簇,每簇中心为均值发丝 \(\bar S_k\),一个簇对应一张卡片。

卡片几何初始化。 沿均值发丝用数值稳定的 Bishop 标架构建每个采样点的切线、法线、副法线标架(相比 Frenet-Serret 避免奇异配置)。沿副法线方向取簇内到中心样本的最大距离作为半宽 \(W_{k,j}=\max_{S_i\in G_k}\lvert (s_{i,j}-\bar s_{k,j})\cdot b_{k,j}\rvert\),连接 \(\bar s_{k,j}\pm W_{k,j}b_{k,j}\) 形成四边形条带,再下采样到 \(n_q\) 个四边形。由于 Bishop 标架依赖根部法线 \(n_{k,1}\) 作为边界条件,而它决定初始质量,作者通过最小化投影误差 \(L_{proj}=\sum \lVert s^{\Gamma}_{i,j}-s_{i,j}\rVert\) 来优化它;由于投影算子不可微,而 \(n_{k,1}\) 在与切线正交的约束下落在一个 3D 圆上,作者沿该圆均匀采样候选方向并取误差最小者。

显式 hair card 纹理。 这是本文核心创新。传统把发丝光栅化进 RGB 纹理会带来严重走样与噪声梯度。作者改为把每根发丝投影到卡片条带上,记录其 2D uv 坐标,使 3D 位置可重建为

\[s_{i,j}=u_{i,j}p^0_{i,j}+v_{i,j}p^1_{i,j}+(1-u_{i,j}-v_{i,j})p^2_{i,j}+z\,n^{\star}_{i,j}\]

其中 \(p^{\bullet}_{i,j}\) 为所在三角面顶点,\(n^{\star}_{i,j}\) 为面法线,\(z\) 为沿法线的位移。于是纹理被显式表示为 uv 空间中的一组点 \(\{s^{uv}_{i,j}\}\)。该表示有两大优点:既可端到端可微渲染、又无 RGB 走样,且可通过光栅化转回 RGB 图。为避免卡片几何导致的切线畸变,切线被解耦并存为逐顶点 3D 属性 \(\{t^{3D}_{i,j}\}\)。

纹理约减。 为共享纹理、提升内存与运行效率,用户可给定目标纹理数 \(n_t\),把 uv 空间发丝光栅化为 RGB 后计算两两 LPIPS,再做一轮 k-means,每簇只保留最接近中心的纹理供簇内所有卡片复用。

联合优化。 最后用可微渲染对卡片位置 \(p^{\pm}_{k,j}\)、纹理坐标 \(s^{uv}_{i,j}\)、切线 \(t^{3D}_{i,j}\)、逐发丝宽度 \(w_i\) 做梯度优化,目标为

\[\arg\min \sum_v \lambda_v L_v + \sum_g \lambda_g L_g\]

视觉损失包含切线损失、深度损失(在所有视角上按 MSE 匹配对应通道),以及匹配轮廓的 dice 损失 \(L_{dice}=\int_{S^2}(1-D(\cdot))d\omega\),其中 \(D(A,B)=2\lvert A\cap B\rvert/(\lvert A\rvert+\lvert B\rvert)\) 为 Sørensen-Dice 系数。因逐段渲染完整 BCSDF 光照不可行,优化只匹配切线(着色)与深度(沿视线位置)通道而非最终外观。几何正则含匹配损失 \(L_{match}\)(鼓励几何切线与优化切线一致)与碰撞损失 \(L_{collision}=\sum\lVert\min(0,\mathrm{SDF}(p^{\bullet}_{k,j},M_{head}))\rVert^2\)(防卡片穿透头部)。优化后再光栅化生成切线、深度、alpha 贴图,并烘焙环境光遮蔽(AO)贴图。

两项扩展。 Crossed cards:为每个簇生成一对相互成 90 度的卡片(把 \(n_{k,j}\) 与 \(t_{k,j}\) 旋转 90 度),用扁平几何营造体积感,缓解视线接近卡片平面时卡片”消失”的问题。Hair cap:把发根投影到头部网格最近面,提取含发根的面及其一环邻域构成头皮基底网格,沿法线微微外扩防 z-fighting,并烘焙每根发丝首段的切线/alpha/AO,改善头皮覆盖与发际线。

实验结果

实现基于 PyTorch,定制 Nvdiffrast 作为可微渲染骨干;最终结果用离线路径追踪配合经典 hair BCSDF 渲染,卡片间遮挡靠光线追踪、卡片内发丝遮挡靠预计算 AO 近似。实验在 AMD Threadripper 3970X + RTX 3090 上进行。评测发型来自 MetaHuman 与既有高保真重建数据集,涵盖 short、bangs、straight、ponytail、bun、wavy、curly、coily 等,均下采样到 40K 发丝、每根 32 个样本。纹理图集 2048×2048,容纳 \(n_t=32\) 张纹理。评价用 PSNR、LPIPS、coverage error 及 chamfer distance,在头周 12 个均匀视角上平均。

在与 Unreal Engine 自动生成器的对比中,本文方法在多种发型、不同卡片与纹理预算下的三项视觉指标均一致更优,即便只用更少纹理和 50 张卡片。下表摘录部分发型结果:

发型 卡片数 UE PSNR↑ UE LPIPS↓ UE Cov↓ 本文 PSNR↑ 本文 LPIPS↓ 本文 Cov↓
Ponytail 100×2 20.91 0.123 0.022 22.70 0.095 0.010
Straight 100 17.39 0.230 0.038 18.21 0.176 0.034
Curly 400 18.54 0.153 0.038 20.89 0.138 0.016
Wavy 200 16.82 0.228 0.041 19.89 0.166 0.016
Braid 400 23.25 0.086 0.010 24.90 0.077 0.007

消融实验证实各损失项均必要:去掉切线损失会产生不自然的锯齿状发丝,去掉碰撞损失虽在指标上影响小但在仿真时产生明显穿模伪影。作者对直发与卷发采用两套损失权重。卡片初始化消融显示,若用 UE 卡片作初始形状,优化后质量会下降,说明本文的几何初始化更优。与 351 卡片、20 纹理的 MetaHuman 最低 LoD 手工卡片及 UE 自动卡片对比,本文在全部指标上更优。

与”直接优化纹理”的对比验证了显式发丝表示的必要性:用 Nvdiffrast 直接优化纹理在单视角尚可,但多视角会产生噪声与不一致结果,加平滑损失又会抹掉高频细节;且纹理法缺乏计算 AO 所需的空间结构。方法还适用于结/辫等复杂结构,以及来自多视图重建的 strand 模型。性能上,40K 发丝、100 卡片/32 纹理约需 46 分钟(联合优化约占 42%),400 卡片约 1 小时,约 200 epoch 收敛,显存约 7–10 GB。在 UE 中,约 5 万发丝的 strand 模型每帧渲染约 2.4 ms,而 512 张卡片模型仅约 0.8 ms。

亮点与局限

亮点:

  • 首个把直发与波浪 strand 头发自动转 hair card 的管线,直接面向实时生产需求。
  • 核心创新是把发丝在纹理空间编码为 2D 曲线的显式、分辨率无关表示,既避免 RGB 走样,又天然可微、可转回 RGB。
  • 外观驱动而非精确几何复现,在受限几何预算下优先保留视觉相似度;聚类+两阶段优化的设计兼顾了纹理共享与精细微调。

局限:

  • 优化是多子步而非完全端到端,可能限制全局一致性;变量规模已很大(afro 例约 50 万变量),增加控制点会加大陷入局部极小的风险。
  • 损失主要依赖可见属性(切线、深度、遮罩覆盖),对密集/分层发型内部发丝排布未显式约束;hair card 本质适合静态与中等动画,大变形下会出现遮挡伪影。
  • 假设整个发型颜色均匀,难以推广到风格化或多色头发。
  • 高度卷曲的 coily 头发仍是挑战:卡片与控制点受限时难以保真,需极多卡片(如 20000×2)才能表达精细卷曲结构。

延伸思考

这篇工作的价值在于把”可微渲染 + 显式中间表示”落到了一个非常务实的工业管线问题上。把发丝在纹理空间参数化为 2D 曲线,本质是在”可优化性”和”避免光栅化走样”之间找到一个可导的中间态,这个思路或可迁移到其他细长/亚像素结构(如草、羽毛、纤维织物)的 LoD 生成。另一个值得注意的取舍是”外观驱动”哲学:作者明确放弃精确几何、只保外观相似,并用 AO 与切线/深度通道替代昂贵的 BCSDF 全光照匹配,这提示在生产资产简化中,选择正确的代理损失通道往往比追求物理精确更关键。局限里提到的多子步而非端到端、以及对内部结构和多色发缺乏约束,指向了后续可能的方向:更统一的联合优化目标,以及把颜色/内部遮挡纳入可微表示。