PBR Step by Step(三)BRDFs
BRDF
BRDF(Bidirectional Reflectance Distribution Function)双向反射分布函数,用来描述给定入射方向上的入射辐射度以及反射方向上的出辐射度分布,BRDF提供了一种相对准确的计算方法。

如图所示,点\({P}\)处\({d \omega}\)内的入射辐射度为\({dE_i(p, \omega_i)}\),反射方向\({\omega_o}\)上的出射辐射度为\({dL_o(p, \omega_o)}\)。
BRDF遵循能量守恒原则,入射辐射度与出射辐射度应呈正比例关系,\({dL_o(p, \omega_o)}\)随\({dE_i(p, \omega_i)}\)的增加而增大。可表示为:
\({dL_o(p, \omega_o)} \propto {dE_i(p, \omega_i)}\)
如果用\({f_r(p, \omega_i, \omega_o)}\)表示BRDF比例系数,则:
\({dL_o(p, \omega_o)} = {f_r(p, \omega_i, \omega_o)}{dE_i(p, \omega_i)}\)
在上一篇中,我们知道入射辐射度\({dE_i(p, \omega_i)}={L_i(p, \omega_i) \, \cos \theta_i \, d \omega_i}\),代入上式得:
\({dL_o(p, \omega_o)} = {f_r(p, \omega_i, \omega_o)}{L_i(p, \omega_i) \, \cos \theta_i \, d \omega_i}\)
那么BRDF的比例系数\({f_r(p, \omega_i, \omega_o)}=\frac{dLo(p,\omega_o)}{L_i(p,\omega_i)\, \cos \theta_i \, d\omega_i)}\)
反射辐射度方程
由上面的公式,可知在立体角\({\Omega_i}\)上的反射辐射度的方程为:
\({L_o(p,\omega_o)}=\int_{\Omega_i}{f_r(p, \omega_i, \omega_o)}\, {L_i(p, \omega_i)}\, {\cos \theta_i}\, {d\omega_i}\)
BRDFs的特征
- 满足交换率:若交换\(\omega_i\)和\(\omega_o\),最终的BRDF值保持不变。就是说若改变光的传播方向,辐射度保持不变。
- 满足线性特征:物体表面上一点的全部反射辐射度等于各BRDF反射辐射度之和。
- 遵循能量守恒:现实中不存在可以完全反射物体表面的入射光的材质,部分能量会被物体表面吸收并以其他形式再次反射。所以物体表面面片\({dA}\)上的各向反射辐射度小于总的吸收能量。
反射率Reflatance
反射率是反射通量和入射通量的比例系数。在上一篇讲的关于辐射度的内容中,我们知道\({\Omega_i}\)上的入射辐射度:
\({E_i(p, \, \omega_i)} = \frac{d\Phi_i}{dA} = \int_{\Omega_i} {L_i(p, \, \omega_i) \, \cos \theta_i \, d \omega_i}\)
可推出\({\Omega_i}\)上的入射辐射通量\({d\Phi_i} = {dA} \int_{\Omega_i} {L_i(p, \, \omega_i) \, \cos \theta_i \, d \omega_i}\)
对于\({\Omega_o}\)上的同一面片中的反射通量为:
\({d\Phi_o} = {dA} \int_{\Omega_o}{L_o(p, \, \omega_o) \, \cos \theta_o \, d \omega_o}\)
将上面的反射辐射度方程代入,得:
\({d\Phi_o} = {dA} \int_{\Omega_o}\int_{\Omega_i} {f_r(p, \omega_i, \omega_o)}\, {L_i(p, \omega_i)}\, {\cos \theta_i}\, {d\omega_i} \, {\cos \theta_o \, d \omega_o}\)
反射率\({\rho(p, \Omega_i, \Omega_o)}=\frac{d\Phi_o}{d\Phi_i}\),这样,我们就可以得到反射率的方程:
\({\rho(p, \Omega_i, \Omega_o)}=\frac{d\Phi_o}{d\Phi_i}=\frac{\int_{\Omega_o}\int_{\Omega_i} {f_r(p, \omega_i, \omega_o)}\, {L_i(p, \omega_i)}\, {\cos \theta_i}\, {d\omega_i} \, {\cos \theta_o \, d \omega_o}} {\int_{\Omega_i} L_i(p, \omega_i) \, \cos \theta_i \, \omega_i}\)
最后再附带上一张图作梳理总结

