Games101 课程笔记(四) 阴影与光线追踪与材质
admin
2023-10-24 06:00:03
0

前言

这些文章是我在学习games101的过程中的一些心得和笔记,有些是课程的内容,有一些则是我在其他博客等处总结的相关知识点和扩展资料。
请注意:这篇文章对应的课程内容是Lecture 13-18 ,课程链接见下
对应的作业是HW 5-7,下面是我做的作业详解,仅供参考。

阴影映射(shadow mapping)

点光源的阴影 -> 只能生成硬阴影




shadow mapping

  1. 在光源处放一个摄像机,从光源看场景,画一张深度图(shadow map)
  2. 在眼睛处放第二个摄像机,从眼睛看场景,判断看到的点的深度与记录的深度是否一致
注1:这里所有物体包括摄像机都在世界空间内,光源和眼睛的“看”意味着做投影,类似于v矩阵。例子:对于eye“看”到的一个(,)点,这个点实际上是在eye的投影平面上,对这个点做eye投影的逆变换,就可以得到原本世界坐标上的点(x,y,z),再对它做光源投影,就能得到光源投影平面上的对应的点坐标(,),从而获得存储在这个点上的深度值。
注2:阴影图的一些问题:1、生成的shadow map分辨率太低的话就会造成阴影的锯齿(因此游戏中阴影选项多有低中高三档调节,就是调节shadow map的分辨率大小)。 2、判断深度一致时,浮点数难以完全相等,因此加入一个阈值,两个浮点数的差值小于阈值就判为相等,或者使用相对大小来代替一致性判断。

为什么需要光线追踪?

  • 为了解决光栅化近似的效果精度不高的问题
  • 为了解决shadow mapping中的问题

光线追踪与光栅化的对比




光线追踪与光栅化的对比

Whitted-Style

原理

从眼睛发射一条光线穿过显示屏投射到物体上,得到交点shader point,既发生折射又发生反射,从折/反射点发射一条指向光源的shadow ray,判断它是否被物体遮挡,没有遮挡就对这个shader point着色(比如使用phong模型着色,当然,得利用物体的法线),最后把这些着色点的着色结果加权到得到一个颜色,把颜色设置进显示屏对应的像素上。




Whitted-Style

技术细节

光线定义 -> 一个向量,有起点,有方向




光线定义

求光线和物体表面的交点

a)显式表面 -> 场景中多是这种难以用方程描述的显式表面

从光源直接投射一个光线,求它与三角形所在平面的交点,再用叉乘判断交点是否在三角形内




显式表面求交

或者一步到位,使用Mller Trumbore Algorithm:将交点用重心坐标表示,得到一个有三个变量 t , b_1 , b_2 的3阶线性方程组,解方程。



b)隐式表面 -> 令曲面上的点P等于光线上的点r即可求解。




隐式表面求交

c)加速求交 -> 三角形太多,不可能一个一个去求交

1)AABB包围盒

将物体用包围盒包围,如果光线没与包围盒相交,就不可能与物体相交。将包围盒作为三个“对面”的交集,如下




AABB包围盒

如何判定是否相交:将光线延长为直线,分别求出与三个“对面”的交点 t_{min} 和 t_{max} , 并且t_{enter} = max\left\{ t_{min} \right\} , t_{exit} = ma\left\{ t_{max} \right\} ,当 t_{enter} < t_{exit} && t_{exit} > 0 时,光线与包围盒相交




判定是否相交

2)场景预处理 -> 画格子




场景预处理

首先,场景栅格化,把物体表面涉及的格子标记,之后发射光线,沿着光线取格子,取到有标记的格子就判断是否与物体相交,否则继续取格子。

注1:这里默认一个事实 -> 判断光线与格子相交比判断与物体相交简单
注2:如何沿着一条线得到沿线的格子 -> 参考 烧烤摊摊主老蔡:Bresenham 直线算法

3)空间划分(预处理)-> 为了解决“Teapot in the stadium”问题




空间划分

  • 八叉树:平均的去分,一次分成8份 (每个子空间都要继续分)
  • KD树:x,y,z交替的去分,一次分成2份(实际上就是二叉树)
  • BSP树:非轴向的分

分完以后记录一个盒子里包含哪些物体。

查找过程:类似于二分查找。以KD树为例,投射一条光线,当光线碰到父节点的盒子时,需要递归的判断是否碰到子节点的盒子,直到判断进行到叶子节点时(叶子节点就是分的最小的盒子),意味着需要对叶子节点的这个盒子中包含的物体判断是否相交。




KD树

4)物体划分(预处理)-> 为了解决KD树一个物体存储在多个盒子里、难以判断物体是否被包围盒完整包围的问题

查找的过程与KD树类似,递归就行




物体划分

辐射度量学

符号定义

  • Q -> Radiant Energy,单位Joule
  • Φ = \frac{dQ}{dt } -> Radiant Flux\power,单位Watt\Lumen,1w = 683 lm
  • I(w) = \frac{dΦ}{dw} -> Radiant Intensity,单位candelas
  • w -> Soild Angle,单位steradians (参考星空下:什么是立体角)
  • E(p)=\frac{dΦ}{dA } -> Irradiance,单位lux,单位面积通量
  • L(p,w)=\frac{d^2Φ}{dwdA cosθ } -> Radiance,单位nit,单位面积上单位立体角通量

