图形学笔记(十二)光线追踪2——加速光线和场景的求交、空间划分(八叉、KD树)、BVH加速结构、辐射度量学基础、BRDF、基本概率论

图形学笔记(十一)光线追踪——Shadow Mapping、光线追踪、光线投射、软硬阴影、光线与物体交点、AABB包围盒

1 使用AABB包围盒加速光线追踪

1.1 Uniform Spatial Partitions (Grids)均匀空间划分

1.1.1 预处理——建立加速格子

在这里插入图片描述

  1. 找到包围盒
  2. 创建格子
  3. 标记与物体相交的格子

1.1.2 光线与场景求交点

在这里插入图片描述

  1. 按照光线穿梭的顺序遍历格子
  2. 对于每个格子,计算存储在格子里的所有物体是否与光线有交点。

1.1.3 加速效果

格子太多和格子太少都是不好的。

  • 只有一个格子:没有加速效果。
  • 格子特别密集:需要做很多光线与格子求交,加大开销。

即想要获得比较好的加速效果,格子不能太稀疏,也不能太密集。下面是人们经验得到的规律。

  • #cells = C*#objs
  • C=27 in 3D

格子划分法适用于大小和空间均匀分布的大型对象集合(如下图所示)。
在这里插入图片描述
但是此方法不适合于有很多空旷区域的场景(如下图所示),下面又称为“teapot in stadium”问题。
在这里插入图片描述

1.2 空间划分(Spatial Partitions)

1.2.1 空间划分的例子

  • Oct-Tree 八叉树 把场景包起来,然后把正方体切成八份。不断的对子节点递归进行此过程,放格子里面是空的或者物体足够少就停下来。(但是有个严重的问题,随着维度的升高,节点数量指数型增长)
  • KD-Tree 与八叉树几乎相同,但是对每次划分的格子,总是沿着某一个轴切割(通常是交替的),且对每个格子仅切割一次。(好处是相比于八叉树,节点数量的复杂度不会随着维度指数型增长。)
  • BSP-Tree 对空间二分,每次划分时选择一个方向,与KD-Tree的区别在于它的切割不一定是与轴平行的。(存在的问题是在维度高的时候不好计算,切割的几何体从点到线到面到超平面。)
    在这里插入图片描述

1.2.2 KD-Tree

1> KD-Tree 的基本结构

总体来说是一颗二叉树,如下图所示(为了简化没画全,实际上1、2等节点都有子节点)。
在这里插入图片描述
对于非叶子节点:

  • 划分的轴:x、y或z轴。
  • 划分的位置:分割的平面沿轴的坐标。
  • 子节点:一定有两个子节点。
  • 在非叶子节点不会存储物体。

对于叶子节点:

  • 存储物体列表。

2> 计算光线与物体交点的步骤

在这里插入图片描述
找到叶子节点1,与区域内的所有物体求交。
在这里插入图片描述
以此类推,找到与光线有交点的格子内的物体,然后与格子里面的所有物体求交。

3> KD-Tree的问题

  1. 很难判断物体的三角形和AABB包围盒是否有交集。
  2. 一个物体可能会与很多AABB包围盒有交集。也即一个物体可能存储在多个叶子节点里。

1.3 物体划分与BVH加速结构(Object Partition & Bounding Volume Hierarchy)

1.3.1 建立过程

  • 找到包围盒
  • 递归的把物体集合划分成两个子集
  • 重新计算子集的包围盒
  • 当满足一定要求的时候停止
  • 在每个叶子节点里存储所有物体

以下是图解:

首先对于所有物体找到包围盒,形成根节点。
在这里插入图片描述

然后把物体分成两部分,并重新计算包围盒,形成根节点的子节点。
在这里插入图片描述
不断的递归重复这个过程,知道满足一定的条件后停止,最后在叶子节点存储物体列表。
在这里插入图片描述

1.3.2 BVH的优缺点