PBR Step by Step(三)BRDFs的更多相关文章
- 【转载】MDX Step by Step 读书笔记(三) - Understanding Tuples (理解元组)
1. 在 Analysis Service 分析服务中,Cube (多维数据集) 是以一个多维数据空间来呈现的.在Cube 中,每一个纬度的属性层次结构都形成了一个轴.沿着这个轴,在属性层次结构上的每 ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别” ...
- Step by step Dynamics CRM 2011升级到Dynamics CRM 2013
原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...
- SQL Server 维护计划实现数据库备份(Step by Step)(转)
SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server ...
- EF框架step by step(6)—处理实体complex属性
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...
- EF框架step by step(7)—Code First DataAnnotations(1)
Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...
- 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥) 介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...
- [置顶] hdu2815 扩展Baby step,Giant step入门
题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...
- Struts2+Spring+Hibernate step by step 11 ssh拦截验证用户登录到集成
注意:该系列文章从教师王健写了一部分ssh集成开发指南 引言: 之前没有引入拦截器之前,我们使用Filter过滤器验证用户是否登录,在使用struts2之后,全然能够使用拦截器,验证用户是否已经登录, ...
随机推荐
- AbstractTransactionalJUnit4SpringContextTests事务回滚
在单元测试中继承AbstractTransactionalJUnit4SpringContextTests类的 时候,会默认事务回滚. 需要照常执行的话,在执行的测试方法上添加@Rollback(fa ...
- Google Map API 应用实例说明
目录 Google Map API 1基础知识 1.1 Google 地图 API 概念 1.2 Google 地图的"Hello, World" 1.2.1 加载 Google ...
- eclipse中修改svn用户名和密码
开发中有时候用公共的电脑提交一些代码,eclipse没有专门的切换svn账户的功能.查阅资料得出解决办法: 1. 查看你的Eclipse 中使用的是什么SVN Interface windows & ...
- 几种不同程序语言的HMM版本
几种不同程序语言的HMM版本 “纸上得来终觉浅,绝知此事要躬行”,在继续翻译<HMM学习最佳范例>之前,这里先补充几个不同程序语言实现的HMM版本,主要参考了维基百科.读者有兴趣的话可以研 ...
- spring boot 使用logback日志系统的详细说明
springboot按照profile进行打印日志 log4j logback slf4j区别? 首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样 ...
- Android稳定性测试工具Monkey的使用
综述 Monkey是一个命令行工具,它可以运行在我们的模拟器或者设备当中.它可以发送一些伪随机的用户事件流,例如点击.触摸.手势等.我们能够使用Monkey工具来对我们所开发的应用进行压力测试. ...
- scikit-learn模块学习笔记(数据预处理模块preprocessing)
本篇文章主要简单介绍sklearn中的数据预处理preprocessing模块,它可以对数据进行标准化.preprocessing 模块提供了数据预处理函数和预处理类,预处理类主要是为了方便添加到pi ...
- 设置NGINX进程分配至多核CPU提升性能
Nginx 配置文件 nginx.conf 首先需要找到 Nginx 的配置文件 nginx.conf 才能进行下面的操作,在LNMP一键安装包默认配置下,nginx.conf 存放在/usr/loc ...
- [ python ] 匿名函数和高阶函数
匿名函数 描述: 关键字 lambda 定义的函数 语法: 函数名 = lambda 参数:返回值 返回值: 函数返回结果值 实例: 一个参数的匿名函数: func = lambda ...
- 以太坊go-ethereum项目源码本地环境搭建
如果要深入了解go-ethereum项目的实现与机制,看源代码是必不可少的.今天这篇博客就简单介绍一下如何在本地搭建项目的开发环境. GO语言环境搭建 以win8为例,访问地址https://gola ...