重点理解下面这个图就可以了,首先,irradiance是单位面积dA接收的总辐射能量,记作E,这个E是多个方向的能量叠加的,dE单指一个方向来的打到dA上的能量,即w方向来的能量。




irradiance与radiance的关系

Bidirectional Reflectance Distribution Function(BRDF)

BRDF做了什么? -> 假设已知入射光和受光点,BRDF函数可以求出反射光分布,反之亦然,所以叫双向分布函数

为什么需要BRDF? -> 已知入射光能量和角度,射到物体表面物体先吸收能量,然后再向各个方向辐射(即反射),BRDF能求出给定方向的辐射的能量是多少,比如辐射到摄像机那里会有多少能量

BRDF怎么做的?

反射方程




反射方程

dL(w_r)指沿着 w_r 方向上传播的一部分能量,dE(w_i )指w_i方向来的打到dA上的能量。那么一个w_i 方向的光对这个反射方向w_r的贡献比例是f_r,对所有光方向积分,就能得到沿着w_r方向的总的反射光能量。如下面的积分公式,L_r代表沿着出射方向w_r上的由dA反射的总能量,L_i是沿着入射方向w_i 射入dA的能量,f_r是换算比例,沿着方向积分即可将所有方向的“贡献”加和。




总的反射光能量

渲染方程

物体表面发出的光由L_e->自发光和L_r->反射光组成




渲染方程

简化方程得下图,可以看到直接光照和间接光照的关系,直接光照就是光线只弹射一次,间接光照是光线弹射两次以上,因此光栅化只能完成直接光照部分,光线追踪可以完成间接光照的部分。




简化方程

怎么渲染 -> 怎么解方程?

Whitted-Style方法做了一个假设,光线遇到反射\折射材质就继续追踪,遇到漫反射材质就停下来做着色。这个假设并不符合物理,漫反射也会反射。因此引入路径追踪就是为了解决这个问题。

注意:路径追踪不太好处理点光源,因此假设的光源都是面光源
  • 蒙特卡洛积分 -> 用数值方法去算一个复杂定积分的近似值



蒙特卡洛积分

  • 简单算例 -> 直接光照



直接光照

假设物体不发光并且只考虑直接光照,渲染方程只剩下反射项,同时均匀采样,因此半球的总立体角为2π,概率密度函数=1/2π,得到下面的反射方程




反射方程

其中,p是着色点,wi是入射方向,wo是出射方向,这种情况就要遍历所有入射方向

  • 拓展到间接光照 -> 递归计算



间接光照

  • 只采样一个方向(N=1) -> 减少计算量



N=1

  • 发射多次光线 -> 减小噪声,模拟一条光线往多个方向反射的效果



发射多次光线

对于一个屏幕上的像素,从相机处发射多次穿过这个像素的光线,一次一条,对这条光线做只采样一个方向的路径追踪,得到多次光线的平均颜色。

  • 采样方式优化 -> 减小浪费的光线

对于一次追踪就可以到达光源的情况(直接光照),利用换元积分法,将在着色点上的积分以及对入射角的采样,转换到对光源(面光源)采样以及在光源上积分。这样可以在光源面积较小时,避免射出“浪费”的光线。




采样方式优化

以dw为半球原点,对dA求一次立体角,立体角等于面积/距离平方。这样即可获得dw和dA的关系。

注:对光源采样只能处理直接光照,间接光照是没办法简化的,还是会“浪费”很多光线,(例子:wi取了100个方向,但是只有2个方向的光线可以打到光源附近的,因此其他光线就“浪费”了。)解决这种问题可以使用BDFT。



BDFT

  • 处理直接光照的遮挡问题



处理遮挡

BRDF的一些性质

  1. 非负性:fr >= 0
  2. 线性:BRDF是线性变换
  3. 可逆性:入射方向和出射方向可以互换,BRDF不变
  4. 各向同性\异性:BRDF只与相对方位角有关 -> 各向同性,BRDF与绝对方位角也有关 -> 各向异性
  5. 能量守恒

材质与渲染方程 -> 材质 = BRDF

颜色的准确定义




颜色

不同的材质,不同的方程

  • Glossy、Diffuse、Lambertian -> 漫反射 -> BRDF

处理漫反射就是用之前学过的Path Tracing去采样间接光照的光线方向

  • Specular -> 镜面反射 -> BRDF



镜面反射

  • Refractive -> 折射 -> BSDF

菲涅尔折射定律 ->

Microfacet Material 微表面材质 -> 一种基于物理的材质(state-of-Art)

定义

物体的表面是凹凸不平的,宏观的表面由许多微小的平面构成,光线在每个微平面上发生理想镜面反射或折射。

作用

通过改变微表面的法线分布,可以改变其对光的反射和折射效果。




法线分布

应用

参考链接 ->

高级光线追踪简介 -> 学术界前沿

这一部分就不详细介绍了,感兴趣可以根据我我给出的参考链接学习

无偏光线追踪

  • 双向路径追踪 (Bidirectional Path Tracing)(BDPT) ->
  • Metropolis Light Transport (MLT) ->

有偏光线追踪

  • 光子映射 (Photon Mapping) ->
  • Vertex Connection and Merging(VCM) ->

实时辐射度算法(Instant Radiosity) ->

高级材质表面

参与介质 ->

毛发材质 ->

次表面散射 ->

布料材质 ->

颗粒状材质 -> 用的不多

相关内容