BVH避免了KD-Tree的问题,具有如下优点。

  • 一个物体只能出现在一个格子里。
  • 不涉及三角形和包围盒求交的问题。
    缺点:
  • BVH并没有把空间严格的划分开(包围盒有可能相交)。

1.3.3 建立中的细节问题

1> 如何划分节点?

每次都需要选择一个维度来分割(经验上有下面两种做法)。

  • 选择节点中最长的轴
  • 取中间的物体的位置来划分节点。

2> 划分终止条件?

当节点包含少于特定元素时停止(比如5)。

3>BVH树的存储结构?

  • 中间节点存储包围盒和子节点的指针。
  • 叶子节点存储包围盒和物体列表。
  • 节点代表场景中图元(primitives)的子集,所有物体都在子树中。

1.3.4 BVH算法

Intersect(Ray ray,BVH node){
    
    
	if(ray misses node.bbox) return;
	if(node is a leaf node)
		test intersection with all objs;
		return closest intersection;
	
	hit1 = Intersect(ray,node.child1);
	hit2 = Intersect(ray,node.child2);

	return the closer of hit1,hit2;
}

1.4 空间划分与物体划分

空间划分(如KD-tree)

  • 把空间划分成不重叠的区域。
  • 一个物体可能呗包含在多个区域中。

物体划分(如BVH)

  • 把物体划分成不相交的子集。
  • 每个子集的包围盒在空间上可能是重叠的。

2 辐射度量学(Basic radiometry)

2.1 辐射度量学的动机

光源中定义L=10,但是10代表的是什么无法确定,缺少单位。

2.2 概览

辐射度量学就是在物理上准确度量光照的方法。

它定义了一系列的方法和单位,准确的定义了光在空间中的属性:

  • 定义了光照的新属性:Radiant flux(辐射通量),intensity(辐射强度),irradiance(辐射[照]度),radiance(辐[射]亮度)

为什么学,学的是什么,这个新的东西是怎么运用的

2.3 Radiant Energy and Flux(Power)

2.3.1 Radiant Energy

定义 Radiant energy是一种电磁辐射的能量。它由焦耳(J=Joule)单位来度量,用符号Q来表示。
在这里插入图片描述

2.3.2 Radient flux(Power)

定义 Radient flux(Power) 是单位时间的发射出的、反射的、传播的和接收的能量。
在这里插入图片描述
另一种定义:单位时间辐射出光子的数量。

2.4 与光相关的物理量

关键的物理量:光源辐射出的能量(Radiant Intensity),物体表面接收的光的能量(Irrdiance),光线在传播过程中的能量(Radiance)。

在这里插入图片描述

2.4.1 Radient intensity

定义:Radient intensity是每单位立体角辐射的能量。
在这里插入图片描述

2.4.2 角和立体角(Angles and Solid Angles)

角Angle 圆上的弧长与半径的比值。

  • θ = l r \theta=\frac{l}{r} θ=rl
  • 圆的角度为 2 π 2\pi 2πradians(弧度数)
    在这里插入图片描述

立体角 Solid angle 球面上的面积和半径平方的比值。

  • Ω = A r 2 \Omega=\frac{A}{r^2} Ω=r2A
  • 球的立体角为 4 π 4\pi 4π steradians

在这里插入图片描述
微分(Differential)立体角 通过两个角度定义球面上的唯一一个方向( θ \theta θ(方向与z轴的夹角) ϕ \phi ϕ(方向绕着z轴旋转的夹角))。
下图的 d ω d\omega dω就是微分立体角(单位面积与 r 2 r^2 r2的比值),这个角非常小。
在这里插入图片描述
通过积分可以得到,整个球的立体角是4 π \pi π
在这里插入图片描述

2.3 各向同性点光源 Isotropic Point Source

如果点光源均匀的辐射出光,则可以得到点光源的强度I如下所示。
在这里插入图片描述

2.4 Irradiance(辐射[照]度)

