【从UnityURP开始探索游戏渲染】专栏-直达
PBR(Physically Based Rendendering)的核心内容与BRDF应用
PBR是一种基于物理光学原理的渲染框架,其核心是通过物理可测量的材质属性和真实的光照计算规则实现跨环境一致的真实感渲染。
PBR四大核心支柱
模块 | 作用 | 关键参数 |
---|---|---|
材质参数系统 | 定义物体固有光学属性 | 金属度(Metallic)粗糙度(Roughness)基础反射率(Albedo) |
微表面理论 | 描述微观几何对光的影响 | 法线分布(NDF)几何遮蔽(G)菲涅尔(F) |
能量守恒约束 | 确保物理正确性 | 漫反射+镜面反射≤入射光能 |
线性工作流 | 模拟真实光强度 | HDR环境光照伽马校正 |
BRDF和PBR的关系
BRDF(双向反射分布函数)与PBR(基于物理的渲染)是计算机图形学中紧密关联的两个概念.
理论层级关系
-
BRDF是PBR的数学基础
BRDF通过微表面理论(Microfacet Theory)描述光线与物体表面的交互,定义了入射光方向(ωi)与出射光方向(ωo)的反射比例关系。
PBR则基于BRDF构建完整的渲染流程,通过物理参数(如粗糙度、金属度)实现真实材质模拟。
-
PBR的三大核心条件
- 微表面理论(BRDF的物理基础)
- 能量守恒(BRDF需满足反射率≤1)
- 基于物理的BRDF(如Cook-Torrance模型)
技术实现差异
特性 | BRDF | PBR |
---|---|---|
作用范围 | 局部反射计算(单点光照) | 全局渲染流程(含IBL、阴影等) |
参数化 | 数学函数(如GGX、Schlick) | 材质系统(URP/Standard Shader) |
物理准确性 | 高(需满足能量守恒) | 更高(整合多物理效应) |
Unity中的实际应用
- BRDF实现
- URP的
BRDF.hlsl
文件包含GGX法线分布、菲涅尔项等核心计算。 - 示例:
BRDF_Unity_PBS
函数组合漫反射与镜面反射。
- URP的
- PBR流程
- 通过
Lighting.hlsl
整合BRDF与IBL(环境光遮蔽)。 - 材质参数(如
_Metallic
)直接控制BRDF行为。
- 通过
演进与扩展
- 从BRDF到PBR:BRDF解决了Phong模型非物理问题,PBR进一步扩展至全局光照(如IBL)和材质系统。
- 现代应用:URP/Standard Shader均采用PBR流程,但底层仍依赖BRDF的数学实现
BRDF(PBR)实现
核心脚本
BRDF.hlsl
(路径:Packages/com.unity.render-pipelines.universal/ShaderLibrary/
)- 关键类:
BRDFData
(存储粗糙度、金属度等参数)和Lighting.hlsl
(处理光照计算)
实现方法
-
GGX法线分布函数:
hlsl 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近似:其中
F0
为基础反射率(金属材质为0.9,非金属为0.04)hlsl 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
定义新的Stencil值(如MaterialCustom
) - 在
GBufferPass.cs
中添加对应Shader Tag和Stencil写入逻辑
- 修改
- 参数调整
- 标准光照模型:通过
Material
面板调整_Specular
和_Glossiness
- BRDF模型:调整
_Metallic
和_Smoothness
参数
- 标准光照模型:通过
对比总结
特性 | 标准光照模型 | BRDF模型 |
---|---|---|
实现文件 | SimpleLit.shader |
BRDF.hlsl + Lighting.hlsl |
核心函数 | UniversalFragmentBlinnPhong |
BRDF_Unity_PBS |
物理准确性 | 低(经验模型) | 高(微表面理论) |
如需深度定制,建议参考URP官方Shader库中的Lighting.hlsl
和BRDF.hlsl
实现
BRDF在PBR中的具体应用
PBR通过分解BRDF实现光照计算,以下是各部分的实现原理:
镜面反射计算(Cook-Torrance BRDF)
PBR直接调用BRDF的微表面模型:
$f_{spec}=\frac{F⋅D⋅G}{4(n⋅ω_i)(n⋅ω_o)}$
-
🔴 菲涅尔项 F
基于Schlick近似:
$F = F_0 + (1 - F_0)(1 - \cos\theta)^5$
PBR应用:
- $F_0$由金属度控制(金属=Albedo,非金属=0.04)
- 掠射角反射增强自动实现(如水面倒影随视角变化)
-
🔵 法线分布 D
GGX模型(主流选择):
$D = \frac{\alpha_g2}{\pi[(n·h)2(\alpha_g2-1)+1]2}$
PBR应用:
- 粗糙度参数
α = roughness²
控制高光扩散 - 粗糙度高→微表面法线分散→宽泛柔和高光
- 粗糙度参数
-
🟢 几何遮蔽 G
Smith联合遮蔽函数:
$G = \frac{n·\omega_i}{n·\omega_i + k} · \frac{n·\omega_o}{n·\omega_o + k}$
PBR应用:
- $k = (roughness + 1)^2 / 8$ 控制自阴影
- 防止粗糙表面边缘过亮(如磨损金属棱角)
漫反射计算
采用能量守恒型Lambert模型:
$f_{diff}=\frac{albedo}{π}⋅(1−F)⋅(1−metallic)$
PBR优化:
- 金属度
metallic=1
时漫反射归零(纯金属无漫反射) (1-F)
确保未被镜面反射的光才参与漫反射
环境光照(IBL)
PBR将BRDF扩展到环境光:
技术 | 作用 | BRDF整合方式 |
---|---|---|
辐照度图 | 漫反射环境光 | 对BRDF的cos项半球积分 |
预滤波环境图 | 镜面反射环境光 | 按粗糙度预过滤GGX分布 |
BRDF LUT | 菲涅尔补偿 | 存储∫fspecdωi∫fspecdωi预积分结果 |
PBR渲染流程中的BRDF调用
典型PBR着色器代码结构(Unity URP示例):
hlsl
// 输入参数
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 BRDFfloat3 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 |
一致性 | 不同光照需重调参数 | 一次校准全场景适用 |
案例说明:金属铜材质
-
材质参数:
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游戏与影视渲染的工业标准。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)
本文由博客一文多发平台 OpenWrite 发布!