【光照】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开始探索游戏渲染】专栏-直达

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

相关推荐
℡枫叶℡9 小时前
Unity - C#比较两个文件是否相同
unity·c#
Robbie丨Yang18 小时前
【Unity 入门教程】二、核心概念
unity·游戏引擎
陈言必行1 天前
Unity 性能优化 之 实战场景简化(LOD策略 | 遮挡剔除 | 光影剔除 | 渲染流程的精简与优化 | Terrain地形优化 | 主光源级联阴影优化)
unity·性能优化·游戏引擎
爱吃小胖橘1 天前
Unity-动画基础
unity·c#·游戏引擎
陈言必行1 天前
Unity 性能优化 之 内存优化
unity·性能优化·游戏引擎
ellis19701 天前
LuaC API开发环境搭建保姆级教程
c++·unity·lua
绀目澄清1 天前
Unity 游戏引擎中 HDRP(高清渲染管线) 的材质着色器选择列表
unity·游戏引擎·材质
charlie1145141911 天前
Chrome View渲染机制学习小记
前端·chrome·学习·渲染·gpu·客户端
ellis19701 天前
toLua[二] Examples 01_HelloWorld分析
unity·c#·lua