全局照明算法基础——从辐射亮度到渲染方程

  全局照明(Global Illumination)问题上已经有很多著名的算法,如路径追踪(Path Tracing),辐照度(Radiosity)等。绝大部分书籍/教材都直接介绍了做法,在理论方面有所欠缺(比如算法的正确性)。这段时间在看《Advanced Global Illumination》,大呼爽快,所以做了这些笔记。


一、方向和立体角

clip_image002

  立体角(Solid Angle)是平面角的推广。如上图,考虑一块不规则的曲面,其在单位球体(球心在原点,半径clip_image004)上的投影为曲面clip_image006,则clip_image006[1]的面积clip_image008为该曲面对应的立体角clip_image010。根据定义易知,任何包含原点的球体对应的立体角都为clip_image012。如果用球坐标clip_image014来刻画立体角,那么其微分clip_image016可以被表示为

clip_image018

此外,根据立体角的定义,可以给出任何曲面元对应立体角的计算公式——

clip_image020

其示意图如下:

clip_image022


二、Radiance的定义

  考虑密度函数clip_image024,它给出在时空坐标clip_image026处单位体积内沿方向clip_image028、波长为clip_image030的光子的数量。那么给定位置clip_image032、时间clip_image034、方向clip_image036以及波长clip_image038,容易知道单位时间内沿方向clip_image016[1]通过面元clip_image040的、波长在clip_image042间的光子的能量为

clip_image044

其中clip_image046是这些光子的速度。在波长范围clip_image048、全体立体角clip_image010[1]、曲面clip_image006[2]上对clip_image050积分得

clip_image052

这就是曲面clip_image006[3]上的辐射通量(Flux)的定义。

  类似地,定义辐射照度(Irradiance)为

clip_image054

辐射强度(Intensity)为

clip_image056

以及辐射亮度(Radiance)——

clip_image058

这几个量间有以下关系:

clip_image060


三、Radiance的守恒性质

  从clip_image062的定义可知,Radiance是空间位置和方向的函数可以写作clip_image064,表示从空间位置clip_image066出发、朝向clip_image068Radiance。(类似地,clip_image070表示空间位置clip_image066[1]处朝方向clip_image072Radiance)若clip_image066[2]clip_image074间没有遮挡,则有以下重要性质成立:

clip_image076

  证明:

clip_image078

  如上图,由Radiance的定义有

clip_image080

其中clip_image082是从clip_image084出发向clip_image086发射的能量。根据能量守恒,它们必定都被clip_image086[1]接收,即

clip_image088

又由立体角的性质

clip_image090

clip_image092

代入得

clip_image094

整理即得clip_image076[1]


四、以Radiance来量度传感设备响应

  摄像机、人眼等感光设备所得到的光的量度可以用Radiance来衡量,而非Flux等。由此可以得出一些结论,比如一个明亮的物体随着观察者距离的增加不会显得更暗,这是因为在光的传播过程中Radiance不随距离改变。 


五、BRDF

  一束光照射到某个表面上,反射的效果随着表面的材质有所不同。譬如,理想的镜子会把所有的入射光反射到某个特定的方向,而在其他方向上的反射光为0;理想的Lambertian表面会把入射光往所有的方向均匀地反射。反射光在不同方向上的多少分布,再结合入射光的方向所构成的函数,称为bidirectional reflectance distribution functionBRDF),记作clip_image096,表示沿clip_image098方向照射到clip_image066[3]处的光在clip_image068[1]方向上的分布。准确地说:

clip_image100

并非所有的物体表面的反射都能用BRDF来建模,譬如通透的玉石(入射光可以从某一处进入玉石内部,然后从另一处穿出)等。一个把透明物体的表面纳入考虑的函数叫做bidirectional scattering distribution functionBSDF),它描述了所有方向的入射光和出射光的分布;Bidirectional surface scattering reflectance distribution functionBSSRDF)则更加强大(使用起来也更为困难),它可以描述前面提到的通透的玉石对光的作用。在这里,为了简化问题,假设所有的物体表面都使用BRDF描述。


