GAMES101-闫令琪 https://www.bilibili.com/video/BV1X7411F744/

https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

13 Ray Tracing 1 光线追踪

光栅化不太好表现全局的效果

  • 光线沿直线传播
  • 光线不会互相碰撞
  • 光线从光源出发最后到达摄像机(光线可逆性,也可以任务从摄像机发出光线打到物体上,最后到光源上)

光线投射:对于每一个像素,从摄像机连成一条线穿过这个像素,再从光影连一条线到这个像素,判断是否在阴影里

  • 从摄像机到画面,每一个像素投射出一根光线,与场景相交;
  • 会与很多物体相交,场景中有遮挡,所以求最近的交点;
  • 找到焦点后和光源连接第二条光线,判断是否对光源可见,是否在阴影中
  • 通过入射、法线、出射计算折射,然后写回这个像素的值

Whitted风格光线追踪:可以在任一点继续传播;由于光线弹射的次数多,在每一个弹射的点都计算着色的值,都会被加到这个像素里

交点

光线起点 o,传播方向 d

交点p必须同时满足射线方程和球面方程;将t解出来必须有实际意义;不能是个虚数,得是个实数才能才能有交点 t 得是正的,b²大于4ac;最小的t就是交点

  • 射线: r(t) = o+td, 0≤t<∞
  • 一般隐式曲面:p:f(p)=0
  • 替代射线方程:f(o+td)=0

三角形网格的光线交点:

能判断是不是在物体内部,随便一个点发射出光线,如果你这个点在物体内,与这个物体交点是奇数,在外是偶数

判断光线和三角形交点,分解成两个问题:光线与三角形所在平面求交;再判断是不是在三角形内

  • 三角形所在平面:通过法线和一个点定义,这个点满足和法线垂直(法线定义了这个平面的方向,点定义了这个方向上的具体位置)
  • 求光线和平面交点:还是同时满足两个方程,使用Möller Trumbore Algorithm算法可以直接解出三角形内交点

包围盒

避免交点的快速方法:用简单的体积包围复杂对象

  • 对象完全包含在该体积内
  • 如果光线没有击中该体积,就不会击中对象
  • 因此,先测试边界体积(BVol),如果击中,再测试对象是否击中

方法体是三个对面形成的交集,通常用的是轴对齐包围盒(AABB)

  • 二维情况下,可以判断 t 什么时候会和两个面有交点,将xy两个结果做交集就得出什么时候进入和出去盒子三维情况下,三个对面光线都进去了才能说光线进入了盒子,光线离开任意一个面就离开了这个盒子
  • 求出三个对面光线进入的最大值,最小的时间就是光线离开任意一个面的时间
  • 进入时间 < 离开时间,正面有交点,光线进入了盒子

如果光线离开盒子的时间是负的,正面它在光线身后;如果光线在盒子里,就是在正的时间离开而且在负的时间进入

光线和AABB有交点:进入时间 < 离开时间 && 退出时间 >= 0

与轴垂直计算更方便


14 Ray Tracing 2

空间划分

统一空间划分(网格)

预处理:先找到场景的包围盒;然后将其分成一个个相同小格子;物体表面与格子相交的地方都标记成某一类型

光线追踪:判断与光线相交的格子是否是被标记的格子,如果是则判断是否与物体相交(假设光线与格子求交很容易)

空间划分

  • 八叉树 Oct-Tree:在2D空间位四叉树,在3D空间内是八叉树,维度更高数量呈几何式增长
  • KD-Tree:每次划分两个,xy交替划分
  • BSP-Tree:每次选一个方向分开,非平行,不好计算

KD-Tree:

在光线追踪之前建立

  • 当前节点沿着哪个方向划分;
  • 划分在哪;
  • 对于中间节点一定有2个子节点
  • 与物体相交的信息只需要存储在叶子结点上,不存在中间节点上

如果光线和某一个格子有交点,那么光线和它两个子节点可能都有交点,所以都进行判断,直到光线到叶子节点,如果有交点,叶子节里所有物体进行求交,记录最近的那个;与光线没有交点的格子直接忽略

  • 建立不简单,假如三角形的点不在盒子内,但还是可能与物体相交
  • 一个物体有可能出现在多个叶子节点当中

