时间:2025-09-26 15:21
人气:
作者:admin
【从UnityURP开始探索游戏渲染】专栏-直达
双向反射分布函数 Bidirectional Reflectance Distribution Function 解释当光线从某个方向照射到一个表面时,有多少光线被反射、反射方向有哪些。BRDF大多使用一个数学公式表示,并提供一些参数来调整材质属性。
BRDF(双向反射分布函数)是计算机图形学和光学中描述物体表面反射特性的核心数学模型,其定义和特性如下:
BRDF(Bidirectional Reflectance Distribution Function)表示入射光方向(ωi)与出射光方向(ωr)的反射辐射率(radiance)与入射辐照度(irradiance)的比值,数学表达式为:
$f_r(ω_i,ω_r)=\frac{dL_r(ω_r)}{dE_i(ω_i)}$
其中,$L_rL_r$为反射辐射率,$E_i$为入射辐照度。
BRDF将表面反射分为漫反射Diffuse 和镜面反射Specular 两部分(环境光通过IBL技术整合),其数学表达式为:
$f_r(ω_i,ω_o)=f_{diffuse}+f_{specular}$
基于微表面理论(Microfacet Theory),分解为三个物理项:
$f_{spec}=\frac{F(θ_h)⋅D(α,θ_h)⋅G(α,θ_i,θ_o)}{4⋅(n⋅ω_i)⋅(n⋅ω_o)}$
α=粗糙度,h=半角向量)k=粗糙度重映射参数)传统“环境光”在BRDF中被升级为 IBL Image-Based Lighting:
| 光照成分 | 标准光照模型 | BRDF实现方式 |
|---|---|---|
| 漫反射 | $Lambert = k_d * (n·l)$ | 能量守恒约束的Oren-Nayar/Disney模型 |
| 高光反射 | $Phong = k_s * (v·r)^n$ | 微表面模型(D+F+G项物理计算) |
| 环境光 | 恒定或环境贴图采样 | IBL技术(辐照度图+预过滤镜面贴图) |
| 能量守恒 | 不保证(可能过曝) | 强制满足diffuse + specular ≤ 1 |
hlsl
// Unity URP 中的核心代码片段(简化版)
float3 BRDF_PBS(float3 albedo, float metallic, float roughness,
float3 N, float3 V, float3 L) {
// 计算基础参数
float3 H = normalize(V + L);
float NdotV = saturate(dot(N, V));
float NdotL = saturate(dot(N, L));
// 1. 菲涅尔项 (F)
float3 F0 = lerp(0.04, albedo, metallic); // 基础反射率
float3 F = FresnelSchlick(saturate(dot(H, V)), F0);
// 2. 法线分布 (D)
float D = NDF_GGX(roughness, N, H);
// 3. 几何遮蔽 (G)
float G = GeometrySmith(roughness, NdotV, NdotL);
// 4. 组合镜面反射
float3 nominator = D * G * F;
float denominator = 4 * NdotV * NdotL;
float3 specular = nominator / max(denominator, 0.001);
// 5. 漫反射 (能量守恒)
float3 kD = (1 - F) * (1 - metallic); // 金属无漫反射
float3 diffuse = kD * albedo / PI;
return (diffuse + specular) * NdotL;
}
示例对比:传统Phong模型在粗糙金属表面会产生圆形高光,而GGX BRDF会生成拖尾式高光(符合真实相机拍摄效果)。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)