type
status
date
slug
summary
tags
category
icon
password
先算两个粗糙度
主要是整个函数
内部是行业通用的:
void GetAnisotropicRoughness(float m, float Anisotropy, out float ax, out float ay) {
ax = max(m * (1.0 + Anisotropy), 0.001); // 切线X方向的粗糙度:Anisotropy越大,ax越小(越光滑)
ay = max(m * (1.0 - Anisotropy), 0.001); // 副切线Y方向的粗糙度:Anisotropy越大,ay越大(越粗糙)
}
- 当
Anisotropy=1.0时,ax 最小(X 方向最光滑)、ay 最大(Y 方向最粗糙)→ 主 Lobe(X 方向)的高光最细长;
- 当
Anisotropy=0.0时,ax=ay=m → 退化为各向同性高光(圆形)。
- 当
Anisotropy=-1.0时,则粗糙度方向变成和Anisotropy=1.0相反。
各向异性D
在直接光高光的计算中,我们使用各向异性版本的D
// [Burley 2012, "Physically-Based Shading at Disney"]
float D_GGXAniso(float ax, float ay, float NoH, float XoH, float YoH)
{
float a2 = ax * ay;
float3 V = float3(ay * XoH, ax * YoH, a2 * NoH);
float S = max(dot(V, V),0.01);
return a2 * Square(a2 / S);
}
那么这个函数和普通的D有什么不同呢?
我们先看普通D的公式:

可见:只关注 H 与法线的夹角。这是个概论版本的bphone高光
再看各向异性版本:

当然,这个函数是公式的简化性能版
通过向量化消除昂贵除法
各向异性vis
核心作用是计算 “光线(L)和视线(V)能同时到达微面的概率”—— 概率越高(Vis 值越大),高光越亮(因为微面没被其他微面遮挡
我们来看两版本,都是分别计算两个V 和 V
各向同性版本
float Vis_SmithJointApprox(float a, float NoV, float NoL)
{
float Vis_SmithV = NoL * (NoV * (1.0f - a) + a);
float Vis_SmithL = NoV * (NoL * (1.0f - a) + a);
float t = 1.0f / max((Vis_SmithV + Vis_SmithL), 0.001f);
return 0.5f * t;
}
各向异性版本
//Anisotropic Vis
float Vis_SmithJointAniso(half ax, half ay, float NoV, float NoL, float XoV, float XoL, float YoV, float YoL)
{
float Vis_SmithV = NoL * length(float3(ax * XoV, ay * YoV, NoV));
float Vis_SmithL = NoV * length(float3(ax * XoL, ay * YoL, NoL));
float t = 1.0f / max((Vis_SmithV + Vis_SmithL), 0.001f);
return 0.5f * t;
}
- 输入参数:除了
NoV/NoL,还需要: XoV/XoL:视线 / 光线与切线 X 的点积(沿 X 方向的倾斜分量);YoV/YoL:视线 / 光线与副切线 Y 的点积(沿 Y 方向的倾斜分量);ax/ay:X/Y 方向的粗糙度(控制两个方向的遮挡程度);
- 遮挡项计算:构造 3D 向量
(ax*XoV, ay*YoV, NoV)—— 其中: - X 分量:
ax*XoV表示 “沿 X 方向的倾斜被 ax 缩放”(ax 越小,X 方向的倾斜对遮挡的影响越弱); - Y 分量:
ay*YoV表示 “沿 Y 方向的倾斜被 ay 缩放”(ay 越小,Y 方向的倾斜对遮挡的影响越弱); - Z 分量:
NoV表示 “与法线的夹角”(基础项);向量的length(模长)本质是 “综合 X/Y/Z 方向倾斜的总遮挡因子”—— 模长越大,遮挡越弱(Vis_SmithV 越大,总 Vis 值越大);
具体原理:

相当于把概论问题转化为计算三维向量的模长,向量的三个分量对应 “切线空间中视线方向的各向异性投影”
真实的各向异性材质(如丝绸)中,微面沿某个方向(如 X 方向)排列更整齐,因此:
- 沿 X 方向(
aₓ小):微面遮挡少,视线更容易 “穿透” 微面间隙,对应 “aₓ XoV项的权重低”(即使 XoV 大,缩放后数值小,对模长影响弱);
- 沿 Y 方向(
aᵧ大):微面遮挡多,视线更难穿透,对应 “aᵧ YoV项的权重高”(YoV 稍大,缩放后数值大,对模长影响强);
- 法线方向(
NoV):是 “基础遮挡项”,无论各向异性如何,法线方向的遮挡都起作用。
最终,这个模长的大小直接反映 “视线被微面遮挡的概率”—— 模长越大,遮挡越少,可见性越高(高光越亮);模长越小,遮挡越多,可见性越低(高光越暗)。