Ede's Blog

摘要,图形学入门 WIP

  学习的摘抄,无营养的碎碎念。
  不小心Post到博客上了,本想删除,又念来字节后,虽日常思考比之前要多,但均记录在飞书文档上,而荒废了博客。
  决定保留此文,稍以润色,当作博客还「存活」的标记吧。

图形学

以下为Games 101网课笔记。

由于大学没有选修此门功课,在此拜读。

变换(transform)

作为一名前端er,对于变换可谓非常熟悉,伸缩(Scale)、旋转(Rotate)、平移(translate)、变形(sheard)等,其均可通过向量 + 矩阵的乘法表述,又为变换矩阵(Transformation matric)。为什么要变化为矩阵?答:统一且高效

光栅化(Rasterization)

将矢量图形数据投影到屏幕坐标(只是坐标的变换,不是显示到屏幕上啊喂)的过程,称为光栅化(Rasterization)。众所周知,屏幕由像素点组合而成,像素点最小单位为1,是不连续 / 离散。但矢量图形是连续的,从连续(数据)到不连续(实际显示),需要经过「采样」(Sampling)。采样,必定存在信息的丢失,常见现象,就是「锯齿」(Aliasing),作为一名游戏万家,对抗锯齿(Anti-Aliasing)不可谓不熟悉。(GTMD的狗日ETC,害得老子没得3060Ti Van ♂ 游戏,只能学图形学。)课程讲述的抗锯齿的方法有三:

  1. 先「模糊」再「采样」,称为「多重采样抗锯齿」(Multisample anti-aliasing)。很容易理解,模糊,就是将特征从一个点的特征到周围,做到你中有我,我中有你。PS抠图后也常用模糊处理边界,减少突兀。
  2. 从上一帧查找灵感,如:「快速近似抗锯齿」(Fast approximate anti-aliasing)、时间抗锯齿(Temporal anti-aliasing)。也比较容易理解,MSAA,是在同一时间,单一位置的模糊,而TAA,是不同时间,单一位置的模糊。
  3. 根据经验,去猜。2022年,涉及猜的东西,想必第一反应便是:「机器学习」。如:N家的DLSS、A家的FSR、以及原来是小瘪三之I家的Xss。均是如此。(往自己脸上贴金之:最近勾搭上,我有一位同学之,港大博士毕业之 两年三篇次顶会一作之 腾讯技术大咖专项SSSP之 图形学新生代之 我的大学 实验室 自习室之 反正不管怎么吹工资差不多是我两倍之 林同学,从事2d → 3d建模还原,通过的也是机器学习 + 几何算法。)

采样的另一个弊端则是:摩尔纹(moiré pattern)。网课于此,对于摩尔纹的产生原因「采样的速度跟不上信号的变化」觉得难以理解。目前的理解是:因为显示器光栅化的过程不是瞬时,而可能逐行或逐列,甚至某些优化算法,可能是跳行或跳列等。比如我买的投影仪,虽然光学镜头是720P,但通过快速抖动,变成伪1080P。当采样的频率和图像的频率不同(辅助理解的链接),如课程中举例,正交投影下的,倾斜的单元网格.jpg

在此简单带过了一个概念,深度缓冲(Z-buffer)。用于解决三维坐标投影到二维平面时,二维坐标相同,不同三位点的可见性问题。当存在Alpha通道,可能会在着色上做加权运算。

着色(shading)

顾名思义,就是对一个点上颜色。看似非常简单,但稍以了解,可谓技巧满满。因为不同的着色可以代表不同的光照和材质!也就是说,同一个3D模型,应用不同的着色,既表现为冰,又可表现为火,冰火两重天啊有木有!对此我是表示怀疑的,但随后略读了开源书籍 The Book of Shader(介绍了GLSL着色器语言)。竟然至今还有各种论文,我承认,它确实牛逼好吧。

对于光照,常见的是应用布林-冯反射模型,可分解为:高光 + 漫反射 + 平行 / 环境光的加权组合。了解不深,只能上!才!艺!。截止于此,目前的渲染管线(物理),即为:图形 -> 三角化 -> 光栅 -> 着色。

贴图(Texture Mapping)

Long Long Age,自学Blender And Threejs,对贴图略知一二。简单来说,就是很多哇塞酷炸天的渲染效果,即时计算的话,需要耗费大量CPU或GPU算力,如果能提前渲染成图片(2D),再通过某种规则映射到物体(3D)上,就能提高帧率了,本质上空间换时间,就也很哇塞拉。「预烘焙」,在游戏中是常见的优化手段之一。弊端嘛,玩过游戏的也知道,因为贴图是2D的,没有空间属性,换个角度就GG了,常用于固定视角、或远景、或人物纹理等。最常见的贴图方式,便是uv贴图(uv mapping,辅助了解链接)。而其他的诸如不同的插值方式有:双线性插值(Bilinear)、双三次插值(Bicubic),MinMap,即学即忘,不展开了。

