PBR(Physically Based Rendering)是一种以真实物理光学规律为基础的渲染技术,其主要目标是通过符合实际物理特性的材质属性与光照模型,实现高质量且在不同光照环境下保持一致的视觉效果。该框架依赖于多个关键理论与约束条件,确保渲染结果具备高度的真实感。
在PBR体系中,四大核心模块共同支撑起整个物理渲染流程:
| 模块 | 作用 | 关键参数 |
|---|---|---|
| 材质参数系统 | 定义物体表面的基本光学特性 | 金属度(Metallic)、粗糙度(Roughness)、基础反射率(Albedo) |
| 微表面理论 | 描述微观几何结构对光线反射的影响 | 法线分布函数(NDF)、几何遮蔽项(G)、菲涅尔效应(F) |
| 能量守恒约束 | 保证反射总能量不超过入射光能量 | 漫反射 + 镜面反射 ≤ 入射光强度 |
| 线性工作流 | 维持光照计算中的真实亮度关系 | HDR环境光、伽马校正处理 |
BRDF 与 PBR 的理论关联
BRDF(双向反射分布函数)是PBR实现的数学基石。它用于描述特定入射方向(ωi)和出射方向(ωo)之间,表面如何反射光线的比例关系。基于微表面理论,BRDF能够精确建模光线与复杂微观表面的交互过程。
PBR则是在BRDF基础上构建的一整套完整渲染管线,利用物理可测量的参数如金属度、粗糙度等,驱动BRDF中的各项计算,从而生成逼真的材质表现。可以说,没有BRDF的物理准确性,PBR无法成立。
PBR 实现所依赖的三大物理前提
- 微表面理论:作为BRDF的核心假设,认为表面由无数微小镜面组成,其朝向分布决定了高光形态。
- 能量守恒原则:任何表面的反射总量不得超过接收的光照能量,这是判断一个BRDF是否物理合理的必要条件。
- 基于物理的BRDF模型:例如Cook-Torrance模型,结合GGX分布、几何衰减与Schlick菲涅尔近似,构成现代PBR的标准公式。
技术维度对比:BRDF vs PBR
| 特性 | BRDF | PBR |
|---|---|---|
| 作用范围 | 局部点的反射行为计算 | 全局渲染流程,包含IBL、阴影、多光源整合等 |
| 参数化方式 | 数学函数形式(如GGX、Beckmann) | 集成于材质系统(如URP/Standard Shader中的参数接口) |
| 物理准确性 | 高,需满足能量守恒与互易性 | 更高,融合多种物理现象并统一管理 |
Unity 中的实践应用
在Unity的通用渲染管线(URP)中,PBR的实际落地依赖于底层着色器库的支持。其中,BRDF.hlsl 文件位于:
Packages/com.unity.render-pipelines.universal/ShaderLibrary/
该文件封装了所有关键的BRDF组件函数。
主要涉及的类包括:
- BRDFData:用于存储当前片段的材质信息,如粗糙度、金属度等;
- Lighting.hlsl:负责整合光照处理逻辑,连接BRDF与环境光(IBL)、主光源等输入。
核心算法实现示例
以下是两个典型的BRDF组成部分的HLSL代码实现:
GGX 法线分布函数(Normal Distribution Function)
float D_GGX(float NdotH, float roughness) {
float a = roughness * roughness;
return a / (PI * pow((NdotH * NdotH * (a - 1.0) + 1.0), 2.0));
}
Schlick 菲涅尔近似(Fresnel Term Approximation)
其中 F0 表示基础反射率,金属材质通常设为 0.9,非金属约为 0.04。
float3 F_Schlick(float3 F0, float VdotH) {
return F0 + (1.0 - F0) * pow(1.0 - VdotH, 5.0);
}
调用流程说明
在自定义Shader中引入相关库:
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
最终通过调用 BRDF_Unity_PBS 函数完成漫反射与镜面反射的组合输出,形成最终像素颜色。
扩展与定制方法
若需进行高级定制,可采取以下方式:
- 新增光照模型:修改
StencilUsage.cs添加新的模板值(如 MaterialCustom),并在GBufferPass.cs中加入对应的Shader Tag识别与模板写入逻辑。 - 参数调节差异:
- 标准光照模型:使用 _Specular 和 _Glossiness 控制高光强度与范围;
- BRDF/PBR模型:直接操作 _Metallic 与 _Smoothness 参数,更贴近物理意义。
传统模型与PBR的对比总结
| 特性 | 标准光照模型 | BRDF模型(PBR) |
|---|---|---|
| 实现文件 | SimpleLit.shader | BRDF.hlsl + Lighting.hlsl |
| 核心函数 | UniversalFragmentBlinnPhong | BRDF_Unity_PBS |
| 物理准确性 | 较低,属于经验型模型 | 较高,基于微表面理论与能量守恒 |
PBR 如何分解并应用 BRDF 进行光照计算
在实际渲染过程中,PBR将BRDF拆解为多个独立但相互关联的部分分别计算:
镜面反射部分 —— Cook-Torrance 模型
PBR直接采用该经典微表面模型来处理镜面成分,其公式结构如下:
Distribution(D) × Geometry(G) × Fresnel(F) / 正规化因子
每一项均来自上述实现:
- D项:由GGX函数提供法线分布;
- G项:考虑微表面间的自遮挡效应;
- F项:使用Schlick近似模拟视角相关的反射变化。
整体流程中,这些模块被集成进光照函数,配合线性空间计算与HDR环境贴图(IBL),最终输出符合物理规律的像素颜色。
对于深度开发需求,推荐参考Unity URP官方Shader库中的 Lighting.hlsl 与 BRDF.hlsl 文件,理解其内部组织结构与调用链路,有助于实现高性能、高保真度的自定义渲染效果。
在基于物理的渲染(PBR)中,镜面反射项由如下BRDF公式描述:
\[ f_{spec} = \frac{F \cdot D \cdot G}{4(n \cdot \omega_i)(n \cdot \omega_o)} \]
菲涅尔项 F
采用Schlick近似方法计算菲涅尔效应:
\[ F = F_0 + (1 - F_0)(1 - \cos\theta)^5 \]
在PBR中的应用表现为:
- \(F_0\) 通过金属度参数控制:对于金属材质,\(F_0\) 取自反照率(Albedo);非金属则固定为0.04。
- 掠射角下的反射增强效果可自动实现,例如水面倒影随观察角度变化而变强。
法线分布函数 D
主流选择为GGX模型,其表达式为:
\[ D = \frac{\alpha_g^2}{\pi \left[(n \cdot h)^2 (\alpha_g^2 - 1) + 1\right]^2} \]
PBR中的实际应用包括:
- 粗糙度参数 \(\alpha\) 由 roughness 值决定,用于控制高光区域的扩散程度。
- 当表面粗糙度较高时,微表面法线更加分散,导致高光范围更广、更柔和。
几何遮蔽项 G
使用Smith联合遮蔽函数来模拟微表面间的相互遮挡:
\[ G = \frac{n \cdot \omega_i}{n \cdot \omega_i + k} \cdot \frac{n \cdot \omega_o}{n \cdot \omega_o + k} \]
其中 \(k\) 的取值依据粗糙度确定:
\[ k = \frac{(roughness + 1)^2}{8} \]
该机制的作用在于:
- 引入自阴影效果,避免粗糙表面边缘出现过亮现象。
- 典型应用场景如磨损金属的棱角部分保持合理的明暗过渡。
漫反射项计算
采用符合能量守恒原则的Lambert模型:
\[ f_{diff} = \frac{albedo}{\pi} \cdot (1 - F) \cdot (1 - metallic) \]
关键优化点包括:
- 当金属度 \(metallic = 1\) 时,漫反射成分被完全抑制——符合纯金属无漫反射的物理特性。
- 因子 \((1 - F)\) 确保只有未被镜面反射的部分光线参与漫反射过程,维持整体能量守恒。
环境光照(IBL)与BRDF整合
PBR将BRDF理论扩展至环境光照明,主要依赖以下三种技术:
| 技术 | 作用 | BRDF整合方式 |
|---|---|---|
| 辐照度图 | 提供漫反射环境光 | 对BRDF中的余弦项进行半球积分预计算 |
| 预滤波环境图 | 实现镜面反射环境光 | 根据粗糙度对GGX分布进行分级过滤并存储 |
| BRDF LUT | 菲涅尔补偿数据 | 存储 \(\int f_{spec} \, d\omega_i\) 的预积分结果,提升运行时精度 |
PBR渲染流程中的BRDF调用示例
以下为典型的PBR着色器代码结构(以Unity URP为例):
// 输入参数
float3 albedo = baseColor.rgb;
float metallic = params.x;
float roughness = params.y;
// 1. 计算直接光照BRDF
float3 F0 = lerp(0.04, albedo, metallic); // 基础反射率
float3 directLight = 0;
foreach (Light light in sceneLights) {
float3 H = normalize(V + L);
float NdotV = dot(N, V);
float NdotL = dot(N, L);
// BRDF计算
float3 F = FresnelSchlick(max(dot(H, V), 0.0), F0);
float D = NDF_GGX(roughness, N, H);
float G = GeometrySmith(roughness, NdotV, NdotL);
float3 kS = F; // 镜面反射比例
float3 kD = (1 - F) * (1 - metallic); // 漫反射比例
// Cook-Torrance BRDF
float3 specularBRDF = (F * D * G) / max(4.0 * NdotV * NdotL, 0.001);
float3 diffuseBRDF = kD * albedo / PI;
directLight += (diffuseBRDF + specularBRDF) * lightColor;
}
// 2. 应用IBL环境BRDF
float3 envDiffuse = texture(irradianceMap, N).rgb * albedo;
float3 R = reflect(-V, N);
float3 envSpecular = textureLod(prefilterMap, R, roughness * MAX_LOD).rgb;
float2 envBRDF = texture(BRDF_LUT, float2(NdotV, roughness)).rg;
float3 iblSpecular = envSpecular * (F0 * envBRDF.x + envBRDF.y);
// 3. 组合最终结果(满足能量守恒)
float3 result = (directLight + envDiffuse + iblSpecular) * aoMap;
PBR与传统渲染的核心差异
两者在多个维度上存在本质区别:
| 特性 | 传统光照模型 | PBR + BRDF |
|---|---|---|
| 参数意义 | 依赖人工设定的经验值 | 基于物理可测量属性(如折射率、粗糙度等) |
| 高光控制 | 独立调节高光强度和范围 | 由粗糙度与金属度联合推导,无需额外参数 |
| 环境响应 | 环境贴图直接叠加,缺乏物理一致性 | IBL精确匹配BRDF积分,实现真实反射 |
| 一致性 | 不同光照条件下需反复调整参数 | 一次材质校准即可适用于所有场景 |
案例说明:金属铜材质
以铜为例展示PBR材质参数设置:
- 基础反射率 \(F_0\):从实测数据获取,约为 (0.95, 0.64, 0.54),对应Albedo值。
- 金属度:设为1,表示完全金属属性,关闭漫反射。
- 粗糙度:根据表面加工状态设定,如抛光铜设置为0.1,氧化铜可设为0.5以上。
- 结合IBL后,可在不同环境下自然呈现正确的反射与色彩衰减行为。
在材质表现中,以下参数定义了铜金属的视觉特性:
albedo = (0.95, 0.64, 0.54)(呈现铜色)
metallic = 0.98
roughness = 0.3
BRDF各组成部分的作用如下:
- 菲涅尔项F:在掠射角方向增强反射,呈现出金色的边缘光泽。
- GGX分布D:基于中等粗糙度,使高光区域边缘更加柔和、自然。
- 几何遮蔽G:模拟表面微小凹凸结构,形成细微阴影,增强质感层次。
- IBL:将环境中的暖色调光线合理融入反射,提升真实感。
效果对比方面:传统Phong模型通常只能表现出单一的橙色漫反射和规则圆形高光,缺乏细节变化;而采用PBR结合BRDF的方法,则能准确还原金属表面的渐变反射特性以及微观结构带来的视觉细节。
PBR通过系统化地整合BRDF所基于的物理光学原理,显著提升了材质在不同光照条件下的响应真实性与一致性。这种基于物理的渲染方法因其高度的客观性与可预测性,已成为当前3A级游戏及影视级别渲染的行业标准。


雷达卡


京公网安备 11010802022788号