对象划分

Bounding Volume Hierarchy (BVH)

  • 首先还是求整体的包围盒
  • 递归地将物体分成两堆,
  • 重新求包围盒
  • 足够少时时停止(比如<=5个)
  • 实际物体记录在每个叶子结点

BVH划分一个物体都在一个包围盒内,但是包围盒直接会有相交

  • 不断切换xy轴进行划分
  • 每次都划分节点中最长的轴
  • 取中间的物体(中位数),两边数量差不多,树的两边数量差不多

15 Ray Tracing 3

辐射度量学

如何去描述光照,在物理上定义光早的方法

Radiant flux 辐射通量、intensity 强度、irradiance 辐照度、radiance 辐射亮度

辐射能和通量 Radiant flux(power)intensity

辐射能是电磁辐射的能量。它以焦耳为单位进行测量,并用符号表示:Q [J =Joule]

Radiant flux(power) 辐射通量(功率)是单位时间内发射、反射、传输或接收的能量。φ≡ dQ/dt [W = Watt] [lm = lumen]*

或者单位时间通过某平面的数量,就认为是他的flux

  • 光源辐射出来的能量 Radiant Intensity
  • 物体表面接收到多少能量 Irradiance
  • 光线传播过程中的能量 Radiance

立体角:

  • 定义一个角度使用 弧长 / 半径,整个圆是2π
  • 立体角是在三维空间,面的面积 / 半径的平方,整个球是4π。微分立体角 θ和φ各变化一点点会引起多大立体角的变化
  • 单位立体角

Radiant Intensity :power per unit solid angle 单位立体角上的辐射能量

在任何一个方向上的亮度,总共的亮度 / 单位立体角,power / 4π

辐照度 Irradiance

power per projected unit eara 单位面积上的辐射能量

unit area:面必须和光线垂直,如果不垂直需要把它变成投影过的垂直的方向。不垂直时接受到的光线要变小,像是阳光照射在地球上不同区域的夹角是不一样的所以会有温度差别。

是Irradiance(单位面积的能量)在衰减,而不是Intensity(单位立体角的能量,它是各锥形),越远对应的面积越大,立体角没变

辐射亮度 Radiance

Radiance描述光线的一些属性。power per unit solid angle, per projected unit eara辐射(亮度)是指表面在每单位立体角、每投影单位面积上发射、反射、透射或接收的能量。辐射亮度Radiance 在辐照度Irradiance 上增加了一个方向性,确定这个面往某一点辐射的能量。

  • 辐射亮度 Radiance:power per unit solid angle, per projected unit eara,能量 / 投影单位面积 / 单位立体角;某一面从某一方向接受到多少能量
  • 辐照度Irradiance:power per projected unit eara,能量 / 投影单位面积;某一面接受到多少能量∴ 辐射亮度 Radiance:辐照度Irradiance / 单位立体角
  • 强度Intensity:power per unit solid angle,能量 / 单位立体角;某一面向外某一方向辐射出多少能量∴ 辐射亮度 Radiance:强度Intensity / 投影单位面积

BRDF

双线反射分布函数 Bidirectional Reflectance Distribution Function (BRDF)光线从某一角度进来,会以怎样的方式反射,反射方向上会分布多少能量。描述了物体对光线如何作用,不同的材质会影响反射。

从 ωi 来的Radiance,会达到dA上转化成能量,这个能量又会反射到另外的方向上去。Radiance → Irradiance → Radiance

BRDF:考虑微小面积 dA 从某一微立体角 dE( ωi )接 收到的 Irradiance 会如何被分配到各个不同的立体角上去的比例。

反射方程

反射方程:任何着色点,任何输入方向,对观测方向的贡献,将所有入射方向的贡献都加起来就可以得到最后结果

反射方程告诉我们,从某一点观察一个着色点,需要考虑能够到达这个着色点的所有光线,除了光源其他物体也可能有光被反射到这个点上,是一个递归(光线不止弹射一次)

渲染方程

