Q74:面积光源(Area Light)
来源:互联网 发布:顶尖文案网 知乎 编辑:程序博客网 时间:2024/05/21 06:56
74.1 理论推导
前面,我们已经学习了点光源。其实现实中所有的光源都是有一定大小的,所以点光源在严格意义上是不存在的。在严格意义上,所有的“点光源”都是“面积光源”。
一方面,由于面积光源自身有一定大小,所以能够像场景中的普通物体一样被看到;另一个方面,面积光源作为光源可以为场景中的其他物体提供入射光。如下图示意:
74.1.1 面积光源为其他物体提供入射光
我们重点看看面积光源是怎么为其他物体提供入射光的。
面积光源=几何物体+发光材料。
我们在“Q72:渲染方程(Rendering Equation)”章节学过渲染方程的面积形式:(重复贴图如下)
74.1.2 面积光源自身被看到
74.2 C++代码实现
我们先看看需要添加那些代码。
1,面积光源类AreaLight。由“式子4”,我们知道AreaLight类至少提供L、V、G三个参数。而L是由发光材料决定的,所以,还要新建一个发光材料类Emissive;V、G是由几何物体的采样点决定,所以还要新建一个几何物体类Rectangle。
2,发光材料类Emissive。一方面为了给AreaLight类提供光L,所以需要get_Le()成员方法;另一方面,由“式子5”为了让自身被看到,则需要shade()着色函数(发光物体的着色,一般直接返回“式子5”的值即可)。
3,几何物体类Rectangle。根据“式子4”,几何物体类需要提供采样点p’j、采样点的采样概率p(p’j)、几何物体在采样点处的法向量n’j。为了提供采样点,则需要采样相关的成员方法set_sampler()、sample()等;为了提供采样点的采样概率,则需要成员方法pdf();为了提供采样点处的法向量,则要成员方法get_normal()。
4,为了和其他光源进行区分,所有材料新建一个专门的着色函数area_light_shade()(相当与之前的shade(),只是area_light_shade()专门给面积光源用的)。
5,既然材料中新建了专门的着色函数area_light_shade(),所以需要新建一个Tracer来call这个专门的着色函数(之前的RayCast::trace_ray()方法call的还是之前的shade())。这个新的Tracer被称为“AreaLighting”。
74.2.1发光材料类Emissive
74.2.2几何物体(Rectangle或者Sphere)
74.2.2.1 若面积光源对应的几何物体为Rectangle
74.2.2.2 若面积光源对应的几何物体为Sphere
74.2.3面积光源(AreaLight)
74.2.4被照射的材料(这里以Matte为例)
74.2.5新的Tracer(AreaLighting)
74.2.6 Wrold::build()中初始化面积光源
74.2.6.1若面积光源对应的几何物体为Rectangle
74.2.6.2若面积光源对应的几何物体为Sphere
74.3 测试图形
74.3.1 Rectangle面积光源
Rectangle长25、宽25、中心位置(0,-100,-40),单个像素点采样次数100,分辨率400*400
Rectangle长50、宽50、中心位置(0,-100,-40),单个像素点采样次数100,分辨率400*400
Rectangle长100、宽100、中心位置(0,-100,-40),单个像素点采样次数1,分辨率400*400
Rectangle长100、宽100、中心位置(0,-100,-40),单个像素点采样次数100,分辨率400*400
Rectangle长100、宽100、中心位置(0,-100,-40),单个像素点采样次数200,分辨率800*400
Rectangle长100、宽100、中心位置(0,-100,-40),单个像素点采样次数200,分辨率1200*400
74.3.2 Spherical面积光源
Sphere半径12.5、中心位置(0,-100,-40),单个像素点采样次数100,分辨率400*400
Sphere半径25、中心位置(0,-100,-40),单个像素点采样次数100,分辨率400*400
Sphere半径50、中心位置(0,-100,-40),单个像素点采样次数1,分辨率400*400
Sphere半径50、中心位置(0,-100,-40),单个像素点采样次数100,分辨率400*400
Sphere半径50、中心位置(0,-100,-40),单个像素点采样次数200,分辨率800*400
明显球面光源的噪声比矩形光源要多。是因为球面采样的是整个球面,而被照射的物体每次只能看到半个球面;而矩形光源中,时刻看到的都是整个矩形面。
74.4 其他说明
完整的代码,参考:http://download.csdn.net/detail/libing_zeng/9768236
Referrance
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.
- Q74:面积光源(Area Light)
- 光源(Light)
- POJ1654-Area(多边形面积)
- 延迟渲染中光源的体积光(Light Volumn)
- light oj 1305 - Area of a Parallelogram (数学 平行四边形坐标和面积)
- POJ 1654 Area (多边形面积)
- POJ 1654 Area(任意多边形面积)
- poj 1654 Area(叉积求多边形面积)
- POJ1645-Area(简单多边形面积计算)
- 1071 The area 求面积(积分)
- POJ 1654 Area(差积求多边形面积)
- POJ 1654 Area(多边形面积)
- The area (hdu1071)积分求面积
- LeetCode 223 Rectangle Area(矩形面积)
- POJ 1654 Area (求多边形面积)
- poj 1654 Area (叉积求面积)
- POJ 1654 Area (有向面积求多边形面积)
- POJ1654 Area(多边形面积,叉积求三角形面积)
- php四种排序算法
- Picking up an OOP(2) -JAVA-Interface
- 网络请求:HttpURLConnection、HttpClient、HttpUtils、Volley
- repo sync失败后自动重试
- 关于基于elasticsearch的全文检索 建立索引 查询
- Q74:面积光源(Area Light)
- Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Filter
- 【系统设计】如何使用缓存
- Mysql数据库内容导出备份
- 布局资源设置背景边界线,圆弧等
- 在react 0.13.2中使用react的数据双向绑定
- Java利用字符串实现整数格式相加求和
- sql两个日期间剔除周末的间隔时间
- 友盟第三方登陆