Notes
Graphics
Graphics
😃

计算机图形学 课程中学习的请看这里

图形学

基础

图形学的核心科学问题是在计算机中有效的表达和处理三维世界的各种属性。图形学所处理的三维信息既包括物理真实世界中的三维信息,也包含我们人类大脑通过想象产生的虚拟的三维信息。计算机图形作为一个中介,提供了这两个世界在计算机中的一个共同的表达和信息交流渠道。

在计算机图形学诞生之前,物理学家和数学家已经对真实三维世界进行了长期的研究,把我们观察到的世界有效的解构为核心的一些物理量和他们之间相互作用的规律。如图 1 所示,传统的图形学受物理学和数学启发,将三维对象分解为几何、表观、行为或者动态三种属性。其中几何描述三维对象的几何形状;表观描述三维对象的材料光照属性以及材料如何和光相互作用;行为则表达了一个三维对象的动态特性从而决定了对象的运动和其他物体的交互行为。

在这个基础上,针对不同对象特性和应用要求的不同,图形学研究中具体的三维对象又可以大致分为物体、人(包括类人的角色 character)以及环境三部分。

针对这些三维对象的不同三维信息(几何、表观、行为),我们把图形学的研究方向和技术也可以大致分为三个大类:

一是获取和建模。 主要研究如何有效地构建、编辑、处理不同的三维信息在计算机中的表达,以及如何从真实世界中有效地获取相应的三维信息。这既包括三维几何建模和几何处理这一研究方向,也包含材质和光照建模、人体建模、动作捕捉这些研究课题。

二是理解和认知。 主要研究如何识别、分析并抽取三维信息中对应的语义和结构信息。这个方向有很多图形学和计算机视觉共同感兴趣的研究课题,如三维物体识别、检索、场景识别、分割以及人体姿态识别跟踪、人脸表情识别跟踪等。

三是模拟和交互。 主要研究如何处理和模拟不同三维对象之间的相互作用和交互过程。这既包含流体模拟和物理仿真,也包含绘制、人体动画、人脸动画等方面的研究。

光照模型

局部光照模型

局部光照模型,并不是真正准确的模型,但是优点是计算快,效果可以接受,至今依然广泛的运用在各种游戏之中。之所以物体能被我们观察,是因为人眼接收到了从物体来的光。 没错,这其实也就是 局部光照模型的基础。

泛光模型(环境光)

这是最简单的经验模型,只会去考虑环境光的影响。

Ienv=KaIaI_{e n v}=K_{a} I_{a}

其中 Ka 代表物体表面对环境光的反射率, Ia 代表入射环境光的亮度,Ievn 存储结果,即人眼所能看到从物体表面反射的环境光的亮度。

Lambert 模型

Lambert 漫反射模型其实就是在 泛光模型的基础之上增加了漫反射项 。漫反射便是光从一定角度入射之后从入射点向四面八方反射,且每个不同方向反射的光的强度相等,而产生漫反射的原因是物体表面的粗糙,导致了这种物理现象的发生。

Id=kdmax(0,nl)Ld0kd1I_{d}=k_{d} \max (0, \vec{n} \cdot \vec{l}) L_{d} 0 \leq k_{d} \leq 1
  • 漫反射亮度受光线入射方向 l 与单位表面的法线 n 夹角影响

  • 受 l 和 n 的夹角的影响,夹角为 0 时光照最亮,夹角为 90 度时无光照

  • 如果 < 0,代表光照方向和法线方向相反,此时不做光照处理

Phong 模型

在 1975 年,由 Phong 提出,以他的名字冠名。是一种局部光照的模型,他认为一个光照模型可以用三种不同的部分组成,主要包括: 环境光 ambient,漫反射 diffuse,和高光 specular。

高光反射 Specular 计算

*环境光计算见泛光模型,漫反射计算见 Lambert 模型

镜面反射是指若反射面比较光滑,当平行入射的光线射到这个反射面时,仍会平行地向一个方向反射出来,这种反射就属于镜面反射

当一束平行光触及光滑物体表面时,光线则发生规律性反射,反射后的光线也相互平行,这种规律性反射称为光的单向反射或镜面反射。但物体的光滑程度是相对的,而一般物体的表面多粗糙不平,入射线虽然为平行光线,但反射后的光线则向各个方向分散,此种现象为光的漫反射。