单独提一下「双向异性过滤(Anisotropic filtering)」。(为啥?因为我Van ♂ 游戏遇到了)。这项能力,能让近远景更加清晰,同时也能辅助理解「摩尔纹」。

TODO 几何(Geometry)

讲述的是如何用数据表达自然界的物体。

  • 凹凸(环境光):法相贴图、位移贴图、动态曲面区分(directX)
  • 表示方法:隐式、显式、逻辑运算(交、并、减、距离函数融合)(各种流体)、自分型
  • 点云,贝塞尔曲线、样条曲线
  • 网格细分(Loop、Catmull-Clark)、减少、常规化
  • Shadow Mapping(硬阴影,软阴影)

光线追踪(Ray Tracing)

光线跟踪,通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型

光线追踪,是介绍算法最多的章节。如果从光子的角度出发,则其运算本质上是立体空间的碰撞检测。

碰撞检测技术中所用的包围盒有两个属性:「简单性」和「紧密性」。

简单性是指包围盒间进行相交测试时需要的计算量,这不但要求几何形状简单容易计算,而且要求相交测试算法简单快速;

紧密性要求包围盒尽可能的贴近被包围的对象,这一属性直接关系到需要进行相交测试的包围盒的数目,紧密性越好,参与相交测试的包围盒数目就越少。

最常见的是AABB包围盒(Axis-aligned bounding box):这是一种近似碰撞检测算法,将物体简化为盒子(x、y、z轴)进行碰撞计算,但对不规则物体,或倾斜的规则图形,会带来较大误差。

为了加速,碰撞检测常常不是一对一,而是多对多的关系。在此需要引出「空间划分」的概念,属于高中集合概念的拓展:当两类物体的集合不相交,则其一集合的任意物体,均和另一集合的任一物体不相交。

在空间划分上,可能会涉及以下集中数据结构:

  • 八叉树(Oct-Tree)类比二叉树,差别在于,表示的是三维模型。
  • BSP(Binary space partitioning,二叉空间分割)-Tree:主要原因是:物体常常不是空间均匀分布的。
  • KD(k-dimensional k维)-Tree:k-d树是每个节点都为k维点的二叉树。在查找时,可以以类二分查找的方法。但是难以判断包围盒和三角形是否有交集。
  • BVH(Bounding Volume Hierarchies 层次包围盒)-Tree:划分的依据不是空间,而是物体。比如:划分「中间」物体 的依据是 「最长轴」。因此,包围盒可能相交。

光线追踪在数学方面的表示方式:

  1. 辐射度量学(后面带有“学”的文字,都应条件反射肃然起敬)、双向反射分布函数(BRDF-Bidirectional reflectance distribution function),期望基于物理学的角度(而不是各种近似,比如上诉提及的布林-冯模型)去理解和描述光照及其作用。因为涉及较多的计算量,所以一般用于电影而非实时游戏的渲染。

  2. 泰勒公式(用多项式来近似表示函数在某点周围的情况)展开表示(题外话,芝诺悖论:可理解为发生了N次折射,n = 0时:直接光照;n=1时:间接光照;n > 1时:全局光照。指的是以数学的角度来描述光照。

  3. 概率密度函數(Probability density function,PDF)& 蒙特卡洛积分估算,Link:大体求的是不同光照在空间意义上的期望值。要义是分布,而不是随机。

微微一提伽玛校正,大意指通过非线性显示方式修正视觉感官。如何理解?因为人眼接受颜色的程度是不同的,如:对红色最不敏感,对蓝色最敏感。参考:【科普向】屏幕(三)之周冬雨排列?钻石排列?那些常见的RGB排列

TODO 材质与外观(Material)

  • 反射率、折射、微表面、各向同/异性

  • 光线传播路径:

    • 蒙特卡洛估计:无偏、有偏;双向路径追踪、BTPT
    • MLT(马尔科夫链):通过其中一个样本,在周围生成更多相似路径
    • 光子映射(有偏)
    • VCM(集合双线 + 光子追踪)、IR(实时幅度):噪声、模糊折中
  • 外观建模

    • 非表面建模(头发、沙子),表面建模(玻璃等)

      • 散射介质(云、雾等)
      • 噪声函数(用时生成),更真实

其它

最后的章节,做了很多概念的拓展 / 补充,如:

介绍了小孔成像原理(九年义务教育的漏网之鱼,不说了,我先面壁去了),从而演化出相机。进而提及了曝光的影响因子:(我不听我不听,摄影穷三代,单反毁一生)

  1. 光圈:越大愿景越模糊
  2. 快门:越慢图像越模糊
  3. 反光度:越大越离散

一笔带过了「颜色」:什么是光场,光场的七个维度。

一笔带过了「动画」,弹簧系统、有限元分析、粒子系统;正向运动学,逆向运动学;梯度下降、动作捕捉。可参考教程:Games103 基于物理的计算机动画入门

总结

图形学是多学科交叉融合的一个学科。怪不多以前学校的图形学实验室叫交叉实验室。