BRDF

news2025/1/25 10:54:46

文章目录

refer:
LearnOpenGL
《入门精要》
Adobe Part1
Adobe Part2
知乎王江荣
知乎实现代码
几种不同的DFG
代码参考 间接光部分
代码参考 直接光部分




0. 写在前面

如果想要更好的理解,可以先看这篇文章

  • 首先,BRDF其本意是一个函数,特指Cook-Torrance BRDF模型中计算反射的部分
  • 但一般所说的BRDF均指整个Cook-Torrance BRDF模型:
  • 本人由于习惯,BRDF均特指计算反射的函数
  • 本文不考虑透射(BTDF)情况

双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)



1. 简单理解

  • 先简单的理解BRDF干了些什么事情,后面的公式才看得懂

首先用文字描述来解释一下BRDF干了什么事情:
对于每一个点(片元)

  • (入射)先遍历其法向半球的中所有光源,累加得到辐照度(先理解为入射光)
  • (反射)根据BRDF,仅计算到摄像机方向的反射强度

就是非常简单的一件事,只不过这个函数有点复杂,想要真正的完全理解并不容易,按照常理本应先从计算辐照度(入射光强度)开始入手,但其含有非常多的光学名词和概念,先从这里来会被绕晕;本文选择先从更容易被理解(但更复杂)的反射部分开始。
现在坐稳了,发车!



2. Cook-Torrance BRDF模型


这是通常大家所说的的BRDF的全名,其包含完整的反射计算(BRDF),SSS计算(BSSRDF)

            f = k S S S f S S S + k r f r f= k_{SSS}f_{SSS}+k_{r}f_{r} f=kSSSfSSS+krfr
f f f包含两个部分:

  • k k k指各部分所占比率: k S S S + k s p e c < 1 k_{SSS}+k_{spec}<1 kSSS+kspec<1 (SSS被吸收的损失)
  • f S S S f_{SSS} fSSS被称为漫反射,实际为SSS
  • f r f_{r} fr被称为高光反射部分,实际上是真正的BRDF


2.1 BRDF

现在先只考虑BRDF的部分,让我们来看看一个点在真实的物理世界中,是怎么反射光线的吧!

  • 当前只考虑单个光源的情况(方向光)

  • 已知当前点的 入射方向 v i v_i vi法线n观察角度 v o v_o vo(出射方向)(均为从当前点出发的标准化向量)

    f r = D F G 4 ( v o ⋅ n ) ( v i ⋅ n ) f_{r}=\frac{DFG}{4(v_o\cdot n)(v_i\cdot n)} fr=4(von)(vin)DFG

  • DFG分别代表一个函数:(每个DFG都有非常多的版本,有的开销大效果好,有的效果一般性能好)
    D 法线分布函数:估算在受到表面粗糙度的影响下,朝向方向与半程向量一致的微平面的数量。这是用来估算微平面的主要函数。
    F 菲涅尔方程:菲涅尔方程描述的是在不同的表面角下表面所反射的光线所占的比率。
    G 几何函数:描述了微平面自成阴影的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。

  • 先将DFG视为常数,BRDF当前的作用:(还不明白)

这个函数用来衡量:一个点在收受指定方向的光照后,有多少比例的光会反射到 v o v_o vo方向

  • 其实一条光线无非就两个变量:方向,强度(颜色) ;既然方向已经指定,这时我们要考虑的仅仅是强度,这也是BRDF的输出:一个0到1的数字




D 法线分布函数

  • 选取的为 N D F G G X T R NDF_{GGXTR} NDFGGXTR

在这里插入图片描述


D ( n , h , α ) = α 2 π ( ( n ⋅ h ) 2 ( α 2 − 1 ) + 1 ) 2 D(n,h,\alpha)=\frac{\alpha^2}{\pi((n\cdot h)^2(\alpha^2-1)+1)^2} D(n,h,α)=π((nh)2(α21)+1)2α2

  • α \alpha α:粗糙度; n n n法线向量; h h h半程向量(与blinn一致,入射和出射的中间向量)




