转载请注明出处: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}\)

最新文章

  1. jsp页面动态显示时间
  2. Winform合并多个Excel文件到一个文件中(源文件.xls,实际是.xml)
  3. Tree2cycle
  4. 转:Linux内存管理之mmap详解
  5. 通向码农的道路(enet开源翻译计划 一)
  6. jenkins 安装 SVN Publisher 后向 svn 提交代码报错: E170001: Authentication required for...
  7. 如何做好移动安全(梆梆加固后的APK破解提取dex)
  8. ReentrantLock与Condition构造有界缓存队列与数据栈
  9. 从javascript发展说到vue
  10. png 变透明
  11. error: <item> inner element must either be a resource reference or empty.
  12. [Eclipse+PyDev]ImportError: DLL load failed:找不到指定的模块 解决方案
  13. 分布式爬虫之elasticsearch基础6(bluk)
  14. hadoop权威指南学习(一) - 天气预报MapReduce程序的开发和部署
  15. EventBus 源码学习
  16. 基于asp.net mvc的近乎产品开发培训课程(第二讲)
  17. 解决ios10以上版本缩放问题
  18. 【开源.NET】 轻量级内容管理框架Grissom.CMS(第二篇前后端交互数据结构分析)
  19. 20145331魏澍琛《网络对抗》Exp2 后门原理与实践
  20. [javaSE] 数据结构(二叉树-遍历与查找)

热门文章

  1. 51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)
  2. k8s+docker学习连接汇总
  3. .net core 中 identity server 4 之术语
  4. HTML DOM 节点介绍(nodeName,nodeValue,nodeType)
  5. 前端观察:HTML5做得好,收入不比 iOS 差
  6. GO-指针与函数
  7. python自动开发之(算法)第二十七天
  8. Linux系统调用、新增系统调用方法【转】
  9. Power Profiles for Android
  10. Vue.js写一个SPA登录页面的过程