Auto Hair Card Extraction for Smooth Hair with Differentiable Rendering
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 全光照匹配,这提示在生产资产简化中,选择正确的代理损失通道往往比追求物理精确更关键。局限里提到的多子步而非端到端、以及对内部结构和多色发缺乏约束,指向了后续可能的方向:更统一的联合优化目标,以及把颜色/内部遮挡纳入可微表示。