F 菲涅尔

  • 选取的为 F S c h l i c k F_{Schlick} FSchlick

    菲涅尔的作用是:计算光线反射部分所占的比例

真实的菲涅尔方程是一个相当复杂的函数,因此Fresnel-Schlick近似在实时渲染中是比较常用的函数:


F ( h , v , F 0 ) = F 0 + ( 1 − F 0 ) ( 1 − ( n ⋅ v ) ) 5 F(h,v, F_0)=F_0+(1-F_0)(1-(n\cdot v))^5 F(h,v,F0)=F0+(1F0)(1(nv))5
(opengl这里的公式错了,应该是n不是h)



G 几何函数

在这里插入图片描述


G S c h l i c k G G X ( n , v , k ) = n ⋅ v ( n ⋅ v ) ( 1 − k ) + k G_{SchlickGGX}(n,v,k)=\frac{n\cdot v}{(n\cdot v)(1-k) + k} GSchlickGGX(n,v,k)=(nv)(1k)+knv


k d i r e c t = ( α + 1 ) 2 8 k_{direct}=\frac{(\alpha+1)^2}{8} kdirect=8(α+1)2 k I B L = α 2 2 k_{IBL}=\frac{\alpha^2}{2} kIBL=2α2


G ( n , v , l , k ) = G s u b ( n , v , k ) G ( n , l , k ) G(n,v,l,k)=G_{sub}(n,v,k)G(n,l,k) G(n,v,l,k)=Gsub(n,v,k)G(n,l,k)





1.1.3 L i ( p , ω i ) L_i(p,\omega_i) Li(p,ωi)

  • 立体角: ω \omega ω顾名思义,注意,仅角所对应的面积有关,与角所对应的形状无关

  • 辐射通量(Radiant flux): Φ \Phi Φ 表示的是一个光源的功率(光源单位时间内所输出的能量),以瓦特为单位

  • 辐射强度(Radiant Intensity): I = d ϕ d ω I = \frac{d\phi}{d\omega} I=dωdϕ 表示的是在单位球面上,一个光源向每单位立体角所投送的辐射通量。

  • 辐射率(Radiance): L = d ϕ d A ⋅ I c o s θ L = \frac{d\phi}{dA}\cdot\frac{I}{cos\theta} L=dAdϕcosθI 平面光源的每单位面积,所投射的辐射强度(因为是平面,要计算角度衰减)(描述出射光, θ \theta θ为光源平面和出射方向夹角)

  • 辐照度(Irradiance):(入射)平面单位面积所受L的总和



















\

首先,这个模型计算的对象仅是Object上的一个点(即上文所述的摄像机方向):

L o ( p , ω o ) = ∫ Ω f r ( p , ω i , ω o ) × L i ( p , ω i ) × ( n ⋅ ω i ) d ω i L_o(p,\omega_o) = \int_\Omega f_r(p,\omega_i,\omega_o)\times L_i(p,\omega_i)\times(n\cdot\omega_i)\mathrm{d}\omega_i Lo(p,ωo)=Ωfr(p,ωi,ωo)×Li(p,ωi)×(nωi)dωi


1.1.1 积分框架

            ∫ Ω A   d ω i \int_\Omega A\ \mathrm{d}\omega_i ΩA dωi

  • Ω \Omega Ω代表该点法线所面对的整个半球面
  • ω i \omega_i ωi代表每一单位立体角

1.1.2 f r ( p , ω i , ω o ) f_r(p,\omega_i,\omega_o) fr(p,ωi,ωo):




个人疑惑及解答

1.漫反射在物理中到底是什么?真实存在吗?


学习过PBR的同学可能知道,BRDF模型的光照其实也包含漫反射部分和镜面反射部分;但是我们学过微平面表面模型,所有的PBR都是基于此,有这样的理论:

  • 物体表面其实是无数镜面的,只会发生镜面反射和折射
  • 反射的光自然是specular
  • 折射的部分变为了次表面散射、透射和被吸收掉

也就是说,基于物理的真实世界的光照中,并没有漫反射这种东西!