渲染方程:这个点从某一方向发射的光由两部分构成,一部分是自己产生向外发射的Radiance,另一部分是通过其他光源或者反射过来的入射Radiance,导致经过BRDF后这个方向的Radiance。

光线不止反射一次,同时不仅会接受光源直射的能量还有其他物体反射的光的能量。反射方程忽略了物体自发光,加上自发光就是渲染方程。

  • 假设一个点光源的情况:反射的光=自发光+反射光+BRDF+夹角的余弦
  • 好多点光源:把每一个点光源加起来
  • 面光源:点光源的集合,积分这个面光源的立体角考虑它所有覆盖的方向。
  • 如果有一些其他的物体,(将反射面当成光源,反正都是辐射出Radiance)
  • 这个点往某一方向辐射出去的Radiance,依赖于其他的点辐射出去的Radiance(递归)

从某一方向看向一个点,不知道这个能量是多少,但是物体自发光知道,反射光(从其他物体反射的Radiance)不知道,BRDF知道,入射角的余弦知道。知道物体是怎么发光的,以及定义物体的材质。

可以通过简化的方式将式子写出来,l 相当于辐射出去的Radiance,e是自发光发出去的能量,加上从其他物体表面的Radiance通过BRDF反射到当前位置上,会有多大的能量

还可以进一步简写写成算子的形式,L = E + KL,对于物体辐射出来的所以能量 = 所有光源辐射出的能量 + 辐射出来的能力被反射之后的能量(K反射操作符)

解渲染方程,算子可以使用泰勒展开,得到这样一个结果 L = E + KE + K²E + K³E + …

  • E:直接看到光源会看到什么,(直接光照)
  • KE:光源辐射出来的能量经过1次反射后会看到什么(间接光照)
  • K²E:光源辐射出来的能量经过2次反射后会看到什么
  • K³E:光源辐射出来的能量经过3次反射后会看到什么

光栅化能告诉我们的光线传播的内容只包括直接光照和一次反射。

全局光照

全局光照是直接和简介光照的集合。

全局光照会收敛到某一个亮度,光线反射次数多了之后变化不大,符合能量守恒性质。

(灯突然透明的原因:光线需要经过若干次的弹射才能进入物体并出来)


16 Ray Tracing 4

概率论

  • 概率是非负的
  • 所有概率加起来是1

求离散的随机变量:任何一个取值,乘以它的概率,然后加起来

期望:不断去取随机变量求它们的均值

  • 在连续情况下描述变量和分布。概率密度函数,(概率是曲线下这一段dx的面积)积分积等于1,
  • 求期望:任何一个取值,乘以它的概率密度,然后积分起来

函数的随机变量:

  • 对于函数的期望,也是将这个函数值,乘以它的概率密度,然后积分起来

蒙特卡洛积分

求定积分(面积)

  • 黎曼积分:通过将定义域分割成细小的区间并用矩形面积近似求和,然后取极限得到精确的曲边梯形面积。
  • 蒙特卡洛积分:通过在积分区域内随机采样并计算函数值的平均值乘以区域体积,利用大数定律近似估计积分值。

取xi位置的高度乘以ab边计算面积,通过多次采样xi进行平均

只需要在积分域内以一个pdf采样,其对应的fx除以概率密度px后求平均。

  • 采样数量越多,误差越小
  • 在X上积分就得采样X

路径追踪

Whitted-style ray tracing:光线打到光滑物体会沿镜面反射;光线打到漫反射物体则不会反射。会出现两个问题:

  • 对于 glossy 材质仍按照镜面反射
  • 光线打到漫反射物体后停止反射,光线打到diffuse不应该停住

求半球上的蒙特卡洛积分

fx就是渲染方程的所有东西,pdf就是如何对半球进行采样(这里是最简单的均匀采样,半球面面积是2π对应的立体角是2π,对其进行均匀采样,pdf在所有立体角上的积分为1,所以是1/2π)

适用于直接照明的正确着色算法