Is=ks(rv)sLsI_{s}=k_{s}(\vec{r} \cdot \vec{v})^{s} L_{s}
  • 取反射方向和视口方向的夹角作为高光区域的判定
  • 指数系数 s 控制高光区域的大小
Phong 模型 计算
I=Ia+Id+Is=kaLa+kdmax(0,nl)Ld+ks(rv)sLs\begin{aligned} I & =I_{a}+I_{d}+I_{s} \\ & =k_{a} L_{a}+k_{d} \max (0, \vec{n} \cdot \vec{l}) L_{d}+k_{s}(\vec{r} \cdot \vec{v})^{s} L_{s} \end{aligned}

Blinn-Phong 模型

Blinn-Phong 光照模型在物理上的正确性不必 Phong 高,但计算效率提高了很多。当观察向量与反射向量越接近,那么半角向量与法向量 N 越接近,观察者看到的镜面光成分越强。

I=Ia+Id+Is=kaLa+kdmax(0,nl)Ld+ks(nh)sLs\begin{aligned} I & =I_{a}+I_{d}+I_{s} \\ & =k_{a} L_{a}+k_{d} \max (0, \vec{n} \cdot \vec{l}) L_{d}+k_{s}(\vec{n} \cdot \vec{h})^{s} L_{s} \end{aligned}

全局光照模型

Whitted-Style 模型

局部光照模型就是眼睛-物体-光源。光线只反射了一次,所以是只考虑了直接光照。

顺着这个思路,如果我们考虑光在物体之间的反射,那该怎么做?

实际上很简单:举每个像素的位置,从眼睛向它连线,找到碰到的第一个物体,计算颜色,然后计算反射/折射方向,计算从该点该方向射出的射线碰到的第一个物体,计算颜色,如此反复。最后递归回溯时计算贡献。换句话说,便是:眼睛-(物体-光源)-(物体-光源)-(物体-光源)-...-(物体-光源)。这里,计算阴影,可以直接在着色时完成。只需要计算颜色时判断一下与光源的连线是否被遮挡即可。

*注意:Whitted 方法只对反射、折射的材质进行递归处理,当碰到其他材质(例如 diffuse)便停下。

Lumen 模型

Lumen 创新性的采用直接光和间接光分开求取:用距离场求得直接光,表面缓存求间接光。

  1. 距离场 Distance Field(SDF)判断光线和三角面相交:
  2. 表面缓存(Surface Cache)
  3. Lumen 工程上的具体实现,会根据物体的距离采用不同的加速方案

详解视频 (opens in a new tab)

简单画面绘制

绘制算法

扫描线算法

扫描线算法是一种计算机图形学中常用的图像渲染算法,用于绘制三维模型或二维图形的表面。它通过逐行扫描图像,计算每个像素的颜色值。

Z-Buffer 算法

Z-Buffer 算法是一种经典的扫描线算法,也被称为深度缓存算法。它使用一个与屏幕大小相同的缓冲区,称为 Z 缓存器,来记录每个像素点的深度值。在扫描线的过程中,对于每个像素点,比较其深度值与 Z 缓存器中对应位置的值,如果较小,则更新 Z 缓存器,并将该像素点的颜色值保存下来。最终,得到的图像就是按照深度顺序绘制的。

扫描线 Z-Buffer 算法

扫描线 Z 缓存器算法是一种优化的 Z-Buffer 算法。与普通的 Z-Buffer 算法不同的是,扫描线 Z 缓存器算法将每条扫描线拆分成若干个小段,每个小段都有一个深度值,而不是整个扫描线一个深度值。这样可以更精确地计算每个像素的深度值,提高渲染效果。

区间扫描线算法

区间扫描线算法是一种对于具有平行四边形边界的多边形进行填充的扫描线算法。它通过寻找每条扫描线与多边形的交点形成的区间,来确定每个扫描线上需要填充的像素点。区间扫描线算法在处理平行四边形和其他有规则形状的多边形时比传统的扫描线算法更高效,因为它避免了重复计算一些像素点。

A-Buffer 算法

于解决透明物体的可见性问题的图形算法。它使用 A 缓存器来存储每个像素处的透明度值,并在渲染过程中累加透明度值。这样可以实现对透明物体的正确排序和遮挡关系的绘制。然而,A 缓存器算法需要较大的内存和计算资源。

