各向异性-DGF中D和G各向异性的实现
2025-11-10
| 2025-11-12
Words 1260Read Time 4 min
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的公式:
notion image
可见:只关注 H 与法线的夹角。这是个概论版本的bphone高光
再看各向异性版本:
notion image
当然,这个函数是公式的简化性能版
通过向量化消除昂贵除法

各向异性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 值越大);
具体原理:
notion image
相当于把概论问题转化为计算三维向量的模长,向量的三个分量对应 “切线空间中视线方向的各向异性投影”
真实的各向异性材质(如丝绸)中,微面沿某个方向(如 X 方向)排列更整齐,因此:
  • 沿 X 方向(aₓ小):微面遮挡少,视线更容易 “穿透” 微面间隙,对应 “aₓ XoV项的权重低”(即使 XoV 大,缩放后数值小,对模长影响弱);
  • 沿 Y 方向(aᵧ大):微面遮挡多,视线更难穿透,对应 “aᵧ YoV项的权重高”(YoV 稍大,缩放后数值大,对模长影响强);
  • 法线方向(NoV):是 “基础遮挡项”,无论各向异性如何,法线方向的遮挡都起作用。
最终,这个模长的大小直接反映 “视线被微面遮挡的概率”—— 模长越大,遮挡越少,可见性越高(高光越亮);模长越小,遮挡越多,可见性越低(高光越暗)。
  • HLSL
  • 渲染
  • 图形学
  • 可继承单例模板类GetIblSpecular间接光高光IBL(basepass静态)
    Loading...