# 对于任意一个点p,出射方向ωo
shade(p, wo)
	# 在着色点往半球上发出N个不同的方向
  Randomly choose N directions wi~pdf
    Lo = 0.0
    # 对于任意一个选定的方向
    For each wi
    	# 从p点往这个方向连一条光线
      Trace a ray r(p, wi)
      # 如果这根光线打到了光源
      If ray r hit the light
      	# L_i:光源辐射出多少randiance,f_r:function reflection BRDF,cos,均匀采样的pdf
      	Lo += (1 / N) * L_i * f_r * cosine / pdf(wi)
	Return Lo

反射的radiance可以看做是光源的radiance,使用同样方法计算,加上一个分支就可以得到一个支持全局光照的追踪算法了

# 对于任意一个点p,出射方向ωo
shade(p, wo)
	# 在着色点往半球上发出N个不同的方向
  Randomly choose N directions wi~pdf
    Lo = 0.0
    # 对于任意一个选定的方向
    For each wi
    	# 从p点往这个方向连一条光线
      Trace a ray r(p, wi)
      # 如果这根光线打到了光源
      If ray r hit the light
      	#L_i:光源辐射出多少randiance,f_r:function reflection BRDF,cos,均匀采样的pdf
      	Lo += (1 / N) * L_i * f_r * cosine / pdf(wi)
      # 如果打到的是物体,则判断物体这个q点反射过来的能量是多少
      Else If ray r hit an object at q
        Lo += (1 / N) * shade(q, -wi) * f_r * cosine / pdf(wi)
	Return Lo

这样递归会有一些问题:光线数量会爆炸,只有N=1的时候不会爆炸

shade(p, wo)
	# 随机往一个方向去采样
  Randomly choose ONE direction wi~pdf(w)
  Trace a ray r(p, wi)
  If ray r hit the light
		Return L_i * f_r * cosine / pdf(wi)
	Else If ray r hit an object at q
		Return shade(q, -wi) * f_r * cosine / pdf(wi)

用N=1做蒙特卡洛积分积分叫做路径追踪(N≠1是分布式光线追踪)

# 摄像机位置和像素
ray_generation(camPos, pixel)
	# 在这个像素内取N个不同的位置
  Uniformly choose N sample positions within the pixel
  pixel_radiance = 0.0
  For each sample in the pixel
  	# 从这个位置连一根光线到样本位置上
    Shoot a ray r(camPos, cam_to_sample)
    # 如果光线打到了场景中的某个位置p
    If ray r hit the scene at p
    	# 计算p到摄像机的着色
    	pixel_radiance += 1 / N * shade(p, sample_to_cam)
	Return pixel_radiance

另一个问题是递归,算法不会停,光线一直反射。如果限制反射次数能量又会损失。引入俄罗斯轮盘。

设定一个概率,以一定的概率 P 往某个方向打光线,结果 P:Lo / p,另外的概率 1-P 不打光线,结果为:0。最后仍然可以期望得到的结果是Lo。E = P * (Lo / P) + (1 - P) * 0 = Lo

shade(p, wo)
	# 随机选一个概率 P_RR
  Manually specify a probability P_RR
  # 从0~1随机取一个数
  Randomly select ksi in a uniform dist. in [0, 1]
  #如果大于 P_RR 则不能发射光线
  If (ksi > P_RR) return 0.0;
  Randomly choose ONE direction wi~pdf(w)
  Trace a ray r(p, wi)
  If ray r hit the light
  	# 最后结果除以 P_RR 概率
  	Return L_i * f_r * cosine / pdf(wi) / P_RR
  Else If ray r hit an object at q
  	Return shade(q, -wi) * f_r * cosine / pdf(wi) / P_RR

采样率会影响效果;而且往四面八方发射,打不打的到光源看运气

直接在光源上采样,光源和着色点连线,会产生两个角:连线和着色点法线夹角、连线和光源法线的夹角。

渲染方程不是定义在光源上,而是在这个立体角的半球上,所以根据在X上积分就得采样X的要求,得把渲染方程写成在光影上的积分,只需要知道dω和dA的关系

  • dA 是光源上的一个表面
  • dω 是这个表面投影到单位球上的立体角

让光源面向着色点,除以它的距离平方,修改渲染方程,改变积分域。对光源采样,对光源积分

这样就分成了两部分

  • 光源直接对这一点的贡献(直接光,不需要概率)
  • 其他非光源对这一点的贡献(间接光,使用概率)