多边形明暗过渡方法

Gouraud 光亮度插值

它通过对多边形顶点处的光照强度进行插值,来计算出多边形内部每个像素的光照强度。具体而言,对于每个顶点,计算其法向量与光源的夹角,根据光照模型得到光照强度,然后在多边形内部对光照强度进行插值,并根据插值结果计算每个像素的颜色值。

Phong 法向量插值

Phong 法向量插值是一种更加精确的多边形明暗过渡方法。与 Gouraud 光亮度插值不同的是,Phong 法向量插值不仅对顶点处的光照强度进行插值,还对法向量进行插值。这样可以更准确地计算每个像素的法向量,并根据法向量和光源位置,计算出每个像素的光照强度和颜色值。

阴影生成算法

阴影细节多边形算法

阴影细节多边形算法(Shadow Volume Algorithm)使用一个或多个阴影体来表示光源被阻挡的区域。该算法通过渲染阴影体和场景,并进行深度测试来确定每个像素是否受阴影影响。具体而言,算法首先根据光源和物体来生成阴影体(通常是与物体相交的几何体)。然后,绘制场景时,对于每个像素,通过比较其深度值与阴影体的深度值来确定是否受阴影影响。阴影细节多边形算法可以产生较为真实的阴影效果,但需要额外的几何计算和渲染操作。

影域多面体算法

影域多面体算法(Shadow Mapping Algorithm)是一种基于纹理的阴影生成算法。该算法首先从光源的视角渲染场景,将深度信息存储到一个称为深度贴图的纹理中。然后,在光照计算阶段,对于每个像素,通过将其位置变换到光源视角,并比较其深度值与深度贴图中的值来判断是否在阴影中。影域多面体算法具有较低的计算和渲染开销,但可能会产生一些不精确或伪影的阴影效果。

图像合成技术

RGBA 方法

RGBA 方法是指在图像合成时考虑红色(R)、绿色(G)、蓝色(B)和透明度(A)四个通道的值。每个像素通过这四个值来确定其颜色和透明度,然后根据算法将多个图像进行混合合成。透明度通道(A)表示图像元素对于最终合成图像的可见度,可以控制图像叠加时的透明效果。

RGBZ 方法

RGBA 方法的升级版是 RGBAZ 方法,其中“Z”通道表示每个像素点的深度值。通过考虑深度信息,可以实现更加准确的图像合成。在 RGBAZ 方法中,通过比较像素点的深度值来确定哪个图像元素位于其他图像元素之前或之后,从而生成更真实的合成图像。深度值通常是通过 Z-Buffer 算法或其他深度排序算法计算得到的。

基于多重扫描线的图像合成方法

基于多重扫描线的图像合成方法是一种使用扫描线技术来进行图像合成的方法。该方法将多个图像元素分割成扫描线,对每个扫描线进行处理并合成最终的图像。在每个扫描线上,根据不同的算法(如混合、遮挡等)决定图像元素的显示顺序,并将它们合成成最终的图像。基于多重扫描线的图像合成方法可以有效地处理复杂的图像合成场景,并在渲染过程中实时生成合成图像。

光线跟踪算法

基本原理

是模拟光线在场景中的传播和相交,从而计算出图像中每个像素的颜色和光照效果。它是一种追踪逆向光线的方法,与传统的基于多边形的渲染管线有所不同。

在光线跟踪中,从相机出发,沿着每个像素的视线方向发射光线。每条光线与场景中的物体进行相交测试,以确定像素最终的颜色值。光线跟踪的基本算法包括:

  1. 光线 - 物体相交测试:每条光线与场景中的物体进行相交测试(如球体、平面等)。通常使用光线与物体表面的交点来计算光照效果。
  2. 光线 - 光源交点测试:如果光线与物体相交,则进一步计算光线与光源之间的相交点,以确定该点是否受到光照影响。
  3. 光线 - 反射和折射测试:在相交测试中,可以通过计算反射和折射光线来模拟材质的反射和透明效果。

