毛发渲染
Hair & Fur Rendering
毛发由角质层、皮质、髓质三层构成,可看作用曲线离散化的体积。几何上用沿引导曲线挤出的四边形条带并配合 alpha/顺序无关透明;着色用 BSDF(R、TT、TRT 分量),再加体积自阴影与多次散射近似;动物短毛可用壳与鳍或几何着色器挤出(RTR4 14.7 节)。
结构
- 角质层:纤维表面,由与发丝方向约成 的重叠鳞片组成,使法线偏向发根。
- 皮质:含决定颜色的黑色素——真黑素(棕),褐黑素(红)。
- 髓质:人发中小而常被忽略,动物毛中占比更大、更重要。
- 光照交互用 BSDF 描述(类似 BRDF,但在整个球面上积分)。
几何与 alpha
- 顶点着色器沿美术绘制的引导曲线挤出四边形条带,每条代表一簇头发,适合胡须或短而静态的头发;细长、物理模拟的头发用成千上万条更细的条带,并以发丝切线为轴的圆柱约束朝向视点;少量引导线可插值出新发丝。
- 透明排序:预排序索引缓冲(近头皮的先画)适合短而静态的发型;alpha 测试会严重混叠,可用 MSAA 逐样本 alpha 测试;或用顺序无关透明——TressFX 存最近 个片元、保留前七层有序,实现多层 alpha 混合。
- mip 缩小导致的 alpha 测试瑕疵:更聪明的 alpha mip 生成或哈希 alpha 测试;细发可按像素覆盖率调整不透明度。睫毛、眉毛可蒙皮跟随,用不透明 BRDF 或 BSDF 着色。
发丝 BSDF
| 分量 | 路径 | 视觉 |
|---|---|---|
| R | 角质层表面反射 | 偏向发根的白色高光 |
| TT | 两次透射穿过纤维 | 背光时的明亮高光 |
| TRT | 透射—对侧内反射—透射 | 带色的次高光,相对 R 偏移;横截面为椭圆(偏心)时产生闪烁 (glint),避免头发看起来均一 |
- Kajiya-Kay:有序的无穷小圆柱纤维的 BRDF,最初用于在体积纹理中光线步进渲染毛皮。
- Marschner 等:基于实测的 R/TT/TRT 模型,考虑菲涅尔,但忽略 TRRT 等更长路径,且不守恒。d'Eon 等考虑粗糙度和镜面锥收缩使其能量守恒,扩展 TR*T 路径,用实测黑色素消光系数控制透射。Chiang 等给出对美术更直观的粗糙度与多次散射颜色参数化。为艺术控制,可把 R/TT/TRT 与多次散射分成两套参数,并用简单数学形状表示各分量,按入射/出射方向归一化保持守恒。
- 实时版本:Scheuermann 的经验模型适合大条带;把 Marschner BSDF 存进按入射/出射方向索引的 LUT(难以空间变化外观);Karis 用简化数学近似前人分量。与离线相比仍有差距,尤其缺少高级体积阴影和多次散射,对低吸收的金发影响最大。
体积阴影、多次散射与环境光
- 简单方案:沿光线方向从第一根头发到当前纤维的距离 ,按常数 求透射率,直接利用普通阴影贴图;但无法表现发簇造成的局部密度变化(太平滑),可改用深阴影贴图,或再结合 PCSS 得到更柔和结果。
- Karis 的多次散射近似:假法线(类似弯曲法线)、包裹漫反射,以及按深度升幂的头发基色乘光照,模拟多次散射后的颜色饱和。
- 双重散射(Zinke 等):全局透射因子 由着色点到光源之间每根头发的 BSDF 组合得到,GPU 上统计光路上发丝数与平均朝向(深不透明度贴图或占用图);局部散射 近似周围纤维的散射贡献;以 送入像素发丝 BSDF。更贵但准确,可配合任意 BSDF。
- 环境光:常用球谐辐照度,乘以静止姿态预积分的非方向性 AO;Karis 也用同一假法线给出经验环境光模型。
毛皮
- 壳 (shells):Lengyel 等用八层纹理表示离表面不同高度的毛发切片,模型渲染八次、每次沿顶点法线外移;轮廓处毛发碎成点,再在轮廓边上生成带毛发纹理的鳍 (fins) 掩盖。鳍挤出也可给树木网格做复杂轮廓(配合浮雕映射)。
- 几何着色器(《失落的星球》):先存每像素毛色、长度、角度,再把每个像素变成半透明折线,自动 LOD;先画屏幕上朝下的毛(自下而上排序),再画朝上的(自上而下),保证从后往前混合。
- 蒙皮表面挤出四边形(《星球大战:前线》楚巴卡、TressFX 老鼠演示)。Ling-Qi 等证明动物毛不能视为均匀圆柱:髓质更大更暗,提出双圆柱纤维 BSDF,考虑 TttT、TrRrT、TttRttT 等路径(小写为与髓质的交互)。Ryu 按运动幅度与距离削减发丝实例数作为 LOD。
PBRT 的视角:Curve 形状(PBRT 4e 6.7)
PBRT 用专门的 Curve 形状表示毛发、毛皮和草叶,不做三角化,也就不需要很多存储(书中图 6.31 的兔子有一百多万条曲线):
- 表示:三次贝塞尔曲线(见 贝塞尔曲线)加从起点到终点线性插值的宽度,构成一条平的二维带子。其他基(Hermite、B 样条)要先转换成贝塞尔基。多段共享一个
CurveCommon(控制点、宽度、法线),每段只存 ,节省内存;把长曲线拆成几段还能让 AABB 包得更紧。 - 三种类型:Flat 总是面向射线(适合远处的头发、毛);Cylinder 在 Flat 的基础上旋转 生成着色法线,看起来像圆柱(适合占几个像素的意大利面);Ribbon 在两端给定法线,中间用球面线性插值,宽度乘以视线与带子法线夹角的余弦(适合草叶)。原书提醒:Flat 和 Cylinder 并不是一个物理上存在的三维形状,和真实圆柱对比时可能有细微差异。
- 求交:变换到射线坐标系后,射线的二维包围盒只是原点;与曲线段 AABB 不相交就剔除,否则递归二分(变差缩减性),深度上限按"线性化误差小于固定值"计算;最底层用首末点线段近似求最近点,与半宽比较,并用端点处切线的垂线作边函数,避免相邻段重复报告。阴影光线找到任意交点即返回。
- 局限:曲线不能做面光源(没有采样方法);因为它总朝向射线,新光线必须偏移整个宽度才能保证不自相交,宽曲线应改用双线性面片。
- 与实时做法对照:实时渲染常把发丝展开成面向相机的带子或细三角形条(上文所述),离线渲染直接对曲线求交,思路一致(都是"朝向视线的带子"),区别在于是否预先三角化。更快的离线求交算法有 Reshetov (2017)、Reshetov & Luebke (2018)(Phantom),GPU 友好的剔除见 Binder & Keller (2018)。
PBRT 的视角(二):HairBxDF 的完整模型(PBRT 4e 9.9)
几何(9.9.1)
Curve 按"始终朝向光线的扁平带"求交,但 BSDF 把交点解释为扫掠圆柱上的点。坐标:纵向角 为方向与法平面(垂直于发丝切线的平面)的夹角,( 对齐 );方位角 为方向在法平面内的投影与 轴()的夹角。横向偏移 ,, 是方向与圆柱法线的夹角。
结构与假设(9.9.2)
角质层(与空气的边界,鳞片倾角 约 2–4°)、皮质(约占 90% 体积,色素主要吸收)、髓质(中心,粗发与动物毛中更显著,散射远强于皮质)。模型把角质层当作鳞片倾角一致的粗糙电介质圆柱,内部只吸收不散射,并假设入射与出射在同一点(BSDF 而非 BSSRDF)。按内部路径段数 分解,半可分离形式:
为 R, 为 TT, 为 TRT……;前 pMax(=3)项单独计算,其余合成一项。参数:、(约 1.55)、按直径度量的 、、、(度,典型 2)。
三个因子
- 纵向 (d'Eon 等 2011,能量守恒): 时改用 的形式保证数值稳定。自行验证:、 时 。 经感知均匀映射得 ; 时减小粗糙度(圆柱折射的聚焦), 时增大。
- 衰减 :把边界当作完美镜面(与 、 的光泽假设不同,但效果合理)。修正折射率 可直接在法平面内求 ;一段内部路径长 (以直径为单位),透射率 。(入射角余弦 ),,剩余各项求和 。
- 方位 :完美镜面下的净偏转 ,再在其周围放截断 logistic 分布(形状类似高斯但可解析积分和采样,见 B.2.5),尺度 由 映射。剩余项用均匀分布 (通常不足总散射的 15%)。
鳞片、互易性与采样(9.9.6–9.9.7)
- 鳞片倾斜通过旋转 模拟:R 项 ,TT 项 ,TRT 项 ;于是 R 高光偏上、TRT 偏下,形成两条颜色不同的高光(R 不带发色,TRT 经吸收带色)。预计算 、()用倍角公式。
- 模型不互易:鳞片旋转只作用于一个方向,透射项的 只由 决定;作者称实践中未见瑕疵。
- 采样:按各 的亮度比例离散选 (
SampleDiscrete顺带返回一个新的均匀样本),再精确采样 与 ,所以 pdf 与 BSDF 形状完全一致:。 - 吸收系数:由真黑色素/褐黑色素浓度乘各自的吸收系数得到 (真黑色素约 8、1.3、0.3 分别对应黑、棕、金发);或用 Chiang 等(2016)的拟合由期望颜色反推。浅色头发需要很多次内部反弹(图 9.55:3 次与 50 次差别明显),渲染更贵。
与上文(RTR4)的对照
RTR4 列举了 Marschner、d'Eon、Chiang 等模型和实时近似;PBRT 实现的正是 d'Eon 的 加 Chiang 等的 logistic 与参数化。分歧:RTR4 说 TRT 闪烁来自椭圆截面;PBRT 的模型假设圆截面,椭圆截面(Khungurn 与 Marschner 2017)留作习题,并指出那时需要一致的方位坐标系(Curve 返回的 总垂直于入射光线)。
原书问题(9.9)
- 互易性一节说"鳞片旋转只施加在 上",而 9.9.6 节正文和代码片段都是旋转 ("Compute and terms accounting for scales")。紧接着"Handle out-of-range "片段的正文又说 可能略为负。上述几处 应统一为 (pbrt-v3 旋转的是 ,第 4 版改成 后文字未全部更新,存疑)。
- 图 9.54 图注的 疑为 0.2:https://github.com/mmp/pbr-book-website/issues/34 (读者复现图形后报告,未经作者确认)。
- 9.9.1 说" 为擦过圆的边缘, 为 edge-on 击中"。 是正对圆心的正面击中,"edge-on"用词与前半句矛盾(措辞问题)。
- 图 9.52 图注说 时透射方向覆盖圆周"大约 2/3"。自行计算 、 时 的范围为 rad,约占 55%; 时 更大,范围略宽。"约 2/3"偏高(存疑,取决于图中参数)。
出处
- realtime_rendering_4ed.pdf 第 14 章 Volumetric and Translucency Rendering
- PBRT 4e source excerpt: chapter 06 (Shapes)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 6 章 6.7 节,pbr-book.org/4ed/Shapes
- PBRT 4e source excerpt: chapter 09 (Reflection Models)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 9 章 9.1–9.9 节,pbr-book.org/4ed/Reflection_Models