中EN
概念页

毛发渲染

Hair & Fur Rendering

毛发由角质层、皮质、髓质三层构成,可看作用曲线离散化的体积。几何上用沿引导曲线挤出的四边形条带并配合 alpha/顺序无关透明;着色用 BSDF(R、TT、TRT 分量),再加体积自阴影与多次散射近似;动物短毛可用壳与鳍或几何着色器挤出(RTR4 14.7 节)。

结构

  • 角质层:纤维表面,由与发丝方向约成 α=3∘\alpha=3^\circ 的重叠鳞片组成,使法线偏向发根。
  • 皮质:含决定颜色的黑色素——真黑素(棕)σa,e=(0.419,0.697,1.37)\sigma_{a,e}=(0.419,0.697,1.37),褐黑素(红)σa,p=(0.187,0.4,1.05)\sigma_{a,p}=(0.187,0.4,1.05)。
  • 髓质:人发中小而常被忽略,动物毛中占比更大、更重要。
  • 光照交互用 BSDF 描述(类似 BRDF,但在整个球面上积分)。

几何与 alpha

  • 顶点着色器沿美术绘制的引导曲线挤出四边形条带,每条代表一簇头发,适合胡须或短而静态的头发;细长、物理模拟的头发用成千上万条更细的条带,并以发丝切线为轴的圆柱约束朝向视点;少量引导线可插值出新发丝。
  • 透明排序:预排序索引缓冲(近头皮的先画)适合短而静态的发型;alpha 测试会严重混叠,可用 MSAA 逐样本 alpha 测试;或用顺序无关透明——TressFX 存最近 k=8k=8 个片元、保留前七层有序,实现多层 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 用简化数学近似前人分量。与离线相比仍有差距,尤其缺少高级体积阴影和多次散射,对低吸收的金发影响最大。

体积阴影、多次散射与环境光

  • 简单方案:沿光线方向从第一根头发到当前纤维的距离 dd,按常数 σa\sigma_a 求透射率,直接利用普通阴影贴图;但无法表现发簇造成的局部密度变化(太平滑),可改用深阴影贴图,或再结合 PCSS 得到更柔和结果。
  • Karis 的多次散射近似:假法线(类似弯曲法线)、包裹漫反射,以及按深度升幂的头发基色乘光照,模拟多次散射后的颜色饱和。
  • 双重散射(Zinke 等):全局透射因子 ΨG\Psi_G 由着色点到光源之间每根头发的 BSDF 组合得到,GPU 上统计光路上发丝数与平均朝向(深不透明度贴图或占用图);局部散射 ΨL\Psi_L 近似周围纤维的散射贡献;以 ΨG+ΨGΨL\Psi_G+\Psi_G\Psi_L 送入像素发丝 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(控制点、宽度、法线),每段只存 [umin,umax][u_{min},u_{max}],节省内存;把长曲线拆成几段还能让 AABB 包得更紧。
  • 三种类型:Flat 总是面向射线(适合远处的头发、毛);Cylinder 在 Flat 的基础上旋转 ∂p/∂v\partial p/\partial v 生成着色法线,看起来像圆柱(适合占几个像素的意大利面);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 把交点解释为扫掠圆柱上的点。坐标:纵向角 θ∈[−π/2,π/2]\theta\in[-\pi/2,\pi/2] 为方向与法平面(垂直于发丝切线的平面)的夹角,sin⁡θ=ωx\sin\theta=\omega_x(∂p/∂u\partial p/\partial u 对齐 +x+x);方位角 ϕ\phi 为方向在法平面内的投影与 yy 轴(∂p/∂v\partial p/\partial v)的夹角。横向偏移 h=−1+2v∈[−1,1]h=-1+2v\in[-1,1],sin⁡γ=h\sin\gamma=h,γ\gamma 是方向与圆柱法线的夹角。

结构与假设(9.9.2)

角质层(与空气的边界,鳞片倾角 α\alpha 约 2–4°)、皮质(约占 90% 体积,色素主要吸收)、髓质(中心,粗发与动物毛中更显著,散射远强于皮质)。模型把角质层当作鳞片倾角一致的粗糙电介质圆柱,内部只吸收不散射,并假设入射与出射在同一点(BSDF 而非 BSSRDF)。按内部路径段数 pp 分解,半可分离形式: f(ωo,ωi)=∑p=0∞Mp(θo,θi) Ap(ωo) Np(ϕ)∣cos⁡θi∣(式 9.47–9.48)f(\omega_o,\omega_i)=\sum_{p=0}^{\infty}\frac{M_p(\theta_o,\theta_i)\,A_p(\omega_o)\,N_p(\phi)}{|\cos\theta_i|}\quad(\text{式 9.47–9.48}) p=0p=0 为 R,p=1p=1 为 TT,p=2p=2 为 TRT……;前 pMax(=3)项单独计算,其余合成一项。参数:hh、η\eta(约 1.55)、按直径度量的 σa\sigma_a、βm\beta_m、βn\beta_n、α\alpha(度,典型 2)。

