PBR Step by Step(一)立体角
转载请注明出处:http://www.cnblogs.com/jerrycg/p/4924761.html
本系列从零起步,作为学习笔记与大家分享,从基础的数学和图形理论,一步一步实现基于物理的渲染。
Reference:《PBRT》、《Ray Tracing from the Ground Up》
由于光源是三维空间中的辐射光能,对于其传播范围通常使用立体角来描述,先来看一下什么是立体角。
立体角Solid Angles
立体角表示一个锥面所围成的空间部分,用符号\(\omega \)表示。
立体角是以圆锥体的顶点为心,半径为r的球面被锥面所截得的面积来度量的,度量单位为“球面度”(steradian,符号∶sr)。球面度表示为三维弧度。
在球坐标系中,球面的极小面积\({dA}_{2}\)为:
\({dA}_{2}=({r}\,\sin\theta\, {d}\varphi )({r\,d\theta })={r}^{2}(\sin\theta\,{d\theta }\,{d}\varphi)\)
整个球面面积为\({dA}\)的积分:
\({A}=\int {dA}_{2}=\int_{0}^{2\pi}\int_{0}^{\pi}({r}\,\sin\theta\, {d}\varphi*{r\,d\theta })={r}^{2}\int_{0}^{2\pi}{d}\varphi\int_{0}^{\pi}\sin\theta\,{d}\theta\)
极小立体角定义为球面面积与球半径平方的比值,即:
\({d\omega} = \frac{dA}{{r}^{2}}=\sin\theta\,{d}\theta\,{d}\varphi\)
对上式积分:
\({\omega} = \int_{0}^{2\pi }{d\varphi }\int_{0}^{\pi } \sin \theta\, {d\theta }={4\pi }\)
可知,最大立体角就是单位球体的表面积。
半球积分
半球积分方程表示为:\({I} = \int_{\omega}{f(\theta, \phi)\cos \theta \, d\omega}\)
其中,\({(\theta, \phi)} \in {[0, \frac{\pi}{2}] [0, 2\pi]}\),\({\omega \in [0, 2\pi]}\),\(\cos\theta \, d\omega\)表示立体角在水平面\({(x, y)}\)上的投影,又称为投影立体角。
当函数\({f(\theta, \phi)} = \cos^{n-1} \theta \)时,
\({I} = \int_{2\pi} \cos^{n} \theta \, {d\omega}\)
\(= \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}}{\cos^{n}\theta \sin\theta \, d\phi}\)
\(= \int_{0}^{2\pi} d\phi \int_{0}^{2\pi} {\cos^{n}\theta \sin\theta \, d\theta} \)
\(= {2\pi \int_{0}^{\frac{\pi}{2}} \cos^{n}\theta \, \sin\theta \, d\theta}\)
\(= {2\pi \left[\frac{{\cos\theta}^{n+1}}{n+1} \right]_{0}^{\frac{\pi}{2}}} = \frac{2\pi}{n+1}\)
最终得出当\({f(\theta, \phi)} = \cos^{n-1} \theta \)时,半球积分为:\({I} = \frac{2\pi}{n+1}\)
PBR 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 ...
- Step by Step 创建一个新的Dynamics CRM Organization
原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...
- Step by step Install a Local Report Server and Remote Report Server Database
原创地址:http://www.cnblogs.com/jfzhu/p/4012097.html 转载请注明出处 前面的文章<Step by step SQL Server 2012的安装 &g ...
- Step by step Dynamics CRM 2013安装
原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处 SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...
- Step by step 活动目录中添加一个子域
原创地址:http://www.cnblogs.com/jfzhu/p/4006545.html 转载请注明出处 前面介绍过如何创建一个域,下面再介绍一下如何在该父域中添加一个子域. 活动目录中的森林 ...
- SQL Server 维护计划实现数据库备份(Step by Step)(转)
SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server ...
- 转:eclipse以及step into step over step return的区别
首先来讲一下step into step over step return的区别: step into就是单步执行,遇到子函数就进入并且继续单步执行:(F5) step over是在单步执行时,在函数 ...
- [转]Bootstrap 3.0.0 with ASP.NET Web Forms – Step by Step – Without NuGet Package
本文转自:http://www.mytecbits.com/microsoft/dot-net/bootstrap-3-0-0-with-asp-net-web-forms In my earlier ...
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(6)—处理实体complex属性
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...
随机推荐
- VC孙鑫老师第八课:你能捉到我吗?
第一步,首先在对话框窗口上放上两个一模一样的按钮控件 第二步,由于是按钮响应鼠标移动上去的事件,因此需要重新派生按钮类: 第三步,在窗口类中声明并使用自定义按钮对象(记得在窗口类中包含自定义按钮类的头 ...
- javascript复习笔记
/* Javascript:用来在页面中编写特效,和HTML.CSS一样都是有浏览器解析 Javascript语言: 一.JS如何运行(javascript,jscript,vbscript,appl ...
- 自己看之区间DP
//菜鸡制作,看的时候可能三目运算符略烦;;; 区间DP入门题:Brackets 地址:http://59.77.139.92/Problem.jsp?pid=1463 分析(对区间DP的代码原理进行 ...
- [Leetcode] N-Queens 系列
N-Queens 系列题解 题目来源: N-Queens N-Queens II N-Queens The n-queens puzzle is the problem of placing n qu ...
- linux下C语言实现的内存池【转】
转自:http://blog.chinaunix.net/uid-28458801-id-4254501.html 操作系统:ubuntu10.04 前言: 在通信过程中,无法知道将会接收到的 ...
- 用C#实现对MSSqlServer数据库的增删改查---DAL层
说明:本人完成的工作是对传感器--超声波物位计进行硬件集成,上位机通过串口接收传感器数据并将其存到数据库中:在DAL层实现对数据库的增删改查,其中包含两个数据表分别是WaterLevelSet表和Wa ...
- python操作上级子文件
. └── folder ├── data │ └── data.txt └── test1 └── test2 └── test.py import os '***获取当前目录***'print o ...
- logging模块配置笔记
logging模块配置笔记 log文件的路径 #判断在当前的目录下是否有一个logs文件夹.没有则创建 log_dir = os.path.dirname(os.path.dirname(__file ...
- juery下拉刷新,div加载更多元素并添加点击事件(二)
buffer.append("<div class='col-xs-3 "+companyId+"' style='padding-left: 10px; padd ...
- 欧拉回路&欧拉通路判断
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...