type
status
date
slug
summary
tags
category
icon
password
各向异性出现的本质:
双Lobe

所以很显然,bxdf的高光 肯定是要算两DGF 然后进行混合的
我们以最简单的双Lobe高光为例:(实际工程里比这复杂)
// Kajiya-Kay双Lobe高光
float3 SilkSpecular(float3 T, float3 B, float3 H, float roughness, float crossIntensity)
{float D1 = D_Aniso(roughness, dot(T, H)); // 经线分布
float D2 = D_Aniso(roughness, dot(B, H)); // 纬线分布
float Vis = Vis_Smith(roughness);float F = F_Schlick(specularColor, dot(V, H));
return (D1 + D2 * crossIntensity) * Vis * F;
}
// 丝绸类型匹配
if(薄纱) AnisotropyCross = 0.3; // 弱交叉
if(缎纹) AnisotropyCross = 0.7; // 强交叉
if(织锦) AnisotropyCross = 1.0; // 锐利十字
具体丝绸类型织方法:
其中D的化是按照两个粗糙度进行计算,最后使用了D1 + D2 * crossIntensity的混合方式
值得注意的是使用的是 dot(T, H)。很显然,用的是头发的Kajiya模型,用T0H 代替 N0H。确实本质很像,微观都是圆柱体
Vis则是没分方向,这是简化。牺牲了 “不同方向遮挡差异” 的精度,但省了一半计算,对丝绸这种 “软材质” 影响很小。
F一样,基于Kajiya模型。用的VoH。
如果换成 “金属拉丝”,可能需要更完整的双 Lobe(算 ax/ay、分方向 Vis),因为金属的高光更锐利,简化会导致 “高光边缘模糊”;但丝绸的高光本身偏柔和,这个简单版完全够用。