【光照】Unity中的[物理模型]PBR

【从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函数组合漫反射与镜面反射‌。
  • 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法线分布函数‌:

    c 复制代码
    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)

    c 复制代码
    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.hlslBRDF.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_g^2}{\\pi\[(n·h)^2(\\alpha_g^2-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示例):

c 复制代码
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与传统渲染的本质区别‌

特性 传统光照模型 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开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
在路上看风景29 分钟前
15. 纹理尺寸是4的倍数
unity
AT~3 小时前
unity 使用Socket和protobuf实现网络连接
unity·游戏引擎
怣疯knight9 小时前
Cocos creator判断节点是否能用的方法
unity·cocos2d
tealcwu9 小时前
Google Play的Keystore不可用时的解决方法
unity
呼呼突突10 小时前
Unity使用TouchSocket的RPC
unity·rpc·游戏引擎
qq 180809511 天前
从零构建一个多目标多传感器融合跟踪器
unity
平行云1 天前
实时云渲染支持在网页上运行UE5开发的3A大作Lyra项目
unity·云原生·ue5·webgl·虚拟现实·实时云渲染·像素流送
鹏飞于天1 天前
Shader compiler initialization error: Failed to read D3DCompiler DLL file
unity
wonder135791 天前
UGUI重建流程和优化
unity·游戏开发·ugui
那个村的李富贵1 天前
Unity打包Webgl后 本地运行测试
unity·webgl