那BRDF模型怎么大言不惭的说自己是PBR呢?

  • 首先事实是:BRDF模型是对的,没有错
  • 实际上BRDF中所谓的漫反射,其实是SSS部分
  • BRDF并没有考虑SSS远距离的情况,而是认为其SSS出射在入射光附近(同一像素)(大部分物质都可以这样近似,因为其散射距离确实很近)

如果你对上述的解释还不理解,可能是你还不了解BSSRDF模型,可以看我的这篇文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESL设计概述

‍‍ ‍‍前言 随着芯片面临着应用场景丰富多变、集成功能模块越来越多、片内通信及模块间接口越来越复杂、设计规模越来越大以及PPA要求越来越高的需求&#xff0c;芯片设计方法面临越来越大的挑战。架构的合理性、完备性和一致性很大程度上决定了芯片设计的成败。基于同样的I…

《基于光电容积图法的两种可穿戴设备在不同身体活动情况下监测心率的一致性:一种新的分析方法》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…

电容笔有必要买最好的吗?推荐的ipad手写笔

随着科技的进步&#xff0c;各种类型的电容笔的生产厂家越来越多。一支好的电容笔&#xff0c;不仅能大大提高我们的工作效率&#xff0c;而且能大大提高我们的学习效果。平替电容笔无论从技术水平&#xff0c;还是从产品品质来看&#xff0c;都具有十分广阔的市场前景。以下是…

redis基本数据类型及常见命令

数据库操作 select <库号>: 切换库 默认共有15个 dbsize: 查看当前库的key数量 flushdb: 清空当前库 flushall: 清空所有库 Key的操作 keys *&#xff1a; 查看当前库的所有key exists <key>: 判断该key是否存在 type <key>: 查看该key的类型 de <…

【原创】使用PowerShell配置新安装的ESXI主机

安装PowerCLI 模块 在线安装 优点&#xff1a;简单 缺点&#xff1a;太慢 启动PowerShell命令行&#xff0c;执行行如下命令 Install-Module -Name VMware.PowerCLI离线安装 先到VMware官网下载离线包&#xff0c;然后分几个步骤安装 https://developer.vmware.com/powercl…

redis5新增数据类型

Bitmaps 概念 &#xff08;1&#xff09; Bitmaps本身不是一种数据类型&#xff0c; 实际上它就是字符串&#xff08;key-value&#xff09; &#xff0c; 但是它可以对字符串的位进行操作。 &#xff08;2&#xff09; 可以把Bitmaps想象成一个以位为单位的数组&#xff0c; 数…

HIEE300024R4 UAA326A04什么是反馈和前馈控制系统?

​ HIEE300024R4 UAA326A04什么是反馈和前馈控制系统&#xff1f; 反馈控制系统&#xff1a; 反馈系统测量过程中的值并对测量值的变化做出反应。 在传感器的帮助下测量过程的输出&#xff0c;并将传感器值提供给控制器以采取适当的控制措施。控制器将此传感器信号与设定点进行…

人物专辑丨技术服务展计讯风采,助力客户显计讯担当

正所谓&#xff1a;平凡铸就伟大。一切令人赞叹的不凡&#xff0c;都来自于平凡点滴的坚守&#xff1b;一切砥砺前行的坚持&#xff0c;都来自于责任的担当。 在计讯物联高质量发展的进程中&#xff0c;不乏敢于担当、踏实勤恳、爱岗敬业的计讯人。他们扎根岗位&#xff0c;坚…

grafana-report在grafana7中遇到的问题

一、点击之后报错pdf报错&#xff1a;NO image renderer available/installed 查看grafana日志后&#xff0c;有以下报错&#xff1a; Could not render image, no image renderer found/installed. For image rendering support please install the grafana-image-renderer …

ThingsBoard使用jar包单机部署

1、概述 前面一节我讲了如何初始化数据库表结构以及默认的数据。这一节我将讲解如何使用jar包部署。 2、部署 2.1、修改thingsboard.yml配置 上一节我已经讲解了thingsboard.yml中的基础配置,基础的组件配置如何redis、kafka、Cassandra、pg等大家都知道,关键的地方是在于…

