前言

感觉自己一开始没有认真学,所以现在基础有点差,最近打算重学一遍,该手推就手推,不偷懒了。

这次主要是跟着 GAMES-Webinar 的课程学习,所以如果你想要看懂这份笔记,我建议先去学习相应的课程。

Transformation

View transformation

相机需要设置的参数。

将相机平移至原点并同时将 look atup 及其叉乘共三个向量同时对其标准坐标轴的矩阵即为 View matrix

唯一要注意的就是由于直接计算旋转矩阵比较复杂(从任意向量变换到标准坐标轴),所以先计算其逆矩阵(从标准坐标轴变换到任意向量)。

Projection transformation

其实只要求从四棱台压缩到矩形的矩阵就行了。

直觉上其实很容易得出结论,难点在于求出相应的变换矩阵。

为了计算出来就得补充两个假设。

Any point on the near plane will not change
Any point’s z on the far plane will not change


解方程后也能求出来最后的投影矩阵(还需要用 FOV 和长宽比进行参数替代)。

最后再通过正交矩阵映射到 NDC 空间。

补充一点,如果不出意外的话四棱台向长方体的挤压方向是这样的。

因为如果不做出第二条假设,所有的点都会向法线(垂直边方向)挤压,第二条假设的存在使挤压形变变少,速度变慢。

欧拉角,旋转矩阵和四元数

欧拉角

万向锁就是旋转过程中,任意两轴重合,导致旋转轴的缺失。

旋转矩阵

唯一的缺点就是不方便插值。

四元数

四元数的话就看 3B1B 的视频吧。

四元数是一种具有四个实数分量的超复数。四元数也可以用于表示三维空间中的旋转,其中三个实数分量表示旋转轴的方向,第四个实数分量表示旋转的角度大小。四元数在旋转计算中具有很多优点,例如不存在万向锁问题,计算量小,而且可以很容易地插值和球面插值。然而,使用四元数需要对其进行规范化处理,而且理解四元数可能需要更多的数学知识。

Rasterization

光栅化的本质就是采样(没有配图是因为希望每次看到这句话的时候都能自己去想象这张图片)。

反走样

在采样过程中,每个像素的颜色值是由周围像素颜色值插值得到的,因此如果周围像素颜色值发生了剧烈变化,那么插值得到的像素颜色值就会出现锯齿状的边缘。这种锯齿现象是因为高频分量没有被滤波掉导致的。

MSAA 和 FXAA

  • 实现方式:FXAA是一种基于像素的反走样技术,它使用特定的颜色滤波器对像素进行处理,从而实现反走样的效果。而 MSAA 则是一种基于多个采样点的反走样技术,它在采样点周围绘制多个采样点,然后对采样点进行平均化处理,从而实现反走样的效果。

  • 渲染速度

  • 效果质量:FXAA 相对于 MSAA 来说效果稍逊一些,因为它只是对像素进行颜色滤波处理,容易出现图像过度平滑和模糊等问题。而 MSAA 则可以更好地保留图像的细节和清晰度,但是需要更多的计算资源。

  • 适用范围

特定的颜色滤波器是指针对图像中特定类型的边缘和锯齿问题而设计的一种颜色滤波器。在 FXAA 中,采用了一种基于 Luma 值(亮度)的颜色滤波器,通过计算像素周围的亮度值来检测出可能的边缘和锯齿,并将其进行平滑处理,从而达到反走样的效果。

这种颜色滤波器主要是通过将图像中相邻的像素进行比较,并根据它们之间的颜色和亮度差异来判断是否存在边缘和锯齿,并对这些像素进行颜色和亮度的平滑处理,从而消除图像中的锯齿和边缘问题。这种处理方式不需要对图像进行多次采样或绘制额外的像素,因此可以在较短的时间内完成反走样处理,并且对于移动设备、游戏主机和低端PC等设备来说具有很好的适用性。

TAA(Temporal Anti-Aliasing)

传统的空域反走样技术往往会导致图像失去一些细节和清晰度,而时域反走样技术可以利用前一帧和当前帧之间的信息来进行反走样处理,从而避免这种问题。

TAA 通过利用前一帧和当前帧之间的运动信息,以及图像的深度信息等,计算出运动向量,并将当前帧的像素颜色与前一帧进行混合,从而得到一个平滑的图像。具体来说,它将前一帧的像素颜色投影到当前帧上,并计算出两帧之间的运动向量,然后将当前帧的像素颜色与投影的像素颜色进行混合,从而得到反走样效果。

TAA 不仅可以减少锯齿状边缘和走样等问题,还可以增强图像的清晰度和细节。但是,它也会带来一些副作用,比如图像可能会出现闪烁和模糊等问题。因此,使用 TAA 需要进行适当的调节和优化,以平衡反走样效果和图像质量。

超采样

DLSS(Deep Learning Super Sampling)

Texture

Texture Mapping

求三角形三点坐标对重心的贡献系数。

根绝贡献系数就可以实现纹理映射了,不过对于三维坐标(比如深度),就只能在三维空间内插值计算好后再映射到二维空间,因为重心从三维映射到二维后相对坐标会发生偏移。

三线性插值,猜猜哪来的三个维度?

纹理过小

纹理过大

由于每个屏幕像素只插值纹理上的一个像素点(即使覆盖了很多像素,也只是像素平均后的一个点),所以会导致走样。

三维纹理

核磁共振中会用到。

Shadow Mapping

从光源看一遍并把深度值存下来,再从相机看一遍,深度一样就是可见。

就是阴影太硬了,还需要用算法优化。

Geometry

曲线

贝塞尔曲线

三阶贝塞尔曲线(四个控制点)满足 C1 连续,所以是平滑的。

网格体

曲面细分

曲面细分本质就是寻找新的顶点,具体顶点的位置就像平均卷积一样,有周围的点控制。

曲面简化

去掉一些点,同时让信息量的变化最少(一个度量函数)。

光照模型

其实同样的模型对于不同的渲染方法,出来的结果也是不一样的。

局部光照

主要就是分成漫反射光,镜面反射光和环境光三部分。

Diffuse Term(Lambertian)

Specular Term(Blinn-Phong)

加指数项,可以控制高光的大小(提高阈值)。

Ambient Term

全局光照

Whitted-Style Ray Tracing

用以下式子表示任一光线。

光线和物体求交

先粗判断。

AABB 包围盒。

关于如何划分包围盒有许多方案,但目前主要就是这两种。

BVH 的伪代码如下。

再细判断。

隐式表达式可以直接代入求。

显示表达式可以转换成求直线与平面的交点。

辐射度量学

我建议看一下这篇文章,讲的还是很好的,这里就直接给出公式了。

主要是要弄清楚辐射通量,辐射度和辐射率的区别。

其实如果把左边的 L 看作 Li,右边的看成 Li-1 会比较好理解。

这也是为什么光线追踪是全局光照的原因(事实上一次项的 PBR 就是局部光照)。

Path Tracing

优化光线追踪,通过概率(蒙特卡洛,俄罗斯轮盘赌)来降低计算量,同时保持期望值不变。

继续优化的话就是采样光源而不是采样物体。

将光分成两部分,直接光用改写后的方程计算,间接光用优化后的光线追踪方法计算。

还讲了许多优化路径追踪的渲染方法。