三个因子

  • 纵向 MpM_p(d'Eon 等 2011,能量守恒): Mp=12vsinh⁡(1/v) e−sin⁡θisin⁡θov I0 ⁣(cos⁡θocos⁡θiv)(式 9.49)M_p=\frac{1}{2v\sinh(1/v)}\,e^{-\frac{\sin\theta_i\sin\theta_o}{v}}\,I_0\!\Big(\frac{\cos\theta_o\cos\theta_i}{v}\Big)\quad(\text{式 9.49}) v≤0.1v\le0.1 时改用 log⁡I0\log I_0 的形式保证数值稳定。自行验证:v=0.02,0.3v=0.02,0.3、θo=0.2,1.0\theta_o=0.2,1.0 时 ∫Mpcos⁡θi dθi=1.0000\int M_p\cos\theta_i\,d\theta_i=1.0000。βm∈[0,1]\beta_m\in[0,1] 经感知均匀映射得 vv;p=1p=1 时减小粗糙度(圆柱折射的聚焦),p≥2p\ge2 时增大。
  • 衰减 ApA_p:把边界当作完美镜面(与 MpM_p、NpN_p 的光泽假设不同,但效果合理)。修正折射率 η′=η2−sin⁡2θo/cos⁡θo\eta'=\sqrt{\eta^2-\sin^2\theta_o}/\cos\theta_o 可直接在法平面内求 γt\gamma_t;一段内部路径长 l=2cos⁡γt/cos⁡θtl=2\cos\gamma_t/\cos\theta_t(以直径为单位),透射率 T=e−σalT=e^{-\sigma_al}。A0=fA_0=f(入射角余弦 cos⁡θocos⁡γo\cos\theta_o\cos\gamma_o),Ap=(1−f)2Tpfp−1A_p=(1-f)^2T^pf^{p-1},剩余各项求和 (1−f)2Tpmax⁡fpmax⁡−11−Tf\frac{(1-f)^2T^{p_{\max}}f^{p_{\max}-1}}{1-Tf}。
  • 方位 NpN_p:完美镜面下的净偏转 Φ(p,h)=2pγt−2γo+pπ\Phi(p,h)=2p\gamma_t-2\gamma_o+p\pi,再在其周围放截断 logistic 分布(形状类似高斯但可解析积分和采样,见 B.2.5),尺度 ss 由 βn\beta_n 映射。剩余项用均匀分布 1/(2π)1/(2\pi)(通常不足总散射的 15%)。

鳞片、互易性与采样(9.9.6–9.9.7)

  • 鳞片倾斜通过旋转 θo\theta_o 模拟:R 项 +2α+2\alpha,TT 项 −α-\alpha,TRT 项 −4α-4\alpha;于是 R 高光偏上、TRT 偏下,形成两条颜色不同的高光(R 不带发色,TRT 经吸收带色)。预计算 sin⁡(2kα)\sin(2^k\alpha)、cos⁡(2kα)\cos(2^k\alpha)(k=0,1,2k=0,1,2)用倍角公式。
  • 模型不互易:鳞片旋转只作用于一个方向,透射项的 ωt\omega_t 只由 ωo\omega_o 决定;作者称实践中未见瑕疵。
  • 采样:按各 ApA_p 的亮度比例离散选 pp(SampleDiscrete 顺带返回一个新的均匀样本),再精确采样 MpM_p 与 NpN_p,所以 pdf 与 BSDF 形状完全一致:∑pMpA~pNp\sum_p M_p\tilde A_pN_p。
  • 吸收系数:由真黑色素/褐黑色素浓度乘各自的吸收系数得到 σa\sigma_a(真黑色素约 8、1.3、0.3 分别对应黑、棕、金发);或用 Chiang 等(2016)的拟合由期望颜色反推。浅色头发需要很多次内部反弹(图 9.55:3 次与 50 次差别明显),渲染更贵。

与上文(RTR4)的对照

RTR4 列举了 Marschner、d'Eon、Chiang 等模型和实时近似;PBRT 实现的正是 d'Eon 的 MpM_p 加 Chiang 等的 logistic NpN_p 与参数化。分歧:RTR4 说 TRT 闪烁来自椭圆截面;PBRT 的模型假设圆截面,椭圆截面(Khungurn 与 Marschner 2017)留作习题,并指出那时需要一致的方位坐标系(Curve 返回的 ∂p/∂v\partial p/\partial v 总垂直于入射光线)。

原书问题(9.9)

  • 互易性一节说"鳞片旋转只施加在 θi\theta_i 上",而 9.9.6 节正文和代码片段都是旋转 θo\theta_o("Compute sin⁡θo\sin\theta_o and cos⁡θo\cos\theta_o terms accounting for scales")。紧接着"Handle out-of-range cos⁡θo\cos\theta_o"片段的正文又说 cos⁡θi\cos\theta_i 可能略为负。上述几处 θi\theta_i 应统一为 θo\theta_o(pbrt-v3 旋转的是 θi\theta_i,第 4 版改成 θo\theta_o 后文字未全部更新,存疑)。
  • 图 9.54 图注的 βn=0.1\beta_n=0.1 疑为 0.2:https://github.com/mmp/pbr-book-website/issues/34 (读者复现图形后报告,未经作者确认)。
  • 9.9.1 说"h=±1h=\pm1 为擦过圆的边缘,h=0h=0 为 edge-on 击中"。h=0h=0 是正对圆心的正面击中,"edge-on"用词与前半句矛盾(措辞问题)。
  • 图 9.52 图注说 p=1p=1 时透射方向覆盖圆周"大约 2/3"。自行计算 η=1.55\eta=1.55、θo=0\theta_o=0 时 Φ(1,h)\Phi(1,h) 的范围为 [1.40,4.88][1.40,4.88] rad,约占 55%;θo≠0\theta_o\neq0 时 η′\eta' 更大,范围略宽。"约 2/3"偏高(存疑,取决于图中参数)。
  1. realtime_rendering_4ed.pdf 第 14 章 Volumetric and Translucency Rendering
  2. PBRT 4e source excerpt: chapter 06 (Shapes)
  3. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 6 章 6.7 节,pbr-book.org/4ed/Shapes
  4. PBRT 4e source excerpt: chapter 09 (Reflection Models)
  5. 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

相关页面

图形学参与介质与体积散射Participating Media & Volumetric Scattering参与介质是充满粒子、通过吸收和散射参与光传输的体积,如空气、水、雾、烟、云;皮肤、蜡等致密材质也有强烈散射——"一切都是散射"。实时渲染主要考虑单次散射:沿视线积分透射率衰减后的内散射光,内散射由相位函数和对光源的可见性(不透明阴影 × 体积阴影)决定。通用实时方案把介质材质和散射结果体素化到相机视锥体素 (froxel) 中逐片累积(RTR4 14.1、14.3、14.8 节)。图形学实时次表面散射Real-Time Subsurface Scattering蜡、皮肤、牛奶等高散射固体中,光在离入射点不远处重新射出;当偏移大于一个像素时就不能再用 BRDF 表示。实时方法从便宜的包裹光照、法线模糊、预积分皮肤,到纹理空间/屏幕空间扩散,再到针对大尺度散射的深度图技术(RTR4 14.6 节)。图形学透明渲染与 Alpha 混合Transparency & Alpha Blending本页讲最简单的"视角相关"透明:半透明物体只衰减其后方物体的颜色。z-buffer 每像素只存一个表面,所以透明物体通常要从后往前用 over 运算符混合;顺序无关透明 (OIT) 方法用多遍渲染、逐像素链表或近似公式避免排序,各有内存、性能或准确性代价。预乘 alpha 让过滤、混合和合成更正确高效。图形学公告板Billboarding公告板是根据视线方向调整朝向的带纹理矩形。配合 alpha 纹理和动画,它能表现草、烟、火、雾、爆炸、能量护盾、尾迹、云等没有光滑实体表面的现象。各类公告板的区别只在于固定哪个向量(法线或上方向);软粒子、球形公告板解决与实体相交和穿过近平面的问题,轴向公告板用于树木、激光等柱对称物体(RTR4 13.6–13.6.3 节)。图形学滤波阴影贴图Filtered Shadow Maps普通阴影贴图的深度不能直接过滤。滤波阴影贴图存的是深度的某种统计量(矩、指数),可以像普通纹理一样模糊、做 mipmap、用求和面积表,只取一个样本就能得到平滑的半影。代表方法有方差阴影贴图 (VSM)、卷积阴影贴图、指数阴影贴图 (ESM/EVSM) 和矩阴影贴图;共同难点是漏光。游戏数学埃尔米特与 Kochanek-Bartels 样条Hermite & Kochanek-Bartels Splines三次 Hermite 曲线用两个端点和两个端点切线定义,比贝塞尔控制点更直观;把多段 Hermite 曲线串起来经过一系列点时,Kochanek-Bartels 用张力、偏置、连续性三个参数从相邻弦计算切线,默认参数即 Catmull-Rom 样条。均匀三次 B 样条则以不经过控制点为代价换来处处 C^2 连续。图形学细节层次Level of Detail细节层次 (LOD) 在物体对图像贡献变小时改用更简单的表示。LOD 系统由三部分组成:生成(简化或手工制作多个版本)、选择(按距离、投影面积等收益函数挑选)、切换(尽量减少跳变 popping)。LOD 主要减少顶点处理,也通过减少 quad 过度着色降低像素开销;进一步还可在预算约束下全局选择 LOD,实现时间关键(恒定帧率)渲染。综合角色渲染Character Rendering角色是游戏中最受关注、技术最集中的资产。本页按"动起来 → 表面细节 → 材质着色 → 特殊材质(皮肤、毛发、布料)→ 光照与阴影 → 性能"的顺序,把 wiki 中相关概念页串成一套角色渲染方案的地图。每一层只给出要点与取舍,细节见链接页。游戏数学贝塞尔曲线Bézier Curves参数曲线 \mathbf{p}(t) 用参数 t 生成连续的点,实时图形中常用于让相机或物体沿预定路径移动(与帧率无关),也用于渲染头发和字体。贝塞尔曲线由反复线性插值(de Casteljau 算法)得到,等价于 Bernstein 多项式加权控制点;多段拼接时要关注 C^n / G^n 连续性。游戏开发 · UE5材质系统Material SystemUE 材质 (Material) 是用节点图描述「表面如何与光交互」的着色器生成器。它有三个正交维度:着色模型 (Shading Model) 决定光照模型(Default Lit、次表面、清漆、毛发等),混合模式 (Blend Mode) 决定与背景的合成公式(Opaque/Masked/Translucent…),参数 + 材质实例 (Material Instance) 让美术在不重编译着色器的前提下做变体。PBR 输入(Base Color/Roughness/Metallic/Specular)直接对应 RTR4 的金属度-粗糙度工作流;最大的工程坑是静态参数导致的着色器排列爆炸。游戏开发 · UE5MetaHuman 数字人MetaHumanMetaHuman 是 Epic 的一套完整框架,用来创建、驱动和使用带完整绑定、照片级的数字人。从 UE 5.6 起,MetaHuman Creator 完全集成进引擎(双击 MetaHuman Character 资产打开),可以把角色组装 (Assembly) 成针对不同目标环境优化的资产。在引擎层面,最需要关心的是 LOD:MetaHuman 由多个 LOD 数量不同的组件组成,由 LODSync 组件统一切换;毛发是 Groom 资产,可以在发丝、发片、网格三种几何之间按 LOD 切换。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。游戏数学光线求交测试Ray Intersection Tests光线求交用于拾取、光线追踪、地面高度查询等。本页给出四类经典测试:光线-球(代数解与带早期拒绝的几何优化解)、光线-盒(平板法与光线斜率法)、光线-三角形(Möller-Trumbore,直接从顶点求重心坐标与距离)、光线-多边形(先求平面交点,再投影到二维做交叉数测试)。共同思路是先做便宜的拒绝测试、推迟除法与开方、必要时降维。图形学菲涅耳反射Fresnel Reflectance菲涅耳方程描述光在两种物质的平坦界面上反射的比例 F,它取决于入射角和两侧折射率:垂直入射时为材质特有的 F0(特征镜面色),掠射时趋于 1。实时渲染用以 F0 为参数的 Schlick 近似。电介质 F0 低且无色,金属 F0 高且常带色,半导体介于其间;金属度参数化利用了这一点。光从物体内部射向表面时还可能发生全内反射。本页对应 RTR4 9.5 节。图形学双向反射分布函数BRDFBRDF f(\mathbf{l},\mathbf{v}) 量化局部反射:只依赖入射方向 \mathbf{l} 和出射(观察)方向 \mathbf{v},涵盖表面反射与局部次表面散射。它通过反射方程把入射辐射亮度转换为出射辐射亮度,物理上需满足 Helmholtz 互易性与能量守恒,用方向反照率检验。方向光和精确光源可从小面光源的极限推导,使积分变为对光源的求和。本页对应 RTR4 9.3–9.4 节。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原