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之后,全然能够使用拦截器,验证用户是否已经登录, ...
随机推荐
- 指针A - 签到题(顺序三元组)
给定一个长度为N的数组A=[A1, A2, ... AN],已知其中每个元素Ai的值都只可能是1, 2或者3. 请求出有多少下标三元组(i, j, k)满足1 ≤ i < j < k ≤ ...
- node的简单爬虫
最近在学node,这里简单记录一下. 首先是在linux的环境下,关于node的安装教程: https://github.com/alsotang/node-lessons/tree/master ...
- 【leetcode 简单】第四十八题 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 ...
- jQuery domready
在jQuery里面,我们可以看到两种写法: $(function(){ //todo }) $(document).ready(function(){ //todo }) 这两个方法的效果都是一样的, ...
- koa源码阅读[0]
koa源码阅读[0] Node.js也是写了两三年的时间了,刚开始学习Node的时候,hello world就是创建一个HttpServer,后来在工作中也是经历过Express.Koa1.x.Koa ...
- css3旋转、过渡、动画属性
1.transform 该属性对元素进行旋转.缩放.移动和倾斜 translate元素从当前位置移动 rotate元素顺时针旋转 scale元素的尺寸增大或减小 skew元素翻转 2.transiti ...
- arch安装完成之后不能使用笔记本自带的无线网卡
问题描述如下 我笔记本的wifi网卡识别不了,不知道为什么?? 使用ifconfig -a 只列出了有线网卡以及外接的无线网卡如下 enp4s0f1: flags=<UP,BROADCAST,M ...
- git服务器的简单搭建
安装git 安装git,参考:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git 创建git仓库 使用ro ...
- [转载]FFmpeg完美入门[1] - FFmpeg介绍及安装
1 FFmpeg简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视 频的完整解决方案.它包含了非常先 ...
- web项目更改文件后缀,隐藏编程语言
从Java EE5.0开始,<servlet-mapping>标签就可以配置多个<url-pattern>.例如可以同时将urlServlet配置一下多个映射方式: <s ...