【光照】[物理模型]中的[BRDF]是什么?
【从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真实
- GGX/Trowbridge-Reitz:$D(h) = \frac{\alpha_g^2}{\pi [(n \cdot h)^2 (\alpha_g^2 - 1) + 1]^2}$(
- 几何遮蔽函数 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]是什么?的更多相关文章
- PowerDesigner中遍历物理模型中的所有表,检查表代码、字段代码
'***************************************************************************** '文件:CheckCode4SqlServ ...
- OpenGL光照计算中法线矩阵原理及推到过程
问题起源 在计算漫反射关照时,需要用到法线,通过法线和光线的点乘值,计算漫反射的产生的光线强度,所以需要从顶点着色器中将法线数据传递到片源着色器中,但是片源着色器中的顶点坐标是经过了模型矩阵变化过的世 ...
- 如何将Powerdesign物理模型中的name复制成comment
Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the current model ' get t ...
- Unity中的基础光照
渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算. 光照模型就是用于决定在一个像素上进行怎样的光照计算. 一.光源 在实时渲染中我们通常把光源当做一个没有体积的点. 1.1 辐照度 ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- 第五章 Unity中的基础光照(1)
[TOC] 渲染总是围绕着一个基础问题:我们如何决定一个像素的颜色?从宏观上来说,渲染包括了两大部分:决定一个像素的可见性,决定这个像素上的光照计算.而光照模型用于决定在一个像素上进行怎样的光照计算. ...
- OpenGL中的光照技术(翻译)
Lighting:https://www.evl.uic.edu/julian/cs488/2005-11-03/index.html 光照 OpenGL中的光照(Linghting)是很重要的,为什 ...
- Unity 5.6中的混合光照(下)
https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...
- Unity 5.6中的混合光照(上)
https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...
- 第五章 Unity中的基础光照(2)
目录 1. Unity中的环境光和自发光 2. 在UnityShader中实现漫反射光照模型 2.1 实践:逐顶点光照 2.2 实践:逐像素光照 2.3 半兰伯特模型 1. Unity中的环境光和自发 ...
随机推荐
- 卸载vivo或iqoo或其它手机的预装软件
前言 众说周知,现在安卓手机做的越来越闭源,(除了一加和小米以及红蓝厂的部分型号 大部分)根本无法root. 那就意味着 手机上一些预装的软件 根本无法卸载 比如:阅读.xx官网.自带的视频和音乐软件 ...
- Codeforces Round #619 (Div. 2) ABC 题解
A. Three Strings 题意:每次可以把c[i]拿去和a[i]或b[i]交换. 问你能否把ab变成相等. 思路:在ab不相等的时候看看c能不能与一方相等来中和.不能的话就不行. view c ...
- java 网格组布局
简介 GridBagLayout 网格组布局 java 核心编程 code /* * @Author: your name * @Date: 2020-11-08 12:48:42 * @LastEd ...
- vs 运行 qt 项目的注意事项
简介 RT 1 使用vs 打开 qt 项目 https://blog.csdn.net/weixin_44840658/article/details/99693803 2 运行项目之后 会因为缺少相 ...
- 基于外卖系统的RBAC实现
基于角色的访问控制(RBAC)模型实现报告 引言 在我原本开发的基于 Java 的外卖管理系统中,员工之间并没有精细化的权限控制,不同岗位的员工共享了相同的后台操作权限.为了解决这一问题,并实现系统管 ...
- English: 系动词:总结之 五种{1.be动词, 2.感官动词, 3.变化系动词, 4.持续系动词, 5.表象系动词}
English: 系动词:总结之 五种 系动词共有以下五种 be动词 am, is, are, was, were 感官动词 look看起来, sound听起来, feel摸起来(感受上) smell ...
- SciTech-BigDataAIML-LLM-PE(Positional Encoding)位置编码: Absolute(绝对)Position + Relative(相对)Position + Rotate(旋转)Position
SciTech-BigDataAIML-LLM PE(Positional Encoding)位置编码: BOW(Bag of Words)词袋模型:丢弃Word位置信息, 只统计Word之间的 Co ...
- spring-ai 学习系列(5)-MCP(webflux sse)
前面学习了stdio模式的MCP使用,可以看到这种方式局限性比较大,mcp host/mcp client/mcp server通常要在同1台机器上,使用进程间通讯.更常见的做法是,大家各自部署自己的 ...
- ActiveMQ是什么?-九五小庞
MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka.ActiveMQ是Apache下的开源项目,完全支持JMS1.1和J2EE1. ...
- 【原创】k8s 微服务滚动发布(服务持续可用)实践笔记
背景 对于业务和产品来讲,随时都有紧急小版本功能上线,对于研发人员来讲,线上如果有一些紧急的bug,都需要随时发版修正:而对于产品使用用户来讲,任何的功能和版本发布,要尽可能对用户无感知. ...