【从UnityURP开始探索游戏渲染】专栏-直达

双向反射分布函数 Bidirectional Reflectance Distribution Function 解释当光线从某个方向照射到一个表面时,有多少光线被反射、反射方向有哪些。BRDF大多使用一个数学公式表示,并提供一些参数来调整材质属性。

BRDF(双向反射分布函数)是计算机图形学和光学中描述物体表面反射特性的核心数学模型,其定义和特性如下:


基本定义

BRDF(Bidirectional Reflectance Distribution Function)表示‌入射光方向(ωi)与出射光方向(ωr)的反射辐射率(radiance)与入射辐照度(irradiance)的比值‌,数学表达式为:

$f_r(ω_i,ω_r)=\frac{dL_r(ω_r)}{dE_i(ω_i)}$

其中,$L_rL_r$为反射辐射率,$E_i$为入射辐照度‌。


核心特性

  • 双向性‌同时依赖入射和出射方向,能精确描述光线在表面的空间分布‌。
  • 能量守恒‌反射率总和≤1,避免非物理的光能溢出‌。
  • 微观结构关联‌通过微表面理论(Microfacet Theory)建模表面粗糙度对反射的影响‌。

物理意义

  • 反射行为分解

    • 漫反射‌:光线均匀散射(如Lambert模型)
    • 镜面反射‌:光线集中反射(如GGX模型)‌。
  • 材质区分‌金属与非金属的BRDF差异显著(如菲涅尔效应在金属中更明显)‌。

‌BRDF的光照分解与实现原理‌

BRDF将表面反射分为‌漫反射Diffuse‌ 和‌镜面反射Specular‌ 两部分(环境光通过IBL技术整合),其数学表达式为:

$f_r(ω_i,ω_o)=f_{diffuse}+f_{specular}$

‌漫反射(Diffuse)‌

  • 作用‌:模拟光线在表面微结构中多次散射的均匀反射(如布料、粗糙墙面)。
  • 物理模型‌:
    • Lambertian模型‌:基础形式 $f_{\text{diff}} = \frac{\text{albedo}}{\pi}$
    • 改进模型‌:Oren-Nayar(考虑表面粗糙度)或 Disney BRDF(艺术可控)
  • 能量守恒约束‌:漫反射部分需满足:$∫_Ωf_{diff}(ω_i⋅n)dω_i≤1−F_0$其中 $F_0$ 是菲涅尔基础反射率。

‌镜面反射(Specular)‌

基于‌微表面理论‌(Microfacet Theory),分解为三个物理项:

$f_{spec}=\frac{F(θ_h)⋅D(α,θ_h)⋅G(α,θ_i,θ_o)}{4⋅(n⋅ω_i)⋅(n⋅ω_o)}$

  • 法线分布函数 NDF

    • 作用‌:描述微表面法线朝向的统计分布(决定高光形状)。
    • 常用模型‌:
      • GGX/Trowbridge-Reitz‌:$D(h) = \frac{\alpha_g^2}{\pi [(n \cdot h)^2 (\alpha_g^2 - 1) + 1]^2}$(α=粗糙度,h=半角向量)
      • Beckmann‌:较早的物理模型,拖尾效果不如GGX真实
  • 几何遮蔽函数 G
    • 作用‌:模拟微表面间阴影和遮挡(如粗糙表面的光能损失)。
    • Smith模型‌:$G = G_1(\omega_i) \cdot G_1(\omega_o)G_1(\omega) = \frac{n \cdot \omega}{(n \cdot \omega) (1 - k) + k}$(k=粗糙度重映射参数)
  • 菲涅尔项 F
    • 作用‌:计算不同视角下的反射率变化(如掠射角反射增强)。
    • Schlick近似‌:$F(\theta) = F_0 + (1 - F_0)(1 - \cos\theta)^5$($F_0$=基础反射率,金属≈0.5-1.0, 非金属≈0.02-0.05)

‌环境光的处理(间接光照)‌

传统“环境光”在BRDF中被升级为 ‌IBL Image-Based Lighting‌:

  • 漫反射环境光‌:通过‌辐照度贴图Irradiance Map‌ 预计算半球积分$L_{diff}=albedo⋅\frac1π∫_ΩL_i(ω_i)(n⋅ω_i)dω_i$
  • 镜面反射环境光‌:
    • 预过滤环境贴图(Prefiltered Environment Map)
    • 重要性采样 + BRDF LUT(查找表)

‌与传统光照模型的对比‌

光照成分 标准光照模型 BRDF实现方式
漫反射 $Lambert = k_d * (n·l)$ 能量守恒约束的Oren-Nayar/Disney模型
高光反射 $Phong = k_s * (v·r)^n$ 微表面模型(D+F+G项物理计算)
环境光 恒定或环境贴图采样 IBL技术(辐照度图+预过滤镜面贴图)
能量守恒 不保证(可能过曝) 强制满足diffuse + specular ≤ 1

‌BRDF在渲染管线中的实现流程(以GGX为例)‌