定义 Irradiance是单位面积的辐射通量(面必须和光线垂直,否则要变成和投影面垂直的)。
在这里插入图片描述

现象解读:

  1. 冬夏温度之分是因为点光源辐射的能量到达辐射点的角度不同步(阳光和不同区域的夹角不同),导致接收的能量不同。
  2. Irradiance会衰减,如下图所示(不是Intensity衰减)。
    在这里插入图片描述

2.5 Radiance

Radiance描述光线在传播过程中的属性。

定义 Radiance是在单位立体角发射的在单位面积由表面反射、发射或接收的能量。
在这里插入图片描述

由于 Irradiance是单位面积的辐射通量,Intensity是单位立体角发出的能量。
所以 Radiance是每单位立体角的Irradiance,Radiance是每单位面积的正交Intensity

2.5.1 Incident Radiance

Incident Radiance是每单位立体角的到达表面的irradiance。
在这里插入图片描述

2.5.2 Exiting Radiance

Exiting surface radiance是每单位面积向某个角度辐射出的radiance。
在这里插入图片描述

2.6 Irradiance与Radiance

Irradiance:被区域dA吸收的所有的能量。
Radiance:被区域dA的来自 d ω d\omega dω的能量。

3 双向反射分布函数 Bidirectional Reflectance Distribution Function(BRDF)

引入 来自于 ω i \omega_i ωi立体角的Radiance转化成dA接受的能量E,然后能量E会变成向着任何其他方向 ω \omega ω的radiance。

意义 某个微小面积 d A dA dA从某个微小立体角 d ω i d\omega_i dωi接受的irradiance会如何被分配到不同的立体角去。
在这里插入图片描述
BRDF用于表示从每个入射方向进来的光线会每个向出射方向 ω r \omega_r ωr反射的能量多少。
在这里插入图片描述

BRDF就是任何一个出射方向的radiance的微分除以在入射点上irradiance的微分。
在这里插入图片描述

3.1 反射方程

BRDF是描述光线对物体时如何作用的,所以可以用于定义不同的材质。
在这里插入图片描述

把每一个方向对出射方向的贡献都加起来就会获得向某个方向反射出光照的结果。
在这里插入图片描述

3.2 递归方程

反射radiance取决于入射radiance,而入射radiance不仅取决于光源,还有被其他物体反射的光,具有递归关系。
在这里插入图片描述

3.3 渲染方程 Rendering Equation

3.3.1 推导(由反射方程)

已知反射方程如下,可以从反射方程推出渲染方程,
在这里插入图片描述渲染方程首先要在反射方程的基础上加上自己辐射的radiance,假设所有方向都向外,渲染方程如下( Ω + \Omega^+ Ω+ H 2 H^2 H2都表示半球):
在这里插入图片描述
其中 c o s θ i = n ⋅ ω i cos\theta_i = n · \omega_i cosθi=nωi L i ( x , ω i ) L_i(x,\omega_i) Li(x,ωi)表示来自光源的入射光, f ( x , ω i , ω r ) f(x,\omega_i,\omega_r) f(x,ωi,ωr)为BRDF表示材质的性质, L e ( x , x r ) L_e(x,x_r) Le(x,xr)为反射物体自身发出的光, L r ( x , x r ) L_r(x,x_r) Lr(x,xr)是最终的反射光。

场景中往往由很多光源,所以如果有很多点光源,就累加它们。

在这里插入图片描述
L r ( x , ω r ) = L e ( x , ω r ) + Σ L i ( x , ω i ) f ( x , ω i , ω r ) ( ω i , n ) L_r(x,\omega_r)=L_e(x,\omega_r)+\Sigma L_i(x,\omega_i)f(x,\omega_i,\omega_r)(\omega_i,n) Lr(x,ωr)=Le(x,ωr)+ΣLi(x,ωi)f(x,ωi,ωr)(ωi,n)

对于面光源,则进行积分。

在这里插入图片描述