六、BRDF的几个性质

  由BRDF的性质可知,某不透明的、不发光的表面上某一点clip_image066[4]处朝clip_image068[2]Radiance是此点反射外来光的结果,可表示为

clip_image102

其中clip_image104是从clip_image106方向来的光在clip_image068[3]方向上反射的结果。根据BRDF的定义有

clip_image108

于是,

clip_image110

该式在之后会介绍的渲染方程中扮演了重要的角色。

  Reciprocity:规定任意BRDF满足clip_image112,由此,不妨将BRDF记作clip_image114

  能量守恒:单位面积的入射能量为

clip_image116

而单位面积反射的总能量为

clip_image118

于是由能量守恒:

clip_image120


七、渲染方程(The Rendering Equation

  clip_image064[1]可以被分为两部分:clip_image066[5]处自身向clip_image068[4]方向发出的光和clip_image066[6]点反射外来光产生的光。即

clip_image122

其中clip_image124是自发光项,clip_image126是反射项。根据6中的推导,反射项clip_image126[1]可以被表示为

clip_image128

代入得

clip_image130

这就是所谓的渲染方程。可以看到该方程是递归的,且包含了一个不易计算的积分(只有在某些极简单的场景下才能求出解析解)。几乎所有的全局照明算法都是在求解渲染方程,因此称其为图形学的理论基石之一也不为过。

转载于:https://www.cnblogs.com/AirGuanZ/p/6389628.html

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

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

相关文章

mysql 开发规范_专业级的MySQL开发设计规范及SQL编写规范

在团队开发过程中为了项目的稳定,代码的高效,管理的便捷制定内部种开发设计规范是必不可少的,这里分享一份我们定义MySQL开发设计规范包括表设计规范,字段设计规范,SQL编写规范数据库对象命名规范数据库对象命名规范的…

C++之explicit关键字使用总结

1、explicit关键字介绍 C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 2、贴代码 #include <iostream> #include <stdi…

系统下载地址

系统下载地址 http://pan.baidu.com/s/1o6hVbPC 其中有xp win7和win8 32位 win7和win8 64位转载于:https://blog.51cto.com/freedom886/1403433

聊一聊DTM子事务屏障功能之SQL Server版

背景 前面写了两篇&#xff08;聊一聊如何用C#轻松完成一个SAGA分布式事务和聊一聊如何用C#轻松完成一个TCC分布式事务&#xff09;如何用 C# 基于 DTM 轻松实现 SAGA 和 TCC 的分布式事务&#xff0c;其中有一个子事务屏障的功能&#xff0c;很好的处理了空补偿、悬挂、重复请…

更为详细的Txtsetup.sif文件解释

更为详细的Txtsetup.sif文件解释;代码页定义, 以免文本安装模式下无法正常显示简体中文 (以下基本都是跟简体中文相关的, 不同语言版本的 Windows, 此处定义也不同)[nls]AnsiCodepage c_936.nls,936OemCodepage c_936.nls,936MacCodepage c_10008.nls,10008UnicodeCasetable…

C++类与const关键字

1、const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字 const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的 2、const 成员函数也称为常成员函数。 常成员函数需要在声明…

Dos中转义符

遇到个问题&#xff1a; java test R<file> 11 22 按理说应该打印 R<file>1122但是&#xff0c;系统报错&#xff0c;写的是系统找不到指定文件。 是"<>"引起的&#xff0c;加上Dos转义符中"^"即可。 java test R^<file^> 11 22 测…

ORA-00257+mysql_ORA-00257错误的解决办法

author&#xff1a; headsen chendate&#xff1a; 2018-04-17 11:12:39notice&#xff1a;个人原创&#xff0c;转载请注明作者和出处&#xff0c;否则依法追击法律责任。1&#xff0c;oracle数据库正常使用中&#xff0c;突然报ora-00257的错误&#xff0c;原因是归档日志满…

可穿戴设备对企业的积极意义

在耐克裁掉该公司的FuelBand运动手环硬件部门后&#xff0c;众多媒体和肇事者即开始唱衰可穿戴设备。在这些唱衰可穿戴的人总&#xff0c;有一些人从来没有用过可穿戴设备&#xff0c;有的甚至都没有见过可穿戴设备&#xff0c;他们只是根据自己的臆想&#xff0c;过往的经验&a…

学习路线

为什么80%的码农都做不了架构师&#xff1f;>>> 一、构想 1.专门制定某领域学习路线。 2.为人们进入某领域而学习提供依据。 转载于:https://my.oschina.net/kun123/blog/838360

C++之inline函数使用总结

一、C++为什么引入inline函数? 主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题。 C语言中的宏定义,它使用预处理器实现,没有了参数压栈、代码生成等一系列得到操作,因此效率很高。 但缺点如下: 预处理器符号表中的简单替换,不能进行参数…

数字图像处理技术在TWaver可视化中的应用

数字图像处理&#xff08;Digital Image Processing&#xff09;又称为计算机图像处理&#xff0c;它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。常用的图像处理方法有图像增强、复原、编码、压缩等&#xff0c;数字图像处理应用领域非常广泛。具体关于数字…

WPF 实现调用本机摄像头~

WPF开发者QQ群&#xff1a;340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着很久前的上一篇此项目使用了OpenCVSharp加载本地摄像头&#xff0c;多个摄像头支持切换展示&…

python process 函数_Python Process创建进程的2种方法详解

前面介绍了使用 os.fork() 函数实现多进程编程&#xff0c;该方法最明显的缺陷就是不适用于 Windows 系统。本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法。Python multiprocessing 模块提供了 Process 类&#xff0c;该类可用来在 Windows 平台上创建新进程。…

全球增长最快域名解析商Top10:中国占据四席

IDC评述网&#xff08;idcps.com&#xff09;04月29日报道&#xff1a;根据国外域名统计机构DailyChanges最新实时数据显示&#xff0c;4月27日&#xff0c;在全球增长最快的十家域名解析服务商榜单中&#xff0c;中国占据四个席位。上榜的中国域名解析商分别是&#xff1a;51D…

webpake-node-sass 报错

问题描述&#xff1a; npm run dev 就报错&#xff0c;在安装node-sass错误 解决方法 &#xff1a; 找到node_modules下的node-sass文件&#xff0c;进入&#xff0c;如果没有vendor文件夹&#xff0c;就创建一个空文件夹&#xff0c;命名为vendor。 1:下载 对于版本的 binding…

C++之‘nullptr’ was not declared in this scope

在vim里面写了一个简单cpp文件,为了避免野指针,需要指针初始化 char *p2 = nullptr 1、编译时报错如下 2、解决办法 编译加上 g++ -std=gnu++0x int.cpp -o int 3、C里面的null和C++里面的nullptr、NULL介绍 NULL在C++中的定义 /* Define NULL pointer value */ #ifndef …

IOS原生地图与高德地图

原生地图 1、什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评&#xff0c;陌陌&#xff0c;微信&#xff0c;美团等需要用到地图或定位的App 2、定位方式 1.GPS定位 2.基站定位 3.WIFI定位 3、框架 MapKit:地图框架&#xff0c;显示地图 …

想说爱你不容易 | 使用最小 WEB API 实现文件上传

前言在 .NET 6 之前&#xff0c;实现文件上传功能十分简单&#xff1a;[HttpPost("upload")] public async Task<IActionResult> Upload(IFormFile file) {//对file执行操作return Ok(file.FileName); }但是&#xff0c;当使用 .NET 6 的最小 WEB API 来实现相…

python商用_python实现sm2和sm4国密(国家商用密码)算法的示例

GMSSL模块介绍GmSSL是一个开源的加密包的python实现&#xff0c;支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证&#xff0c;开源且可以用于闭源的商业应用。安装模块pip install gmsslSM2算法RSA算法的危机在于其存在亚指数算法&#xff…