还需要判断光源和着色点直接有没有物体遮挡,

shade(p, wo)
  # 光源的贡献
  L_dir = 0.0
  # 均匀地在光源上采样,在光源上积分
  Uniformly sample the light at x’ (pdf_light = 1 / A)
  # 从P打出一条光线判断是否有遮挡
  Shoot a ray from p to x’
  If the ray is not blocked in the middle
  	L_dir = L_i * f_r * cos θ * cos θ’ / |x’ - p|^2 / pdf_light
  
  # 其他的贡献
  L_indir = 0.0
  # 引入概率
  Test Russian Roulette with probability P_RR
  # 均匀采样上打出一条线
  Uniformly sample the hemisphere toward wi (pdf_hemi = 1 / 2pi)
  Trace a ray r(p, wi)
  # 确认点q不是光源
  If ray r hit a non-emitting object at q
  	L_indir = shade(q, -wi) * f_r * cos θ / pdf_hemi / P_RR
  Return L_dir + L_indir

17 Materials and Appearances 材质与外观

漫反射系数

材质 = BRDF

漫反射材质,考虑它不发光且不吸收光,接受的光全部均匀反射出去每一个角度,由于能量守恒入射光Radiance和出射光Radiance是一样的。

对半球上一个cosθ的积分结果是π,因为能量守恒Li得等于Lo,得出BRDF等于π分之1,定义一个反射率在0~1的ρ来引入不同颜色

  • 光滑反射材质,不完全镜面反射
  • 半透明材质,反射和折射

入射方向和出射方向中间一定是法线方向,可以利用平行四边形法则ωi加ωo,长度是入射方向投影到法线方向的长度*2

也可以将角度投影到一个局部坐标系,入射方向和反射方向在方位角上是相反的,入射方位角加上一个π对2π求模就可以得到出射角

折射

斯内尔定律,折射定律

定义两个夹角,入射角的正弦和折射角的正弦,它们满足折射率相乘相等的关系

求一个夹角的余弦,结果是一个有意义的实数,如果不是有意义实数则折射不可能发生

根号下要小于0没有意义,所以就得ηi / ηt >1,入射的介质的折射率大于折射介质的折射率有可能不会出现折射现象(全反射现象)

BRDF(反射Reflectance) + BTDF(折射transmit) ,统称 BSDF(散射scattering)

菲涅尔

多少能量被反射是和入射角度有关的。电解质和绝缘体的菲涅尔

S和P是两个极化,平常不考虑就把两个反射率加起来平均

微表面模型

  • 假设物体表面的粗糙的,但从远处看,看到的是一个平面;
  • 从近处看可以看到表面起伏,并且每一个微表面都认为它是镜面反射

(远处材质,近处几何)

微表面法线分布来表示物体表面粗糙程度

  • glossy光滑材质的微表面法线都很接近宏观的表面法线
  • diffuse漫反射的微表面法线散的比较开

BRDF考虑入射、出射方向:

  • 首先考虑一个菲涅尔项总,共有多少能量被反射
  • 几何项(考虑互相遮挡),修正Grazing Angle 掠射角度,(Grazing Angle 掠射角度光和平面几乎平行)
  • 法线分布(对法线有多少是这个方向进行查询)(只有微表面的法线分布和中间法向half vector h一致的时候,才能把入射方向反射到出射方向上)

各向同性材质&各向异性材质

从微表面法线的方向可以看出材质是属于各向同性还是各向异性

如果 BRDF 不满足在方位角上旋转得到相同 BRDF,则说它是各向异性材质

不同方向凹凸的金属,尼龙布料,天鹅绒可以手动制造各向异性的反射效果

BRDF总结

  • 值是非负的
  • 线性性质,可以拆成很多块计算,然后加起来
  • 可逆性,交换入射和出射方向值是一样的
  • 能量守恒,有部分被吸收则比原来的小
  • 各项同性意味着只和相对的方位角有关,因为BRDF可逆所以相对的方位角不用考虑正负

测量BRDF

测量出来的BRDF和理论上BRDF会有偏差

改变入射方向和观察方向对BRDF进行测量