hlsl
// Unity URP 中的核心代码片段(简化版)
float3 BRDF_PBS(float3 albedo, float metallic, float roughness,
float3 N, float3 V, float3 L) { // 计算基础参数
float3 H = normalize(V + L);
float NdotV = saturate(dot(N, V));
float NdotL = saturate(dot(N, L)); // 1. 菲涅尔项 (F)
float3 F0 = lerp(0.04, albedo, metallic); // 基础反射率
float3 F = FresnelSchlick(saturate(dot(H, V)), F0); // 2. 法线分布 (D)
float D = NDF_GGX(roughness, N, H); // 3. 几何遮蔽 (G)
float G = GeometrySmith(roughness, NdotV, NdotL); // 4. 组合镜面反射
float3 nominator = D * G * F;
float denominator = 4 * NdotV * NdotL;
float3 specular = nominator / max(denominator, 0.001); // 5. 漫反射 (能量守恒)
float3 kD = (1 - F) * (1 - metallic); // 金属无漫反射
float3 diffuse = kD * albedo / PI; return (diffuse + specular) * NdotL;
}

‌关键突破‌

  • 物理正确性‌:通过微表面理论和能量守恒避免人工调参的不真实感。
  • 材质统一性‌:参数(金属度/粗糙度)在所有光照环境下保持一致性。
  • 环境响应‌:IBL使物体自然融入环境光照(如金属反射周围景物)。

‌示例对比‌:传统Phong模型在粗糙金属表面会产生圆形高光,而GGX BRDF会生成拖尾式高光(符合真实相机拍摄效果)。


【从UnityURP开始探索游戏渲染】专栏-直达

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

【光照】[物理模型]中的[BRDF]是什么?的更多相关文章

  1. PowerDesigner中遍历物理模型中的所有表,检查表代码、字段代码

    '***************************************************************************** '文件:CheckCode4SqlServ ...

  2. OpenGL光照计算中法线矩阵原理及推到过程

    问题起源 在计算漫反射关照时,需要用到法线,通过法线和光线的点乘值,计算漫反射的产生的光线强度,所以需要从顶点着色器中将法线数据传递到片源着色器中,但是片源着色器中的顶点坐标是经过了模型矩阵变化过的世 ...

  3. 如何将Powerdesign物理模型中的name复制成comment

    Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the current model ' get t ...

  4. Unity中的基础光照

    渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算. 光照模型就是用于决定在一个像素上进行怎样的光照计算. 一.光源 在实时渲染中我们通常把光源当做一个没有体积的点. 1.1 辐照度 ...

  5. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  6. 第五章 Unity中的基础光照(1)

    [TOC] 渲染总是围绕着一个基础问题:我们如何决定一个像素的颜色?从宏观上来说,渲染包括了两大部分:决定一个像素的可见性,决定这个像素上的光照计算.而光照模型用于决定在一个像素上进行怎样的光照计算. ...

  7. OpenGL中的光照技术(翻译)

    Lighting:https://www.evl.uic.edu/julian/cs488/2005-11-03/index.html 光照 OpenGL中的光照(Linghting)是很重要的,为什 ...

  8. Unity 5.6中的混合光照(下)

    https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...

  9. Unity 5.6中的混合光照(上)

    https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...

  10. 第五章 Unity中的基础光照(2)

    目录 1. Unity中的环境光和自发光 2. 在UnityShader中实现漫反射光照模型 2.1 实践:逐顶点光照 2.2 实践:逐像素光照 2.3 半兰伯特模型 1. Unity中的环境光和自发 ...

随机推荐

  1. HEXO部署博客内容到github报错

    今天在更新部署博客内容时出现了如下报错: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE H ...

  2. vue开发组件并发包到npm

    其实很早之前就做过,时间久了,就忘记了.这次复习,做个笔记官方文档:https://cli.vuejs.org/zh/guide/build-targets.html#%E5%BA%93 创建组件项目 ...

  3. CF1875C Jellyfish and Green Apple 题解

    CF1875C Jellyfish and Green Apple 我们首先把整块的分完,然后处理剩余的分数块数. 由于我们只能劈成两半,所以约分之后分数的分母只能为 \(2\) 的幂,不能包含其他质 ...

  4. java 两个线程

    简介 使用synchronized, 来实现两个线程的同步操作. 参考链接 https://www.cnblogs.com/leihuazhe/p/7898563.html TIPS 唤醒一个在等待资 ...

  5. Restcloud ETL开箱即用-永久免费

    2022年4月18日,国内领先的数据集成企业RestCloud发布了全新的ETL社区版本. RestCloud ETL社区版是一款完全国产化自主研发创新的全WEB化.开箱即用.永久免费的数据集成工具, ...

  6. Maui 实践:不要把 DataPackagePropertySetView 看作一层皮

    -- 再论为控件动态扩展 DragDrop 能力 夏群林 原创 2025.7.18 一.Drag / Drop 之间传递的参数 前文提到,拖放的实现需要 DragGestureRecognizer 与 ...

  7. 进阶篇:3.4)DFM-机械加工件设计总章

    本章目的:设计符合机械加工工艺的零件. 1.基础阅读 进阶篇:2)DFMA的介绍 进阶篇:2.3)DFMA的运用方法(个人方法) 2.机械加工概念 2.1 机械加工定义 广义的机械加工是指一种用加工机 ...

  8. AI 状态机,行为树,行为机

    https://github.com/egametang/ET/blob/master/Book/6.1AI%E6%A1%86%E6%9E%B6.md 节点分为四大类型:动作.条件.复合.修饰 [Co ...

  9. ABC 293 G 题题解 —— 莫队

    有关数据 \(\texttt{Time Limit}\) \(\texttt{Memory Limit}\) \(\texttt{Difficulty}\) \(\color{green}{\text ...

  10. python continue_vs_return