
想理解Fuzz和Sheen你必须了解H NOH具体是什么不然看不透彻半程向量 H光线与视线的“完美中间人”1. 数学逻辑为什么是 VL假设你面前有一面绝对平坦的镜子。光线从L方向射过来你要在V方向看到反射光。根据初中物理反射定律入射角等于反射角这面镜子的法线必须正好指向L和V的角平分线方向。所以H normalize(V L)算出的就是能让光线从L完美反射到V的那个“理想镜面朝向”。2. 物理真实你的表面根本不是平的在微观尺度下你的材质表面是由无数个朝向各异的微小镜子微面Microfacets组成的。当光线L打过来你想在V看到反光只有那些法线恰好等于 H 的微小镜子才能把光反射进你的眼睛。如果微小镜子的法线偏离了 H光就打不到你眼睛里。那些法线恰好等于 H 的微面被我们称为“活跃微面”。3. “懂又不懂”的痛点你懂VL怎么算但不懂的是H 其实是在反问整个表面——“你们这些微小镜子有多少人的朝向恰好是这个‘完美反射角度’” NOH (N dot H)衡量微面朝向的“对齐指标”NOH就是宏观表面法线N和这个“完美反射朝向”H的契合度。它的值在 0 到 1 之间NOH ≈ 1H 和 N 几乎重合。这意味着“完美反射方向”正好垂直于你的表面。说明有一大批微面是平躺着的。NOH ≈ 0H 和 N 几乎垂直。这意味着“完美反射方向”几乎平行于你的表面。说明要想看到反射你得找那些竖起来的、极其倾斜的微面。真实的物理含义NOH 其实是一个“筛选条件”。它告诉法线分布函数NDF比如GGX或Charlie“在这个特定视角和光照下我需要表面提供多大比例的、朝向为H的微面”NDF函数收到NOH这个数值吐出D值微面概率密度。如果D很大说明表面恰好有很多这种朝向的微面反射就强高光。如果D接近0说明表面根本没有这种朝向的微面反射就弱。float3 SheenBRDF SheenColor * D_Charlie * V_Charlie;核心灵魂——D_Charlie法线分布函数这是整套代码最核心的地方它回答了“表面有多少根纤维的朝向恰好能反光”hlslfloat invR rcp(max(SheenRoughness, 1e-4f)); float sin2h max(1.0f - NoH * NoH, 0.0078125f); float D_Charlie (2.0f invR) * pow(sin2h, invR * 0.5f) / (2.0f * PI);物理原理普通的 GGX 模型假设微面是“平躺”的所以当NoH接近1正对着看时D值极大产生中心高光。但 Charlie 模型假设纤维是“竖立”的。当NoH接近1正对着看时sin2h即1 - NoH^2接近0。代码里pow(sin2h, invR * 0.5f)算出来就是0中心自然是黑的。当你看边缘掠射角时NoH接近0sin2h接近1pow(1, 任何数)都是1再乘上(2 1/r)D_Charlie会瞬间飙升到极大值。这就是逆反射Retro-reflection的数学表达。SheenRoughness控制着这个幂函数的指数。粗糙度越低指数越小边缘亮边越锐利像丝绸粗糙度越高指数越大亮边越柔和像灰尘。光有分布函数还不够。如果微纤维竖得太密光线打进去会被遮挡产生“阴影”。V_Charlie 就是用来计算这种遮蔽效应Masking-Shadowing的。hlsl// 粗糙度重映射 float r saturate(SheenRoughness); r 1.0f - (1.0f - r) * (1.0f - r); // 拟合参数 float a lerp(25.3245f, 21.5473f, r); ... // 计算 Lambda (利用 Heitz 对称性) float x NoV; ... float V_Charlie 1.0f / ((1.0f Lambda_V Lambda_L) * (4.0f * NoV * NoL));物理原理这套复杂的Lambda拟合公式来自 Estevez Kulla 2017 论文是为了模拟纤维之间的相互遮挡。如果没有这个项边缘可能会因为D值过大而亮成纯白色能量不守恒。这个公式算出来的结果本质上是一个衰减因子。它根据视线和光照的角度合理地削弱过于夸张的亮边让物理表现更自然。假设你的材质表面是一片茂密的高草丛微纤维。Lambda_L光照方向的阴影/Shadowing光线从光源L射向表面。因为草丛太密光线在到达地面的途中被草叶挡住了一部分。这就是“阴影”。Lambda_V视线方向的遮蔽/Masking你的眼睛从V看向表面。同样因为草丛太密你视线看进去的途中也被草叶挡住了。这就是“遮蔽”。1. 三个概念的区别Fuzz 表示表面存在细小、密集的短纤维或微绒毛。 Sheen 表示纤维层产生的宽阔、柔和、掠射增强高光。 Substrate Fuzz UE5.8 中用于模拟微绒毛层的材质功能。它们不是完全同一个概念Fuzz 表面结构/材质语义 Sheen 这种纤维层的光学响应 Substrate Fuzz 用 Sheen 模型近似 Fuzz 的实现关系可以记成微绒毛 Fuzz ↓ 产生 Sheen 光学响应 ↓ UE 用 Sheen BRDF/LTC 近似2. UE5.8 Substrate Fuzz 的核心UE5.8 Substrate Fuzz 默认并不是逐根模拟绒毛而是Fuzz 参数 ↓ Sheen BRDF ↓ Sheen LTC 面积光积分 ↓ 绒毛层高光 ↓ 衰减底层 Slab 能量核心光照模型是SheenLTC_Eval(...)旧的 Charlie Sheen 路径仍存在但已经属于兼容/过时路径。3. Fuzz 的三个主要参数FuzzColor 绒毛层高光颜色。 FuzzAmount 绒毛层覆盖强度同时控制底层能量被削弱的程度。 FuzzRoughness 绒毛高光的宽度和柔和程度。通常FuzzRoughness 越小 高光更集中。 FuzzRoughness 越大 高光更宽、更柔和。UE 还会保证FuzzRoughness max( InputRoughness, NormalCurvatureRoughness, MinimumRoughness );避免高光闪烁或过于尖锐。4. 为什么叫“掠射高光”核心变量NoV saturate(dot(N, V));其中N 表面法线 V 视线方向当视线正对表面NoV ≈ 1当视线接近平行表面NoV ≈ 0Sheen 在NoV较小时会产生更明显的边缘反射视线越贴近表面 ↓ 绒毛层反射越明显 ↓ 出现宽阔、柔和的边缘高光这就是“掠射高光”。5. Sheen LTC 是什么Sheen 绒毛/织物的 BRDF 光照模型。 LTC Linearly Transformed Cosines 线性变换余弦分布。真实面积光积分Lo ∫A SheenBRDF(N,V,L) · NoL · Li(L) dA这个计算很昂贵因为面积光源上每个位置都有不同的光线方向。LTC 的近似是复杂 Sheen BRDF × NoL ≈ Amplitude × 变换后的余弦分布也可以理解为复杂的 Sheen 高光形状 ↓ 用矩阵 M 变换一个简单的余弦分布 ↓ 对变换后的光源进行快速积分运行时根据NoV Roughness查找 LTC LUT获得矩阵参数 M 能量缩放 Amplitude 方向反射率 Directional Albedo所以 LTC 的本质是离线拟合复杂 BRDF 运行时查表 快速近似面积光积分6. Fuzz 的能量守恒Substrate Fuzz 不是简单地Final Base Fuzz;这样会凭空增加能量。它使用BaseTransmission lerp( 1.0, 1.0 - SheenEnergy, FuzzAmount );等价于BaseTransmission 1.0 - FuzzAmount * SheenEnergy;最后Final BaseSlab * BaseTransmission FuzzSheen * FuzzAmount;含义是Fuzz 层反射了多少能量 底层 Slab 就减少相应的能量。因此 Fuzz 是底层能量衰减 绒毛层 Sheen 高光而不是一层 Emissive 假高光。7. 直接光计算直接光中UE5.8 大致执行FuzzSheen FuzzColor * SheenLTC_Eval( V, L, N, NoV, FuzzRoughness );然后乘以FuzzAmount 光源颜色 光源衰减 阴影简化公式FuzzLighting FuzzColor * SheenLTC(...) * FuzzAmount * LightColor * LightFalloff * Shadow;因此被 Directional Light 阴影遮挡的区域不会正常产生直接 Fuzz 光照。8. 环境光计算环境光路径通常使用 Sheen LTC 的方向反射率DirectionalAlbedo SheenLTC_DirectionalAlbedo( NoV, FuzzRoughness );然后Environment * 1.0 - FuzzAmount * DirectionalAlbedo; Environment FuzzColor * DirectionalAlbedo * FuzzAmount;UE5.8 中环境 Fuzz 会被近似加入环境漫反射贡献并不代表 Fuzz 在物理上就是漫反射。9. Fuzz 和 Sheen 的真实区别项目FuzzSheen本质微绒毛/短纤维结构纤维层的光学响应关注点表面结构光照结果UE 中的角色材质语义和参数实际使用的 BRDF是否逐根模拟否否典型表现短绒、细密纤维宽阔、柔和、掠射高光因此Fuzz 不等于 Sheen 但 UE5.8 用 Sheen 去近似 Fuzz 的整体光照效果。10. 适合使用的材质Substrate Fuzz 适合天鹅绒 麂皮 毛毡 短绒布 磨砂织物 细密纤维表面 桃皮类微绒面不适合只靠它实现长毛 动物毛 草 明显可见的单根短毛 需要精确毛流方向的毛发这些情况更适合Hair BSDF Hair Cards Strand Hair Fiber/Microflake BRDF 几何绒毛11. 最终记忆公式Substrate Fuzz Fuzz 材质语义 Sheen BRDF LTC 面积光积分 底层 Slab 能量衰减 绒毛层能量叠加最简公式float3 Final BaseLighting * (1.0 - FuzzAmount * SheenEnergy) FuzzSheen * FuzzAmount;