快速跳转:
1、矩阵变换原理Transform(旋转、位移、缩放、正交投影、透视投影)
2、光栅化(反走样、傅里叶变换、卷积)
3、着色计算(深度缓存、着色模型、着色频率)
4、纹理映射(重心坐标插值、透视投影矫正、双线性插值MipMap、环境光遮蔽AO)
5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)
6、阴影映射(Shadow Mapping)
7、光线追踪原理(线面求交、预处理光追加速)
8、辐射度量学与光线追踪
9、蒙特卡洛路径追踪(Path Tracing)(光源采样)
10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
11、渲染前沿技术介绍(双向路径追踪BDPT、MLT、光子映射、实时辐射度、外观建模)
12、相机(视场、曝光、光圈(F-Stop)、薄棱镜近似、CoC、景深)
13、光场、颜色与感知
14、动画(物理模拟、质点弹簧系统、粒子系统、运动学、动作捕捉、欧拉方法)
Lecture19
1 相机
(1)图像 = 合成 + 捕捉 (图像可以是合成的,也可以是捕捉得到的)
(2)快门和传感器
- 快门:可以控制光在一个极短的时间内进入相机
- 传感器:在曝光过程中,在传感器每个点上记录其接受到的irradiance
(3)针孔相机和透镜相机的区别
- 针孔相机,利用小孔成像的原理,如上图站立的人,身上每个点都在向四面八方反射光线,只有射向小孔的一条光线能通过,最终打在传感器上。光线追踪利用的是针孔摄像机模型
- 透镜相机(常用),用一个凸透镜,可以允许更多的光通过。就人生上烟杆前端这一点来说,它反射出去的光,可以有多条以不同的折射角度 射到成像平面上,会更清晰一些。
- 如果没有透镜和小孔,直接用传感器记录光线,不能得到正确结果,因为传感器并不区分来自哪个方向的光线,导致传感器上一个点记录了所有方向的光线,非常杂乱,得到的只会是一团浆糊。
2 视场(Field of Vied)(FOV)
视场就是相机能看到的角度范围
(1)小孔摄像机的视场计算
- 定义好传感器的高度h,和焦距 f,能很轻松的算出
F
O
V
=
2
a
r
c
t
a
n
(
h
/
2
f
)
\\displaystyle FOV = 2arctan(\\frac{h/2}{f})
- 通常描述焦距都会换算到35mm所对应的焦距长度。(比如一个手机,一共就不到1cm厚度,但是它描述的焦距为28mm,其实是等效到35mm传感器上所对应的焦距)
- 通常会固定传感器大小,用焦距衡量视场, 17mm —— 104°(广角), 50mm —— 47°(普通), 200mm —— 12°(远摄)
- 从图上很容易可以看出,视场与焦距成反比,与传感器尺寸成正比。可以认为传感器越大、焦距越长,则相机越好
3 曝光(Exposure)
H = T x E
- H:曝光(Exposure)
- T:曝光时间(time),通过快门控制多长时间光可以进入
- E:辐照度(irradiance),感光器的单位面积上接收到的辐射通量总和,通过光圈大小(aperture)和焦距控制
举例理解:
在比较明亮的场景中,曝光时间控制短一些,在这特别短的时间内,辐射通量E是比较大的,所以能得到比较强的曝光
在比较昏暗的场景中,辐射通量E比较小,想要得到更大的曝光,则需要通过控制快门使曝光时间更长一些。
摄影中的曝光影响因素
- Aperture size(光圈大小):通过开关光圈改变f-stop(光圈级数)。大光圈会模糊,小光圈更清晰。原因见后面章节CoC介绍
- Shutter speed(快门):改变传感器每个像素吸收光的时间,快门打开时间长,拍摄运动的物体就会拖影,因为物体在你光圈打开这段时间内,每刻都在运动,而相机把每一刻的信息都记录下来了(如:传感器上像素点1记录了小人的头顶的那个点的能量(颜色),下一刻,小人往右跑了,头顶的位置变了,像素点2记录到了,以此类推,多个像素都记录过这个头顶的颜色,所以模糊。换一个角度思考,某个特定像素1,在某时刻记录了物体身上某个点的颜色,下一时刻,物体移动了,像素1又接收到了另一个颜色信息,也记录下来,因此在快门打开时间内,像素1记录了物体上很多的颜色,所以这个像素很会很模糊)
- ISO gain(感光度):可以简单的理解成后期处理,把结果乘上一个数。在信号的角度理解,这样的操作同时将噪声放大
4 光圈(F-Number)(F – Stop)
- 写作FN 或 F/N,其中N就是F数,可以简单形象的理解为光圈直径的倒数。
- 实际上F-Stop的数值为 焦距与光圈直径之比,即f/D
综合应用
- 高速摄影:特别小的曝光时间,短时间内拍摄许多帧照片,然后按正常速度播放。采用大光圈提高亮度
- 延时摄影: 特别长的曝光时间、小光圈
5 薄透镜近似(Thin Lens Approximation)
目前都不会使用单个透镜做成像,而是用一个透镜组。
真实的平面凸透镜并不会使光聚集于一点
理想的薄透镜应该有以下性质 (用透镜组来实现)
- 任意平行光穿过透镜会聚焦在焦点处
- 任意光通过焦点射向透镜,会变为互相平行的光
- 假设薄透镜的焦距可以任意改变
薄透镜公式
这个公式的作用:已知透镜的焦距
f
f
f
- 给出成像平面摆在距离透镜多远的位置,可以知道物体在什么距离最清晰,即可算出focal plane
- 给出物体与透镜的距离,则可算出成像清晰的平面应该与透镜的处于什么距离
6 Circle of Confusion(CoC)
CoC的尺寸就是,一个点成像后变成一个圆,这个圆的尺寸
下图所示,物距为zo的点,经过透镜后,聚焦在离透镜zi的距离上(通过上面波透镜公式算出),如果想让成像清晰有两个办法:
- 点不动,成像平面放在zi处,这个zi是根据波透镜公式得出
- 成像平面不动,点移动到Focal Plane上
计算CoC尺寸(就是算图中的C)
相似三角形推导过程省略,最后的等式中可以看出C和A成正比 ——光圈越大越模糊
以下两张图,可以很形象的看出位于焦平面成像清晰,不位于焦平面则成像模糊的原因
大小光圈对比图
7 渲染中模拟透镜
一般光线追踪使用的是针孔摄像机模型,但是如果想做出真实相机中的模糊效果,需要模拟薄透镜相机。
光追中模糊效果实现步骤:
- 定义成像平面尺寸、透镜焦距
f
\\Large f
z
i
\\Large z_i
- 根据公式公式
1
f
=
1
z
o
+
1
z
i
\\large\\displaystyle \\frac{1}{f} = \\frac{1}{z_o}+\\frac{1}{z_i}
z
o
\\Large z_o
- 渲染
- 遍历每个感光器上的点
x
′
\\large x'
x
′
\\large x'
x
′
′
′
\\large x'''
- 光追每次仅一条trace,因此在透镜平面随机采样一个点
x
′
′
\\large x''
以
x
′
′
作为光线的起点
\\color{Red}以\\mathbf{x''}作为光线的起点
- 以
x
′
′
′
−
x
′
′
∣
x
′
′
′
−
x
′
′
∣
\\displaystyle\\large \\frac{x'''- x''}{|x'''-x''|}
d
⃗
\\large\\vec{d}
- 计算最近交点,最终得到radiance,记录到
x
′
\\large x'
- 遍历每个感光器上的点
上面为闫老师介绍的理论方法,在Ray Tracing in one weekend中,学习到了下面这种简化实现方法
1.先谈谈针孔相机的原理
- 场景中的物体的某个点朝着各个方向反射光线,其中一条光线穿过针孔打在了成像平面上,成像平面记录这条光线的能量(颜色)。但是,可以看到如果成像平面在针孔的后面,结果一定会是一张颠倒的图像
- 而对于光线追踪而言,考虑从相机发射光线,因此在光线追踪的做法是在成像平面选择一个x`像素中心作为光线起点,射向针孔与场景求交,计算着色后记录到该像素中。
2.在光追代码中针孔相机模型
- 成像平面改放在针孔的前面,这样的成像结果就不会颠倒
- 实现步骤:
- 遍历成像平面的每个像素点(一般喜欢叫做近平面,因为类似于光栅化中的视锥体近平面)
- 以相机坐标(针孔)为光线的起点,朝像素发射光线
- 击中物体的颜色计算作为该像素点的颜色值
3.光追代码中的透镜相机实现景深模糊效果(貌似并不是按照理论来做的,仅仅是效果类似)
- 首先把上面的针孔换成一个有半径的圆盘,圆盘中的任意一个点作为光线的起点
- 把近平面直接放在场景的focal plane,这不是根据公式计算出来的,而是你想让哪个距离的物体清晰,就放在那个距离处
- 这样就能让最终的出图变得有景深的效果
- 首先,我们每个像素的采样次数并非一次,即有多个trace
- 其次,我们每个trace的起点是圆盘内随机生成,直接射向近平面的某个像素的某个采样点,这些采样点特别近,认为同射向一点。如果物体刚好位于focal plane附近,则每一条光线基本上都会相交于同一个点,成像较为清晰。如果特别远,每个trace的交点就差距较大,最后颜色取平均到同一个像素,就会很模糊。
下面两个蓝色三角形距离成像平面较远,3个trace与三角形的交点相差也远,成像模糊
这位于近平面的三角形交点就相差无几,最终成像清晰
总之一句话:把film plane放在focus plane
8 景深(Depth of Field)
光圈的大小会影响模糊的范围,只有在Focal Plane上的物体可以清晰成像。
CoC和景深的关系
- 景深:场景中的一段深度
- 在focal point 附近的一段范围内的CoC并不大(比一个像素小 或者差不多大),如果从场景中来的光经过理想化的透镜后落在这一段内, 可以认为场景中的这段深度成像是清晰的,其他深度则是模糊的
计算景深 - 其实推导过程比较简单,总之 DOF = DF – DN 算出来就行了
暂无评论内容