L r ( x , ω r ) = L e ( x , ω r ) + ∫ Ω L i ( x , ω i ) f ( x , ω i , ω r ) cos ⁡ θ i d ω i L_r(x,\omega_r)=L_e(x,\omega_r)+\int_{\Omega}L_i(x,\omega_i)f(x,\omega_i,\omega_r)\cos \theta_id\omega_i Lr(x,ωr)=Le(x,ωr)+ΩLi(x,ωi)f(x,ωi,ωr)cosθidωi

如果考虑其他物体反射的radiance,就把反射物体和反射面当成光源,可以把渲染方程写成更通用的形式。

L r ( x , ω r ) = L e ( x , ω r ) + ∫ Ω L r ( x ′ , − ω i ) f ( x , ω i , ω r ) cos ⁡ θ i d ω i L_r(x,\omega_r)=L_e(x,\omega_r)+\int_{\Omega}L_r(x',-\omega_i)f(x,\omega_i,\omega_r)\cos \theta_id\omega_i Lr(x,ωr)=Le(x,ωr)+ΩLr(x,ωi)f(x,ωi,ωr)cosθidωi
以上的式子可以简单的表达为,
l ( u ) = e ( u ) + ∫ l ( v ) K ( u , v ) d v l(u)=e(u)+\int l(v)K(u,v)dv l(u)=e(u)+l(v)K(u,v)dv
K为反射操作符,进一步简写为
L = E + K L L=E+KL L=E+KL
可以看出L是递归定义的。

3.3.2 结论

渲染方程如下所示,而我们的目的是解出L。
L = E + K L L=E+KL L=E+KL

解L的方法如下所示,其中K也可以理解成反射次数,反射次数越多,项越多, K 2 K^2 K2代表光弹射两次。

在这里插入图片描述
全局光照是直接和间接光照( K E + K E 2 + K 3 E + . . . KE+KE^2+K^3E+... KE+KE2+K3E+...)的集合。

光栅化的着色一般只有E+EK,而后面的间接光照部分光栅化难以做到,一般使用光线追踪来进行计算。

4 基础概率论

4.1 随机变量

X X  随机变量表示取值不一定的一个值。
X ∼ p ( x ) X \sim p(x) Xp(x) 随机变量的概率密度函数(probability density function),他描述随机事件发生的概率。
eg:对于骰子点数朝上的概率,有
p ( 1 ) = p ( 2 ) = p ( 3 ) = p ( 4 ) = p ( 5 ) = p ( 6 ) p(1)=p(2)=p(3)=p(4)=p(5)=p(6) p(1)=p(2)=p(3)=p(4)=p(5)=p(6)

4.2 概率

离散随机变量 x i x_i xi的概率为 p i p_i pi,概率分布的性质如下:
p i ≥ 0 , ∑ i = 1 n = 1 p_i \geq 0,\sum^{n}_{i=1}=1 pi0,i=1n=1

4.3 期望

期望是试验中每次可能结果的概率乘以其结果的总和。

4.3.1 离散情况

E [ X ] = ∑ i = 1 n x i p i E[X]=\sum^{n}_{i=1}x_ip_i E[X]=i=1nxipi

4.3.2 连续情况

E [ X ] = ∫ x p ( x ) d x E[X]=\int xp(x)dx E[X]=xp(x)dx
性质如下:
p ( x ) ≥ 0 , ∫ p ( x ) d x = 1 p(x)\geq0 ,\int p(x)dx=1 p(x)0,p(x)dx=1

4.3.3 随机变量函数的期望

对于 X ∼ p ( x ) , Y = f ( X ) X \sim p(x),Y=f(X) Xp(x),Y=f(X),有期望:
E [ Y ] = E [ f ( X ) ] = ∫ f ( x ) p ( x ) d x E[Y]=E[f(X)]=\int f(x)p(x)dx E[Y]=E[f(X)]=f(x)p(x)dx

猜你喜欢

转载自blog.csdn.net/weixin_43399489/article/details/121512582