在Unity中,一个完整的PBR (Physically Based Rendering, 基于物理的渲染) BRDF光照模型由两个核心部分组成:漫反射项基于微表面理论 (Microfacet Theory, 微表面理论) 的镜面反射项

它的工作原理可以这样理解:当一束光线照射到物体表面时,BRDF会同时计算并整合两部分的光线贡献,一部分是光线进入材质内部后又散射出来的漫反射光 (Diffuse),另一部分是直接在物体表面发生的镜面反射光 (Specular)

以物理精确著称的Cook-Torrance BRDF模型(在Unity URP(通用渲染管线)和HDRP(高清渲染管线)中广泛使用)的核心,就是计算镜面反射光的那部分,它由三个关键函数构成。我们可以用一个公式来清晰地展现它:

总体构成:漫反射 + 镜面反射

首先,我们把BRDF拆解为两大组成部分:

  1. 漫反射项 (Diffuse Term):对应公式中的 kd * (c/π),它模拟光线进入材质内部,经过多次散射后从不同方向射出表面的现象。这构成了物体表面均匀、柔和的底色部分,与观察角度无关,通常使用经典的兰伯特模型 (Lambertian Model) 来近似,其反射率是一个恒定值 c/π,并根据能量守恒由系数 kd 控制其强度。

  2. 镜面反射项 (Specular Term):对应公式中复杂的分数部分 ks * (...) / ...,它模拟光线直接在物体表面发生的反射,形成了我们常说的“高光”。这是BRDF模型中最复杂的部分,用来生动地表现从光滑的镜面到粗糙的金属等不同材质的光泽特性。

在实际应用中,kd 和 ks 这两个系数由一个名为 “金属度工作流 (Metalness Workflow)” 的参数系统决定,确保了漫反射和镜面反射的能量此消彼长,符合物理规律。

深入解析镜面反射项:D、F、G三项

镜面反射项是整个BRDF的精华,它基于微表面理论 (Microfacet Theory, 微表面理论),将物体表面想象成由无数朝向各异的微小镜面组成。这个项由三个核心函数共同作用:

函数名称 中文名称 核心作用
D(h) - Normal Distribution Function (法线分布函数) 法线分布函数 描述所有微表面中,朝向恰好能将光线反射到观察者眼中的那一部分的比例
F(l,h) - Fresnel Function (菲涅尔函数) 菲涅尔函数 决定有多少光线被反射(产生高光),多少光线被折射(进入材质内部成为漫反射)
G(l,v,h) - Geometry Function (几何函数) 几何函数/遮蔽-阴影函数 修正微表面之间的自遮挡(阴影)和自遮蔽(掩蔽)造成的能量损失

D项:法线分布函数 (Normal Distribution Function, NDF)

它回答了“有多少微表面正好能把光线反射到你眼睛里?”这个问题。这个函数直接决定了高光区域的大小、形状和亮度

  • 粗糙的表面:微表面朝向非常混乱,只有少数恰好对齐的微表面能反射光线,结果就是黯淡、弥散的高光。

  • 光滑的表面:微表面朝向非常统一,大量微表面能同时将光线反射入眼,结果就是集中、明亮的高光。

  • 常见模型:现代PBR管线中最常用的是 GGX (Trowbridge-Reitz) 模型。它与经典的Beckmann模型相比,在光滑表面上能产生更自然的“尾巴”效果,即从高光中心到边缘的亮度衰减更平滑,更贴近真实世界中的材质(尤其是金属)。

F项:菲涅尔函数 (Fresnel Function)

它基于菲涅尔效应 (Fresnel Effect),描述了反射强度随观察角度变化的规律。这个函数解释了为什么一些表面在垂直看时很暗淡,但在掠射角(接近90度)时会像镜子一样明亮。

  • 表现:当你从近乎与水面平行的方向看去,水面会像一面明亮的镜子,反射出天空和景物;而当你从正上方垂直看下去,却可以直接看到水底。这就是菲涅尔效应的直观体现。

  • Unity的实现:Unity中的BRDF实现通常会使用性能高效的 Schlick菲涅尔近似算法 (Schlick Fresnel Approximation) 来计算此项。

  • 重要参数F0,即法线入射时的反射率(垂直观察时)。它决定了材质的基础高光强度。例如,绝大多数非金属(电介质)的F0约为0.04,而金属的F0则更高,且通常带有颜色。

G项:几何函数 (Geometry Function)

它也常被称为遮蔽-阴影函数 (Shadowing-Masking Term),它的作用是修正微表面间的自遮挡。当光线以近乎平行的角度入射或观察时,一些微表面会被相邻的“凸起”挡住,导致能量损失。如果缺少G项,在物体边缘处的高光会异常明亮、不自然。

  • 常见模型:在URP等现代渲染管线中,通常会使用效果较好的 Smith联合遮蔽-阴影函数 (Smith Joint Shadowing-Masking Function)

关键参数与Unity中的对应关系

在Shader代码层面(如Unity内置的 UnityStandardBRDF.cginc 文件),一个典型的BRDF函数会接收以下几个关键参数,它们直接控制着材质的外观:

  • diffColor (漫反射颜色):材质的基础颜色反照率 (Albedo)

  • specColor (镜面反射颜色):对于非金属,通常是灰度值;对于金属,则是金属的颜色。

  • oneMinusReflectivity (1减去反射率):这是一个辅助值,帮助计算漫反射的强度,满足能量守恒定律。

  • smoothness (光滑度):一个逆反参数,光滑度越高,表面越像镜面,高光越集中;反之则越粗糙,高光越分散。它会被转换成粗糙度 (Roughness) 供D、G函数使用。

  • metallic (金属度):在PBR工作流中,通过这个参数在0(非金属,电介质)和1(金属,导体)之间平滑过渡,动态地混合diffColorspecColor

总结:BRDF vs. 经验光照模型

为了更好地理解BRDF的优势,可以将它与过去的经验模型(如Phong或Blinn-Phong)进行对比:

模型类型 特点 优势 劣势
BRDF (基于物理) 基于微表面理论、能量守恒和菲涅尔效应 真实感极强,材质表现统一,在不同光照环境下效果稳定 计算性能消耗较高
经验模型 (如Phong) 由简单的数学公式直接构成 性能消耗很低,对于老旧设备或简单的卡通风格渲染足够使用 真实性不足,在掠射角等情况下表现不自然,不符合物理规律

总的来说,Unity中的BRDF模型通过精确控制漫反射与镜面反射的平衡,并利用D(法线分布)、F(菲涅尔)、G(几何) 这三个核心函数,共同定义了材质表面的高光形态、反射强度和微观自遮挡,从而在数字世界中高效地模拟出令人信服的物理真实感。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