Neo4j图数据库的介绍_图数据库结构_节点_关系_属性_数据---Neo4j图数据库工作笔记0001

以前就知道这个了,也见别人用过,在大数据领域有可能会用到所以就看了一下. 其实就是用来,指定数据之间的关系,但是他这个更适合处理,数据之间的大规模的关系 可以看到图数据可以用到上面的这些领域 因为图数据库,更适合处理关系,基于数学中的图论 可以看到,因为如果关系太庞大…

pandas使用教程:pandas resample函数处理时间序列数据

文章目录 时间序列(TimeSeries)执行多个聚合 上采样和填充值通过apply传递自定义功能 DataFrame对象 时间序列(TimeSeries) #创建时间序列数据 rng pd.date_range(1/1/2012, periods300, freqS)ts pd.Series(np.random.randint(0, 500, len(rng)), indexrng) ts2012-01-01 0…

十二、MyBatis分页插件

文章目录 十二、分页插件12.1 分页插件使用步骤12.2 分页插件的使用12.3 测试案例 本人其他相关文章链接 十二、分页插件 12.1 分页插件使用步骤 1. 添加依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</art…

Java基本数据类型以及包装类型的常量池技术

Java 中的基本数据类型 Java 中有 8 种基本数据类型&#xff0c;分别为&#xff1a; 6 种数字类型&#xff1a; 4 种整数型&#xff1a;byte、short、int、long2 种浮点型&#xff1a;float、double 1 种字符类型&#xff1a;char1 种布尔型&#xff1a;boolean。 这 8 种基本…

Socks5 代理协议:网络安全中的利器

随着网络的普及&#xff0c;网络安全问题已成为各行各业所面临的共同难题。为了保护自己的网络安全&#xff0c;不少人选择使用代理IP&#xff0c;其中 Socks5 代理协议因其安全性、灵活性等优势备受青睐。本文将介绍 Socks5 代理协议及其在网络安全中的作用。 一、什么是 Soc…

安卓手机搭建智能语音客服/通话播音/聊天播音乐技术实现

声明&#xff0c;此项技术需要root支持&#xff0c;如果因为刷机导致手机变砖或其他不可预料的后果请自行解决。 场景 我有一个朋友他是做业务的&#xff0c;主要还是做电销&#xff0c;其实电销相对于以前纪念没那么好做了&#xff08;我自己觉得主要是互联网冲击&#xff0c…

[EIS 2019]EzPOP

[EIS 2019]EzPOP 考点&#xff1a; base64加密&#xff0c;解密的时候按4个的倍数 然后数组里面含有 php代码也可以执行 然后学到了解题思路&#xff0c;逆推然后找各个变量的初始值 <?php error_reporting(0);class A {protected $store;protected $key;protected $expire…

JAVA原生语言开发多学校Saas模式校园管理系统

开发语言&#xff1a;JAVA数据库&#xff1a;MySQL后端框架&#xff1a;Spring boot前端框架&#xff1a;VUE2电子班牌&#xff1a; Android 7.1小程序&#xff1a;原生开发多学校Saas 模式 详细技术栈 前后端分离 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端…

1.数据库的管理(实验报告)

目录 一﹑实验目的 二﹑实验平台 三﹑实验内容和步骤 四﹑命令(代码)清单 五﹑命令(代码)运行结果 一﹑实验目的 了解SQL Server数据库的逻辑结构和物理结构的特点&#xff1b;掌握使用SQL Server管理平台对数据库进行管理的方法&#xff1b;掌握使用Transact-SQL语句对数…

云原生时代崛起的编程语言Go并发编程实战

文章目录 概述基础理论并发原语协程-Goroutine通道-Channel多路复用-Select通道使用超时-Timeout非阻塞通道操作关闭通道通道迭代 定时器-TimerAndTicker工作池-Worker Pools等待组-WaitGroup原子操作-Atomic互斥锁-Mutex读写互斥锁-RWMutex有状态协程单执行-Once条件-Cond上下…