# 枚举所有出射方向 放光源
foreach outgoing direction wo
  move light to illuminate surface with a thin beam from wo
  # 枚举所有入射方向 放相机
  for each incoming direction wi
    move sensor to be at direction wi from surface
    measure incident radian
  • 四维的数据量很大,若BRDF是各向同性的其只有三维
  • 只考虑相对方位角,又减少一半的测量
  • 只采样若干方向

18 Advanced Topics in Rendering

Advanced Light Transport

  • 无偏估计的蒙特卡洛无论使用多少样本,期望都是真
  • 否则就是有偏估计,期望的值和需要的值不一样(得到结果是相对于正确的模糊的就是有偏的)
  • 如果样本足够多,期望值收敛到正确值,虽然还是有偏估计,但管它叫一致的(虽然结果是模糊的但是样本足够多就能收敛到不模糊的结果)

DBPT

BDPT Bidirectional Path Tracing 双向路径追踪。适合光源面积较小的场景,但消耗更多性能。

  • 追踪来自相机和灯光的半路径(子路径)
  • 将两条半路径(子路径)的端点连接起来

MLT

MLT Metropolis Light Transport。适合做复杂光路传播,不知道什么时候收敛没有噪声,因为是局部画面结果会有点脏。

  • 马尔可夫链蒙特卡洛,根据当前样本,生成靠近的下一个样本。给定足够时间,能生成一系列以任意函数的形状为pdf的样本。
  • 擅长在局部探索复杂的光路
  • 对现有路径进行局部扰动以获得新路径

Photon Mapping

Photon Mapping 光子映射,有偏方法 ,两步方法。非常擅长处理镜面反射-漫反射-镜面反射(SDS)路径和生成焦散caustics。

  • 所有光子正常反射折射,打到diffuse漫反射表面停下来
  • 从相机向外打sub-paths正常反射折射,直到打到diffuse漫反射表面
  • 合起来计算局部的密度估计local density estimation,光子越集中越亮,对于任意着色点,取周围的最近n个光子(KD-Tree),光子数量除以光子数量得出密度

因为是取光子所占面积,所以是一个错误的密度估计

只有dA面积无限小时,结果会更正确,也就是需要足够多的光子才有足够小的面积,所以是一个有偏但一致的方法

如果用固定面积,计算光子数量,它不仅是有偏的还不是一致的,光子数量越多面积内会找到越来越多的光子,dA不会自己变小

Vertex Connection and Merging

Vertex Connection and Merging。

把双向映射BDPT和光子追踪Photon Mapping结合起来。

如果子路径的端点无法连接但可以合并,那就不要浪费BDPT中的这些子路径,使用光子映射来处理附近“光子”的合并

IR

Instant Radiosity 实时辐射度。可以用直接光照的方法生成简介光照的效果。有些夹缝地方会出现问题。

已经被照亮了面认为它是光源,再用它照亮别人。

  • 打出很多sub-path光线
  • 光线停住的地方认为它是一个虚拟的光源
  • 用所有新的光影去照亮所看到的着色点

Advanced Appearance Modeling

Non-surface models

Participating media

Participating media 散射介质。

  • 在光穿过穿过介质时,它随时可能(部分)被吸收和散射
  • 使用相位函数来描述参与介质内任意点x处光散射的角度分布

随机方向反射,随机距离,在每个“遮光点”处,连接到光线

Hair / fur / fiber (BCSDF)
  • 光线打到头发上会散射出一个圆锥同时也会反射到四面八方。Kajiya-Kay Model渲染出来的结果不真实。
  • Marschner Model考虑除了反射,光线也会穿入头发里面,将头发看做是玻璃圆柱(穿透T,反射R)

对于动物毛发,它的Medulla髓质特别大,更容易散射光线

双层圆柱模型用于模拟髓质

Granular material

颗粒材质的渲染,按照比例分配

Surface models

Translucent material (BSSRDF)

半透明材质(透射材质),光线进入物体后发生大量散射:次表面散射 Subsurface Scattering。

  • BRDF:入点和出点一致
  • BSSRDF:入点和出点不一致

