← ALL ARTICLES

风格化头发高光

全库目录221
本文目录8

发片高光断成反向条带,常是UV发流或切线手性不一致。风格化头发用这份方向控制纵向高光,再通过偏移、遮罩和Ramp形成可读色带。几何方向稳定以后,才有依据调高光形状。

发流与高光

头发的切线方向

头发的各向异性高光由发丝方向约束;在下方切线模型中,半角方向与发丝近乎垂直时响应最强,发束上常形成横跨多根发丝的亮带。每个顶点需要稳定的切线/副切线,或通过 UV、流向图重建方向。

发片 UV 一般让 V 沿发根到发梢。若不同发片 UV 方向不一致,高光会突然反向。导入验证应显示切线和流向。

几何切线过于规则时,高光会像塑料条。可用噪声/偏移纹理对切线方向或高光位置做低幅度扰动,但不能破坏整体发流。

UV 的 V 轴沿发流时,发丝方向往往对应副切线 B,而不是默认沿 U 的切线 T。由法线 N 和导入切线构造 B = tangentSign * cross(N,T),再按资产约定选择发流。镜像 UV 改变手性,漏掉符号会让一部分发片的方向反转。基础高光中的点积平方对正反方向对称,但加入 shift * N 后,这种反转会改变偏移方向,所以错误往往只在打开双高光时显现。

Kajiya-Kay头发高光

Kajiya-Kay 用发丝切线 T\mathbf{T} 与半角向量 H\mathbf{H} 近似纵向高光。一个常见形式是:

sin⁡θ=1−(T⋅H)2\sin\theta=\sqrt{1-(\mathbf{T}\cdot\mathbf{H})^2} S=(sin⁡θ)pS=\left(\sin\theta\right)^p

pp 控制高光宽度。为了形成偏移的主/次高光,可沿法线对切线做偏移,再分别计算两个波瓣:

T′=normalize⁡(T+sN)\mathbf{T}'=\operatorname{normalize}(\mathbf{T}+s\mathbf{N})

两个波瓣使用不同偏移、指数、颜色和遮罩。风格化头发常再对 SS 做 Ramp 或阈值,使高光形成清晰色带。

这是经验模型,不是完整毛发散射。近景写实发丝可使用 Marschner 等模型;二次元发片更重视可控形状与稳定性。

高光遮罩与视角稳定

头发高光通常还乘:

  • Root-to-tip 梯度;
  • Strand/噪声遮罩;
  • Artist-painted Specular 遮罩;
  • 阴影可见性;
  • N⋅LN\cdot L 或自定义光照范围;
  • 相机-facing 遮罩。

完全粘在视线方向上会像屏幕贴纸,完全跟随光源又可能在镜头中消失。可在光源与视角坐标间混合,具体比例由项目风格决定。

取T=(0,1,0)、N=(0,0,1)、H=(0,0,1),shift=0时点积为0,高光为1;shift=1时偏移切线为(0,1,1)/sqrt(2),sinTH为1/sqrt(2)。指数为8时响应降到1/16。这说明偏移改变亮带的位置,而增大指数会压窄同一波瓣,两者承担不同控制。实际H来自归一化的L+V;L与V正好相反时该和为零,应回退为无该高光或项目指定方向,避免归一化产生无效值。

高光求值

HLSL片段输入同一空间的单位T、N和半角H,shift无单位,exponent为正。

hlsl
float3 shiftedT = normalize(T + shift * N);
float sinTH = sqrt(saturate(1.0 - pow(dot(shiftedT,H),2.0)));
float highlight = pow(sinTH, exponent) * artistMask;

验证方法

可视化发流与两个高光瓣,绕光源和相机分别旋转。测试镜像UV、LOD、Alpha遮挡与TAA;Kajiya-Kay是经验近似,真实毛发散射由对应论文说明。

实现状态:正文片段用于解释本页数据流与边界条件;完整宿主的编译、运行及性能测量尚未执行。可运行的独立模型以本页列出的具体测试为准。

2026-10-22 执行 编译检查,DXC 将移位切线与高光求值编译为 ps_6_0,结果通过。该结果只验证带最小输入声明的 HLSL 片段,完整材质、资产绑定、引擎运行与 GPU 性能仍未验证。

相关主题

参考资料