时间:2025-09-25 16:16
人气:
作者:admin
【从UnityURP开始探索游戏渲染】专栏-直达
PBR是一种基于物理光学原理的渲染框架,其核心是通过物理可测量的材质属性和真实的光照计算规则实现跨环境一致的真实感渲染。
| 模块 | 作用 | 关键参数 |
|---|---|---|
| 材质参数系统 | 定义物体固有光学属性 | 金属度(Metallic)粗糙度(Roughness)基础反射率(Albedo) |
| 微表面理论 | 描述微观几何对光的影响 | 法线分布(NDF)几何遮蔽(G)菲涅尔(F) |
| 能量守恒约束 | 确保物理正确性 | 漫反射+镜面反射≤入射光能 |
| 线性工作流 | 模拟真实光强度 | HDR环境光照伽马校正 |
BRDF(双向反射分布函数)与PBR(基于物理的渲染)是计算机图形学中紧密关联的两个概念.
BRDF是PBR的数学基础
BRDF通过微表面理论(Microfacet Theory)描述光线与物体表面的交互,定义了入射光方向(ωi)与出射光方向(ωo)的反射比例关系。
PBR则基于BRDF构建完整的渲染流程,通过物理参数(如粗糙度、金属度)实现真实材质模拟。
PBR的三大核心条件
| 特性 | BRDF | PBR |
|---|---|---|
| 作用范围 | 局部反射计算(单点光照) | 全局渲染流程(含IBL、阴影等) |
| 参数化 | 数学函数(如GGX、Schlick) | 材质系统(URP/Standard Shader) |
| 物理准确性 | 高(需满足能量守恒) | 更高(整合多物理效应) |
BRDF.hlsl文件包含GGX法线分布、菲涅尔项等核心计算。BRDF_Unity_PBS函数组合漫反射与镜面反射。Lighting.hlsl整合BRDF与IBL(环境光遮蔽)。_Metallic)直接控制BRDF行为。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);
}
#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_Metallic和_Smoothness参数| 特性 | 标准光照模型 | BRDF模型 |
|---|---|---|
| 实现文件 | SimpleLit.shader |
BRDF.hlsl + Lighting.hlsl |
| 核心函数 | UniversalFragmentBlinnPhong |
BRDF_Unity_PBS |
| 物理准确性 | 低(经验模型) | 高(微表面理论) |
如需深度定制,建议参考URP官方Shader库中的Lighting.hlsl和BRDF.hlsl实现
PBR通过分解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应用:
???? 法线分布 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应用:
采用能量守恒型Lambert模型:
$f_{diff}=\frac{albedo}{π}⋅(1−F)⋅(1−metallic)$
PBR优化:
metallic=1时漫反射归零(纯金属无漫反射)(1-F)确保未被镜面反射的光才参与漫反射PBR将BRDF扩展到环境光:
| 技术 | 作用 | BRDF整合方式 |
|---|---|---|
| 辐照度图 | 漫反射环境光 | 对BRDF的cos项半球积分 |
| 预滤波环境图 | 镜面反射环境光 | 按粗糙度预过滤GGX分布 |
| BRDF LUT | 菲涅尔补偿 | 存储∫fspecdωi∫fspecdωi预积分结果 |
典型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 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+BRDF |
|---|---|---|
| 参数意义 | 人工经验值 | 物理可测量属性 |
| 高光控制 | 独立高光强度参数 | 粗糙度+金属度推导 |
| 环境响应 | 环境贴图简单叠加 | IBL精确匹配BRDF |
| 一致性 | 不同光照需重调参数 | 一次校准全场景适用 |
材质参数:
albedo = (0.95, 0.64, 0.54)(铜色)
metallic = 0.98
roughness = 0.3
BRDF作用:
F:掠射角反射增强至金色D:中等粗糙度产生柔化高光边缘G:表面微小凹痕产生阴影细节???? 效果对比:传统Phong模型会显示均匀橙色+圆形高光,而PBR+BRDF呈现真实的金属渐变反射和表面微结构细节。
PBR通过系统化应用BRDF的物理光学模型,实现了材质表达的客观性和光照响应的真实性,成为现代3A游戏与影视渲染的工业标准。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)