不仅需要考虑各个方向进来的光,还要考虑从各个方向进到其他点的光,需要对方向进行积分也要对面积进行积分。

可以用两个光源照射着色点,很像次表面散射的效果

Cloth

布料是经过一系列缠绕的纤维,效果与其形状有关

  • 将布料认为是空间中分布的体积,分成很多细小的格子,将其转换成烟雾的渲染
  • 将每一根纤维渲染出来
  • 物体表面
Detailed material (non-statistical BRDF)

细节材质,物体表面并非完美平滑,会有各种细小划痕

微表面模型渲染困难,每个微表面是一个镜面,很难反射到光源或者摄像机上,考虑一个像素覆盖的一些微表面,计算这部分微表面的法线,用来替换光滑的微表面分布

波动光学表面会有很多种颜色

Procedural appearance

程序化生成。3D中的噪声函数,随用随取


19 Cameras, Lenses and Light Fields

传感器收集的是irradiance,因为如果没有小孔成像将收集很多方向来的光,图像是糊的

针孔相机没有深度信息,画面锐利不会有虚化

Field of view 视场

定义视场以35mm胶片上所用镜头的焦距来描述视角范围。如果传感器较小,将焦距变小才能达到相同的视场

Exposure 曝光

H = T x E ;Exposure = time x irradiance

  • 曝光时间(T):由快门控制
  • irradiance 辐照度(E):照射到传感器单位面积上的光功率、受镜头光圈和焦距控制

影响成像曝光的因素:

  • 光圈大小: 通过打开/关闭光圈来改变光圈值(如果相机具有光圈控制功能)
  • 快门速度:改变传感器像素集成光的持续时间
  • ISO增益:改变传感器值和数字图像值之间的放大倍数(模拟和/或数字)较大ISO会导致图片出现噪点

Thin Lens Approximation 薄透镜模拟

  • 所有进入透镜的平行光线都会通过其焦点。
  • 所有通过焦点的光线在穿过透镜后将变为平行光线。
  • 焦距可以任意改变

通过相似三角形可得薄透镜公式(高斯)

Defocus Blur 景深模糊

透镜的大小和Circle of Confusion (CoC)弥散圆有关,也就是看到的东西是否模糊取决于光圈大小

F光圈数是焦距除以光圈的直径,COC和光圈数成反比关系

  • 选择传感器尺寸、镜头焦距和光圈大小
  • 选择透镜到对象距离 zo
  • 根据薄透镜方程计算相应的传感器到透镜的距离 zi
  • 对于传感器上的每个像素x’
  • 在透镜平面上随机采样点x’’
  • 穿过透镜的光线会射到x’’’上(因为x’’’处于焦点上,考虑虚拟光线(x’,透镜中心))
  • 估算射线上的radiance辐射度 x’’ -> x’’’

景深是在CoC足够小的这一段范围内,场景是清晰的

Light Field / Lumigraph 光场

在视野前加幕布模拟看到的场景

全光函数是能看到的所有东西:

  • P(θ,φ )从某一个地方,往任意方向看可以看到什么值,使用极坐标表示光的强度
  • P(θ,φ,λ),引入波长λ,有了颜色
  • P(θ,φ,λ,t),时间t
  • P(θ,φ,λ,t,Vx,Vy,Vz),引入三维空间位置

将物体放入一个包围盒中,从任意方向看向物体,相当于从物体在包围盒上往任意方向过去的光线。光场是任意位置往任意方向的发光强度。

有了光场后,就可以得知任意位置看向物体的光的强度

通过两个平面确定任意两个点的连线即为光线,确定所有u,v和s,t的组合

  • 从uv固定一个点往st看,像是正常摄像机观察
  • 但是从st固定一个点往uv看,反过来想,从uv上任意点看向st上的一个点,可以看到同一个点不同角度下光的不同,把像素上的irradiance展开成radiance,可以看到打到任何一个像素上不同方向的光是什么样的

光场相机可以在后期动态条件焦距,原来是记录一个像素,使用微透镜记录一块像素。后期只要选取同一方向的光线,就可以虚拟移动相机的位置。

光场摄像机分辨率不足、成本高


20 Color and Perception

Physical Basis of Color