其他技术方法

  1. 层次包围盒技术:使用层次包围盒(如包围球、包围盒等)来提高相交测试效率,减少不必要的计算。
  2. 3DDDA 算法:3DDDA(Three-Dimensional Digital Differential Analyzer)算法用于计算光线与物体表面的交点,提高求交效率。
  3. 空间八叉树剖分技术:将场景划分为八叉树结构,用于提高相交测试的效率和场景的快速遍历。
  4. 二叉空间剖分加速技术:将场景递归地划分为二叉空间剖分结构,用于加速相交测试和加快遍历。
  5. 光束跟踪算法:使用光束(束束光线)而不是逐个像素进行光线跟踪,以提高效率。

纹理映射技术

纹理映射的建立

纹理映射是计算机图形学中常用的一种技术,用于将二维图像(纹理)映射到三维物体的表面上,增加真实感和细节。

Catmull 算法

Catmull 算法是一种纹理映射的方法,通过对顶点之间的纹理坐标进行插值,来计算并生成其他像素的纹理坐标。它使用 Catmull-Rom 插值算法,通过在曲线上的相邻顶点之间进行插值,生成平滑的曲面纹理效果。

Blinn 方法

Blinn 方法是一种常用的光照模型,也可以用于纹理映射中。该方法结合了 Lambertian 反射和镜面高光反射,通过计算光照方向和视线向量与表面法线的夹角来决定表面的颜色和高光效果。

两步法纹理映射技术

两步法纹理映射技术是一种两个步骤的纹理映射方法。首先,在物体表面上根据纹理坐标确定像素的颜色,然后使用光照模型(如 Blinn 方法)计算光照效果,将纹理和光照效果合并得到最终的像素颜色。

环境映射技术

环境映射技术利用环境纹理来模拟物体表面对周围环境的反射。它通过将环境纹理图片映射到物体表面上,使用物体表面法线和视线向量计算出反射向量,然后在环境纹理中找到对应的颜色值,从而产生具有反射和折射效果的纹理。

纹理映射中的快速反走样技术

快速反走样技术主要是通过减少纹理采样的过程中产生的伪像和锯齿现象,以提高渲染图像的质量。

Mip-map 技术

Mip-map 技术是纹理映射中常用的反走样技术之一。它通过预先生成一系列级别(尺寸不同)的纹理图像(Mip-map 纹理),并在渲染过程中根据实际场景中纹理的尺寸和接近程度来选择合适的级别进行采样。Mip-map 技术可以减少纹理采样时的尺寸变化和锯齿效应,提供更加平滑和真实的纹理效果。

了解区域求和表技术

区域求和表技术(Area Sum Table)是另一种快速反走样技术。在区域求和表技术中,将纹理按照一定的间隔分成多个小区域,然后计算每个区域内纹素的颜色和亮度信息,并生成一个求和表。在渲染过程中,以区域为单位进行纹理采样,通过插值和加权计算获取像素的颜色值,从而减少锯齿现象和提高图像质量。

逐步舍弃法

逐步舍弃法(Progressive Supersampling)是一种逐渐增加采样率的反走样技术。在逐步舍弃法中,从低分辨率的采样开始,逐步增加采样数目,通过对多个低分辨率图像的加权平均,得到更高分辨率的合成图像。逐步舍弃法提供了更加平滑的图像边缘和纹理细节,同时较好地平衡了计算资源和图像质量。 了解几何纹理映射技术,三维纹理映射以及过程纹理。

辐射度方法

理想漫射环境的辐射度方程

理想漫射环境的辐射度方程是根据兰伯特定律得出的。兰伯特定律指出,理想漫射表面在所有方向上的辐射强度是均匀的,与观察方向无关。因此,理想漫射环境的辐射度方程可以表示为:

L=ρEcos(θ)L = ρ * E * cos(θ),

*L 表示辐射度,ρ 表示表面的反射率,E 表示入射辐射度,θ 表示入射方向与表面法线的夹角。

形状因子计算

形状因子计算用于确定两个物体表面之间的能量传递。

线积分技术

线积分技术通过对两个物体表面之间的路径进行积分来计算形状因子。该方法将路径分割成多个小线段,并计算每个线段上的形状因子贡献。可以使用采样点或点云对路径上的点进行估计,然后根据估计值进行积分计算。

Nusselt 方法

