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的更多相关文章

  1. 【转载】MDX Step by Step 读书笔记(三) - Understanding Tuples (理解元组)

    1. 在 Analysis Service 分析服务中,Cube (多维数据集) 是以一个多维数据空间来呈现的.在Cube 中,每一个纬度的属性层次结构都形成了一个轴.沿着这个轴,在属性层次结构上的每 ...

  2. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问

    上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别” ...

  3. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  4. SQL Server 维护计划实现数据库备份(Step by Step)(转)

    SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server  ...

  5. EF框架step by step(6)—处理实体complex属性

    上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...

  6. EF框架step by step(7)—Code First DataAnnotations(1)

    Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...

  7. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

  8. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调

    上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...

  9. [置顶] hdu2815 扩展Baby step,Giant step入门

    题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...

  10. Struts2+Spring+Hibernate step by step 11 ssh拦截验证用户登录到集成

    注意:该系列文章从教师王健写了一部分ssh集成开发指南 引言: 之前没有引入拦截器之前,我们使用Filter过滤器验证用户是否登录,在使用struts2之后,全然能够使用拦截器,验证用户是否已经登录, ...

随机推荐

  1. K-means的缺点(优化不仅仅是最小化误差)

    K-means的缺点(优化不仅仅是最小化误差) #转载时,请注明英文原作David Robinson,译者Ding Chao.# 我最近遇到一个交叉验证的问题,我认为这个给我提供了一个很好的机会去用“ ...

  2. 【SRM20】数学场

    第一题 n个m位二进制,求异或值域总和. [题解]异或值域--->使用线性基,解决去重问题. m位二进制--->拆位,每位根据01数量可以用组合数快速统计总和. #include<c ...

  3. 【BZOJ】2599: [IOI2011]Race 点分治

    [题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...

  4. 【CodeForces】913 C. Party Lemonade

    [题目]C. Party Lemonade [题意]给定n个物品,第i个物品重量为2^(i-1)价值为ci,每个物品可以无限取,求取总重量>=L的最小代价.1<=30<=n,1< ...

  5. Use JPath but not recursively loop a JObject to modify the values.

    I am dealing with a Json file, I parsed it into jObject, I have another list which flattened the pro ...

  6. 2017ACM暑期多校联合训练 - Team 3 1005 RXD and dividing

    题目链接 Problem Description RXD has a tree T, with the size of n. Each edge has a cost. Define f(S) as ...

  7. NYOJ 228 士兵杀敌(五) (模拟)

    {题目链接](http://acm.nyist.net/JudgeOnline/problem.php?pid=228) 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为0~M,每次有任务的时候 ...

  8. NYOJ 1063 生活的烦恼 (二叉树)

    题目链接 描述 生活的暑假刚集训开始,他要决心学好字典树,二叉树,线段树和各种树,但生活在OJ上刷题的时候就遇到了一个特别烦恼的问题.那当然就是他最喜欢的二二叉树咯!题目是这样的:给你一颗非空的二叉树 ...

  9. c语言学习笔记.预处理.#ifndef

    #ifndef -> if not define 配合 #endif使用 在h头文件中使用,防止重复包含和编译. 也可以用条件编译来实现. 例如: 编写头文件 test.h 在头文件开头写上两行 ...

  10. 3-Python内置结构-列表

    目录 1 Python内置数据结构 1.1 数值型 1.2 math模块 1.3 round圆整 1.4 常用的其他函数 1.5 类型判断 2 列表 2.1 索引访问 2.2 列表和链表的区别 2.3 ...