Marschner模型源自SIGGRAPH2003《Light Scattering from Human Hair Fibers》论文,也就是本文的标题。
Marschner模型是除Kajiya-Kay模型外另一个应用广泛的头发着色模型。在基于物理的头发渲染领域,Marschner模型处于指导地位。比如Unreal Engine 4中的头发渲染(首先在《Paragon》中实现)便采用了Marschner模型。所以,在开始分析Unreal Engine 4中的头发渲染之前,需要对Marschner模型有个清晰的认知。
Kajiya-Kay模型
上篇《GDC2004头发渲染和着色》的文章已经详细的推导了Kajiya-Kay模型,所以这里简略总结一点它的特点。
Kajiya-Kay模型,是经典的现象学模型,也就是经验模型。它是设计用于表现一个头发纤维最明显的散射特点的模型。在Kajiya-Kay模型中,头发纤维被抽象化为一个不透明的圆柱体,不能够透射和产生内部反射。因此,Kajiya-Kay模型不能表现一些肉眼观察到的头发效果,同时也是能量不守恒的。而Marschner模型则是基于对头发纤维的物理分析,归纳推导出来的模型。
头发纤维
?图1是电子显微镜下头发纤维的结构
头发是一种电介质材质。金色,褐色,红色或者其他光色的头发是十分透明的(黑色除外),因此Marschner模型和Kajiya-Kay模型不同的一点就是,Marschner模型将头发纤维抽象为一个透明的椭圆柱体。
人类的头发纤维主要是两部分结构:角质层和皮层。
角质层包裹在皮层外面,虽然薄但对于光照的散射十分重要,因为它隔开了空气和皮层。光线有的角质层产生直接反射,有的透射角质层进入皮层,有的又从皮层透过角质层反射出去。
皮层组成了头发纤维的体积,在皮层的中心是髓质。皮层和髓质的色素决定了头发的颜色。
Marschner模型将头发纤维抽象成一个电介质圆柱体覆盖着排布的鳞屑和一个有色的内部。
光路和现象
?图2是Marschner模型的抽象结构和光路
光线打在头发纤维上,发生了复杂的变化,但是根据头发表现的观察,有三个最重要的光路。
反射光路R:光线到达头发纤维角质层直接被反射。
透射-反射-透射光路TRT:光线透射角质层进入皮层,角质层内层折射,又透射到空气中。可以知道,出射点距离入射点已经产生了偏移。
透射-透射光路TT:光线透射进入皮层,又从中直接透射出去。出射点在入射点的背面。
这三条光路也表现了头发的三个显著的特征。
主要镜面反射高光:表面反射形成。来自R光路,光线到达头发纤维角质层直接反射,表现为颜色为光线颜色的集中镜面反射高光。
次要镜面反射高光:内部反射形成。来自TRT光路,光线到透射到角质层进入皮层,经过角质层内侧反射出去的光线,因为光线在皮层(有色)产生了散射,所以射出的光线同样是有色的。
透光:透射形成。来自TT光路,光线直接穿透头发纤维,形成部分透明效果。
根据Marschner模型的抽象结构和光路可以得知,R和TRT的光路的反射角度与理想的镜面反射角度2α有偏移。重要的是,他们向对立的方向偏移(下文分析),这是产生两个视觉上可分辨的镜面反射高光的原因。主要镜面反射高光是表面反射产生的,为白色(光色)。次要镜面反射高光因为光线穿过头发纤维内部的色素,是有色的。
虽然Marschner模型提取了三种光路涵盖了头发的主要特征表现,但是也不能忽略其余的光路,比如TRT外还有TRRT……一些游戏渲染实现会对这部分进行模拟补偿。
数学分析
在论文中,采用了两个光学属性,一个是头发纤维内部的折射率近似为1.55,另一个是头发内部的横截面吸收率,近似为在纤维中统一均匀分布。
?图3是散射几何体的符号
在进行数学分析之前,我们需要了解椭圆的数学和光的物理知识(散射/反射/折射,辐射度/辐照度),这些可以参考WIKI。除此之外,还有论文中公式与图示出现的一些符号的设定:
1.头发的切线向量u,从发根Root指向发梢Tip。
2.向量v和向量w组成了一个的右手正交基底,同时将v-w平面作为法向平面。并且设定【如果纤维的横截面是椭圆的,那么v是长轴,w是短轴。】
3.光照的方向是ωi,计算或测量的散射光方向是ωr【注意:测量的方向就是摄像机方向】,ωi&ωr从中心向外射出。使用球面坐标表示ωi和ωr。与法向平面的倾斜角表示为θi和θr(设定0º垂直于头发/位于法向平面,90º为切线u,-90º为-u)。与头发的方位角表示为φi和φr(v为0º,w为90º)。
4.我们也有几个推导的角度。位差角(θr-θi)/2为θd,相对方位φr-φi表示为φ。半角(θi+θr)/2为θh,(φi+φr)/2为φh。
纤维的双向散射函数S和表面的双向反射分布函数BRDF不同,尽管他们的物理单位相同。对于入射和反射的光照我们使用曲线辐照度或者单位长度能量、曲线强度或单位长度强度来表示。这些单位和表面上的辐照度/单位面积能量和辐射度/单位面积强度相似。
双向散射函数中的“双向”和BRDF也有区别,分别是光照的方向ωi,散射反向ωr而不是反射方向。
双向散射函数的公式:
是无穷小长度纤维散射的曲线强度。
是纤维上这一部分的曲线辐照度。辐照度与入射的辐射度是成比例的。
曲线辐照度的公式:
是纤维的直径(对于一个椭圆横切面的纤维,直径取决于φi)。辐照度的测量范围是
,
是沿着头发纤维无穷小的一段弧长。
根据上面的双向散射函数和曲线辐照度的公式,我们可以给出散射积分的定义:
可以注意到,与表面积分只进行(上)半球积分不同的是,散射积分是整个球面计算积分的。的存在也说明了,粗的头发纤维会截断更多的光,因此在一段距离观察比细的纤维看起来更亮。