Nusselt 方法使用表面网格上的边界积分来计算形状因子。它首先将一个物体的表面投影到另一个物体的表面上,并计算投影区域的面积。然后,通过对投影区域上的点进行加权和求和来计算形状因子。

半立方体算法

半立方体算法将两个物体表面分别划分为小立方体,并计算两个立方体之间重叠的体素的贡献。通过求和重叠体素的体积,并乘以体素内的点数量来计算形状因子。

半球面分割技术

半球面分割技术将物体表面分割成小区域,并计算每个区域与另一个物体表面之间的形状因子。通常使用球面坐标系下的离散积分来计算每个区域的形状因子贡献。

Monte carlo 积分方法

Monte Carlo 积分方法是一种基于随机采样的方法,用于估计形状因子。通过随机采样路径上的点,并计算点与目标表面上的区域的相交情况,从而估计形状因子的值。

层次结构辐射度算法

层次结构辐射度算法(Hierarchical Radiosity Algorithm)是一种用于计算辐射度的计算方法,通过层次化的结构来提高计算效率。该算法将场景中的物体按照层次化的结构分解,并根据各层次之间的关系逐步计算辐射度。

该算法的基本思想是将场景中的物体进行分割,构建一个层次结构。每个层次包含一组相似(例如,光照相似)的物体,其中顶层为整个场景,底层为最小的物体。首先在最底层计算辐射度,然后通过迭代的方式向上计算各个层次的辐射度。

非漫射环境的辐射度方法

非漫射环境的辐射度计算方法用于模拟和计算非均匀反射特性的表面的辐射度。

了解全局立方体算法

全局立方体算法使用离线渲染技术,将场景划分为立方体,并根据不同法线方向上的光照来计算辐射度。通过在每个立方体内构建和迭代计算辐射度传递,最终得到全局的辐射度分布。

wallace 两步法

Wallace 两步法分为两个步骤来计算非漫射环境的辐射度。首先,通过计算场景中所有直接光照的贡献来计算起始辐射度。然后,通过迭代计算间接光照的贡献来获得最终的辐射度。这种方法可以用于复杂的非漫射环境,同时考虑到间接光照传递和反射。

邵敏之方法

邵敏之方法使用球形图像和球谐函数来表示非漫射环境的辐射度。通过在球谐系数空间中计算辐射度,并进行球谐函数的重建,得到最终的辐射度。这种方法通过低频和高频谐波分解,有效地表示非漫射环境光照的空间变化。

真实感图形的实时绘制技术

实时消隐技术

时消隐技术是用于提高实时图形绘制效率的一种方法。它通过剔除不可见的物体或图元,减少不必要的计算和渲染过程,从而提高实时图形绘制的速度和效果。一些常见的实时消隐技术包括视锥剔除、背面剔除、裁剪、深度测试和遮挡查询等。

层次细节模型

层次细节模型是一种用于实时图形绘制的渲染方法,通过动态加载和管理不同层次的细节模型来提高绘制效率。该模型将物体分解为多个层次,根据观察距离和视口大小选择合适的精细度和模型细节,从而在不降低渲染质量的情况下提供实时绘制性能。

自然景物模拟

模拟随机表面和山脉的分形技术

分形技术可以用于模拟随机表面和山脉等自然景物的复杂形状。分形是一种自相似的数学模型,在图形学中常用于生成复杂和逼真的景物。通过使用分形算法和噪声函数,可以生成具有多个层次、细节和随机性的表面和山脉纹理,并且能够保持其自相似的特性。

L-系统

L-系统(Lindenmayer system)是一种用于模拟植物生长的形式文法系统。L-系统通过设置一组生长规则、初始状态和迭代次数来模拟植物的生长过程。每次迭代时,根据规则和当前状态,生成新的分枝或叶子,并沿着特定的生长方向逐渐生成植物的结构。通过调整规则和参数,可以生成各种形态多样的植物结构。

模拟不规则模糊自然景物的粒子系统

粒子系统是一种模拟粒子运动和相互作用的技术。在模拟不规则模糊的自然景物时,粒子系统可以用于模拟诸如烟雾、云彩、火焰、水流等具有流动和变化的自然现象。通过模拟粒子的位置、速度、颜色和透明度等属性,并使用力场、碰撞检测等算法来模拟粒子的行为,可以生成逼真的不规则模糊自然景物效果。