利用Spectral Power Distribution (SPD)谱功率密度,可以描述光在不同波长的分布。多个光会相加

人眼中有两种感光细胞,感知灰度(视杆细胞)和颜色(视锥细胞),视锥细胞有三种类型,每种类型具有不同的光谱敏感性,它们能提供色彩感知。

我们看到的不是光谱,而是积分后的结果,就会出现不同的信号经过积分后得到的三个数相同:Metamerism 同色异谱

这样就可以模拟看到的颜色,即使光谱完全不同

通过对RGB三个颜色的叠加可以调出不同的颜色,值可能为负

Color Spaces

CIE XYZ人造了颜色匹配系统,因为y相对均匀得到的Y的结果一定程度上可以表示亮度。

三维不好可视化,对其归一化,因为Y是亮度,固定住亮度将其投影到二维空间中,得到色域(一个颜色空间所有能表示的颜色)


21 Animation

Mass Spring System 质点弹簧系统

一系列相互连接的质点和弹簧,b-a之间的距离减去Rest length原始长度是拉开的长度,其决定受到了多少力乘以受力方向,

但这样能量守恒会一直动,增加一个摩擦力让它停,给它一个相反的速度,这样会导致所有运动停下来(表示不了弹簧内部的能量损耗)

需要它们之间的相对速度,b-a的归一化向量和b-a的速度点乘,就是往这个方向上做投影,相对速度投影在ab方向上的速度是多少

  • 防止结构产生切变和弯曲,如果加入一条对角线会发现换个方向任然可以,
  • 改为加入两条对角线但这样仍不能抵抗非平面的弯曲
  • 隔一个点进行连线,只为抵抗非平面弯曲效果没有

有限元方法

Particle Systems 粒子系统

粒子系统不止可以模拟水,还可以模拟群体下的个体行为,像是鸟群鱼群

Kinematics 运动学

Forward Kinematics 正向运动学

Inverse Kinematics 逆运动学

通过移动点的位置,解算每一个骨骼的位置


22 Animation (cont.)

Euler Method 欧拉方法

模拟例子在速度场中的运动,x的速度是一个常微分方程

欧拉:

  • 下一帧的位置:上一帧的位置 + 时间 * 速度
  • 下一帧的速度:给出一定时间Δt,乘上加速度,再加上速度,就变成了下一帧的速度;
  • 更小的 Δt 步长越准确
  • 不稳定性,差的越来越远

Midpoint Method 中点法:通过开始的位置和方向得到a,取中点b,用两次欧拉方法得到中点的速度,再在原始点使用欧拉算这个速度的欧拉

Adaptive Step Size 自适应步长:

  • 以T为步长计算欧拉xT,
  • 以T/2作为步长计算xT/2的两个欧拉,
  • 计算误差||xT – xT/2 ||
  • 如果(误差 > 阈值),则减小步长并重试

Implicit Euler Method 隐式欧拉方法:用下一帧的位置和速度,比较难解,但稳定性比较好

稳定性:局部误差和总体误差。相对于步长的关系,阶数越高越好

Runge-Kutta Families:这是一类方法,其中有一个四阶方法

Position-Based / Verlet Integration:不是基于物理的方法

Rigid Body Simulation 刚体模拟:不会发生形变就是栗子模拟,在位置和速度的基础上考虑角度和角速度

Fluid Simulation 流体模拟

  • 假设水由小的刚性球体组成
  • 假设水不可压缩(即密度恒定)
  • 只要密度在某处发生变化,就应通过改变粒子小球的位置来“校正”
    • 需要知道任意位置处密度关于每个粒子位置的导数是多少
    • 梯度下降

LAGRANGIAN APPROACH 拉格朗日方法(质点法):分析每一个的运动

EULERIAN APPROACH 欧拉方法(网格法):分为网格,考虑网格随着时间如何变化

Material Point Method (MPM) 两种方法结合:

  • 拉格朗日方法:考虑携带物质特性的粒子
  • 欧拉方法:使用网格进行数值积分
  • 相互作用:粒子将特性传递给网格,网格进行更新,然后插值回粒子

https://www.bilibili.com/video/BV1X7411F744

https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

THE END