GAMES101的笔记
GAMES101: 现代计算机图形学入门
Lecture 1 Overview of Computer Graphics
什么是图形学
使用计算机去合成和操作视觉信息。
图形学的应用
-
Video Games
- 只狼、无主之地3
- 渲染中的关键技术:全局光照,技术角度上,全局光照越亮,技术水平一般越好;
-
Movies
- 黑客帝国:Special Effects,特效生活中越罕见,越容易实现;
- 阿凡达:面部和动作捕捉;
-
Animations
- 疯狂动物城:毛发模拟;
- 冰雪奇缘:烟雾、粒子特效;模拟动画;毛发和布料模拟;
-
Design
- CAD、CG:宜家、Autodesk
-
Visualization
- Science、engineering、medicine、journalism、etc.
-
Virtual Reality
-
Digital Illustration
- Adobe Photoshop
-
Simulation
-
Graphical User Interfaces(GUI)
-
Typography/Fonts bitmap or vector
为什么学习图形学
Computer Graphics is AWESOME.
课程大纲
-
光栅化
定义:把三维空间的几何形体显示在屏幕上。
计算机图形学分为实时的(30 Frame per Second+)和离线的。
-
曲线和曲面
定义:如何用图形学表示曲线和曲面。
-
光线追踪
动画和电影中的离线应用。也有实时光线追踪。
-
动画和模拟
关键帧动画、质量-弹簧系统。
课程不会包括:
-
使用OpenGL、DirectX、Vulcan
-
Shader语法
Learn Graphics, not Graphics APIs
-
三维建模/游戏开发(Maya/3DS MAX/Blender/Unity/Unreal Engine)
-
Computer Vision/Deep Learning
Lecture 2 Linear Algebra
基础线性代数复习
Lecture 3 Transformation
为什么要学习变换
- 模型变换(modeling)
- 视图变换(viewing)
动画、视角变化、投影
二维空间变换:旋转、缩放、切片
线性变换:使用矩阵表示变换
可以写为
的变换称为线性变换。
缩放变换(Scale)
对称/反射/翻转/镜像(Reflection)
or
切变(Shear)
$$
\left(\begin{matrix}
x'\\y'\end{matrix}\right)=\left(\begin{matrix}
s_x & a \\0 & s_y
\end{matrix}
\right)\left(
\begin{matrix}x\\y\end{matrix}\right)
$$
旋转(Rotate)
约定:默认绕原点逆时针旋转。
旋转矩阵是正交矩阵,也就是,它的逆等于转置。
齐次坐标
为什么需要齐次坐标
平移变换
平移变换无法使用矩阵相乘的形式表示。因此平移操作并不是线性变换。
为了避免平移成为特殊情况,引入齐次坐标。
(二维情况下)增加一个维度(w-coordinate)
-
2D point
-
2D vector ,最后一个维度是0,保证向量的平移不变性,使得平移操作对向量无效。
容易发现,在齐次坐标下,有以下性质:
- vector + vector = vector
- point - point = vector
- point + vector = vector
- point + point = ??
在齐次坐标中,
仿射变换(Affine)
仿射变换=线性变换+平移,例如
可以使用齐次坐标表示为
齐次坐标的代价:引入额外的维度(代价较小),在二维的仿射变换中最后一行是0 0 1;
逆变换
使用矩阵的逆。
例如,
组合变换
Transform ordering matters
仿射变换组合变换的矩阵可以提前相乘以保证性能。
如何实现矩阵绕某个点c旋转:
Matrices are applied right to left
三维空间变换
三维齐次坐标:
- 3D point
- 3D vector
的情况与二维规定相同
三维仿射变换:
Lecture 4 Transformation Cont.
3D Transformations cont.
绕x-, y-, z-轴旋转
x,y,z有循环对称性,因为而非,因此在的旋转矩阵中,sin的符号与x-, z-轴相反。
一般的旋转
绕任意轴的旋转都可以拆分为三个绕轴旋转
-
也被称作欧拉角
-
在飞行模拟中可以分为roll, pitch, yaw
Rodrigues’s Rotation Formula
绕任意轴旋转角度,轴过原点。
最右为叉乘矩阵。
推导过程https://blog.csdn.net/qq_36162042/article/details/115488168
若轴不过原点,则先平移使轴过原点,再做旋转,再平移回原起点。
四元数
应用于解决插值问题,例如旋转矩阵中,15°和25°的旋转矩阵平均不是20°旋转矩阵。此处不过多提及。
Viewing Transformation
View(视图)/Camera变换
What is view transmation?
如何拍一张好照片?
- 找一个好的位置把人群组织好(模型(model)变换)
- 找一个好的角度放置相机(视图(view)变换)
- Cheese!(投影(projection)变换)
M-V-P变换
如何放置相机
定义相机参数
- Position
- Look-at/gaze 方向
- Up direction (相机本身的旋转)
**如果相机和其他物体的相对位置不变,则图像不会发生变化。**因此,可以
- 把相机移动至原点,look at -Z, up to Y
- 所有的变换都是物体相对于相机的变换(使用相对运动的概念)

将任意的相机移动至上述标准位置

旋转矩阵是正交矩阵,因此它的逆等于它的转置。
相机做这样的变换,其他所有物品也需要做相同的变换,保证相对位置不变。
模型和视图变换通常一起进行,因此有时也被成为模型视图变换。
Projection(投影)变换
投影在计算机图形学中:
- 3D to 2D
透视投影视角汇聚于一点,正交投影相机位于无限远。
正交(Orthographic)投影
通俗理解
- 将相机位于原点,向-Z方向看,上方向为Y(与前述标准位置同)
- 丢弃掉Z轴所有内容
- 把结果Resize至
实际操作
We want to map a cuboid [l(eft), r] x [b(ottom), t] x [f(ar), n] to the “canonical (正则、规范、标准)” cube
透视(Perspective)投影
欧氏几何指同一平面内的几何学,透视投影涉及不同平面,因此平行线会相交。
回忆:齐次坐标下,(1,0,0,1)和(2,0,0,2)代表同一个点。

规定:在挤压过程中,近平面上的所有点永远不变,远平面的z值不会变化,远平面的中心点不会发生变化。
挤压:按照相似三角形进行变换


设第三行为,则因为近平面和远平面上的点的z值都不发生变化,并且z值与x, y 无关,.因此待定系数取得变换矩阵的第三行
远平面上的点的z值也不会发生变化,因此
有
解得矩阵第三行为.
因此
Lecture 5 Rasrerization 1 (Triangles)
光栅化成像
视锥
从摄像机出发,为看到的近平面定义宽度和高度,并定义
- 宽高比(aspect ratio)=width / height,
- 视角(field-of-view, fovY垂直可视角,同时也有水平可视角)
- l, r, b, t for left, right, bottom, top

(因为相机向方向,所以距离为)
屏幕
什么是屏幕
屏幕是一个二维数组,其中每一个元素都是一个像素。数组的大小为分辨率,屏幕是一个典型的光栅成像设备。
Raster == screen in Germen
像素
pixel short for picture element
像素的颜色是R/G/B的混合。
屏幕空间
以左下角为,右、上分别为x/y正方向,所有像素的坐标都为整数,从至
像素的中心在
屏幕覆盖了从的空间
视口变换:正则立方体到屏幕
先略掉z值;
将x、y从映射至屏幕
光栅显示设备
-
示波器
-
阴极射线管(Cathode Ray Tube, CRT)
逐行扫描,显示画面;隔行扫描技术提高了CRT的显示效率,在某些视频压缩技术中仍使用了隔行扫描的思想。在高速运动的情况下会产生画面撕裂。
-
Frame Buffer:将内存中的一片区域映射至屏幕上
-
平板显示设备
-
分辨率高于人类视网膜分辨率的屏幕称为视网膜屏幕。
-
LCD(Liquid Crystal Display)
液晶通过排布影响光的偏振,影响显示效果。
-
LED(Light Emitting Diode)
-
Electrophoretic(Electronic Ink) Display
通过控制墨水是在上方还是下方显示。刷新率很低。

-
Polygon Meshes
Triangles - Fundamental Shape Primitives
Why triangles
- 最基础的多边形
- 所有多边形都可以拆成三角形
- 独特的性质
- 三角形都是共面的;
- 三角形的内外定义非常清晰(凹凸多边形、内部有洞等);
- 三角形对于插值十分友好。
采样
通过采样将一个连续函数离散化。
三角形中的采样
Sample if Each Pixel Center Is Inside Triangle
判断点在三角形内部的方法:点与顶点连线,轮换地判断顶点与给定点与顶点连线的叉积方向,三个叉积方向一致则在三角形内部。
边界情况
当一个点在两个三角形边界时,有统一的定义即可。某些图形学API有严格的定义。
包围盒
使用轴向包围盒,避免检测所有的边界。
Axis-aligned-bounding-box(AABB)
针对不同情况,使用不同的包围盒(不一定非要使用轴向的),减少像素的检测个数。
实际像素排列
在LCD屏幕上,像素按照一定的bayer pattern排列
人眼对绿色最为敏感,因此Bayer pattern中绿色点更多。
在彩色打印机上,有其他的排列方式。
锯齿
由于像素本身具有大小和采样率问题,结果上会存在锯齿。因此会引入抗锯齿。
Lecture 6 Rasterization 2 (Antialiasing and Z-Buffering)
光栅化=对2d坐标进行采样
照片=对抵达感光元件的光线信息进行采样
视频=对时间进行采样
采样有可能会产生锯齿、摩尔纹(去掉奇数行和列会导致摩尔纹)
- 锯齿- sampling in space
- Moire- undersampling images
- Wagon wheel effect - sampling in time
统称为“走样(Aliasing)”
出现走样的原因:信号变化太快,采样的速率跟不上信号变化速度。
反走样的思路:在采样前对信号进行模糊处理(滤波)

先采样后进行滤波不可行。因为采样后已经产生了信号的混叠,此时再截断已经无法避免信号的混叠。
频域
傅里叶级数展开
将任意一个函数描述为一系列正弦函数的和。
傅里叶变换
将函数分解为不同频率的段。
频域与采样
函数中的低频部分能够更好地通过采样保留其特征。高频部分会损失更多精度。
若函数频率较高,则应采用更高频率的采样。
滤波
去掉函数中特定频率的部分。
图像的傅里叶变换
对于自然界中的绝大多数信息,低频信息较多,高频信息较少。图片中内容变化越剧烈,对应分量的频率越高。
附录:如何理解图片的傅里叶变换https://www.zhihu.com/question/29246532
高通滤波器:保留图像内容的边界;
带通滤波器:保留图片的某些边界;
低通滤波器:对图像进行模糊;
滤波=卷积=平均
卷积定理:时域上对两个信号的卷积等于频域上对两个信号的乘积,反之亦然(时域上的乘积对应频域上的卷积)。
选项1:
- 在时域上对图像进行卷积
选项2:
- 将图像和卷积核傅里叶变换至频域
- 将两者相乘
- 逆傅里叶变换至时域

卷积核
卷积核归一化,保证整张图像亮度不变。
Wider Filter Kernel = Lower Frequencies
更大的卷积核会保留更小的频率,会使得图片更模糊(例如从的卷积核换至的卷积核)
采样=重复频域上的内容
时域上的采样=冲激函数©与待采样(a)函数相乘

频域上的采样=冲激函数(d)与待采样函数(b)的卷积,结果是原信号的单移
(TODO:阅读虎书第9章)
走样=频谱单移距离小,频域内容产生混叠

反走样
选择1:增大采样率
并不总是可行
选择2:反走样
在单移之前让频谱内容更窄;

在采样之前进行滤波操作。
使用一定大小的低通滤波器,对三角形进行卷积。
反走样的思路
- 1x1滤波器(低通)

- 对于每一个像素内部进行卷积(例如,确定三角形内面积的占比)(近似“模糊”的过程)
- 对每个像素中心进行采样
实际操作:通过多重采样进行反走样(MSAA)
MSAA:Short for MultiSampling Anti-Aliasing
这是上述反走样思路的近似实现,并不能完全解决走样问题。
Approximate the effect of the 1-pixel box filter by sampling multiple locations within a pixel and averaging their values。
多重采样越密集,反走样效果越好。
MSAA解决了反走样过程中的“模糊”这一步,它没有通过提高分辨率而解决走样问题。
MSAA的代价:
增大了计算数倍量来达成了抗锯齿效果。
在工业界上,多重采样的像素点分布并不总是规则分布的,而是按照特定的图案分布、临近采样点复用等降低采样代价。
MSAA之外
现代图形学的抗锯齿方案里程碑:
- FXAA (Fast Approximate AA)
- TAA (Temporal AA)
超分辨率/超采样
与抗锯齿类似的概念,例如的图拉伸至的图片,而避免产生锯齿。超分辨率和抗锯齿都致力于解决采样不足的问题。
- DLSS(Deep Learning Super Sampling)
可见性和遮挡
画家算法
画家算法(Painter’s Algorithm):由远及近,进处的物体overwrite远处的内容,由远及近进行光栅化。难题:如何定义远近?
画家算法需要首先按照深度排序,复杂度for n objects。但也存在某些意外的情况,如下图三个互相重叠的三角形:
深度缓存/深度缓冲(Z-buffer)
想法:对于每个像素,储存深度(类似画家算法的远近),依次完成光栅化。
在生成用户看到的实际图像(frame buffer)的同时,也会生成一张深度图(也称深度缓存, depth buffer/z-buffer)
重要:为了简明性,我们假定所有z都是正值(之前规定摄像机朝向-Z方向),在这里越小的z表示离摄像机越近,越大越远。
Initialize depth buffer to
1 | for (each triangle T) |
复杂度:
如果每个三角形都覆盖常数个像素,则 for n个三角形。
由于所有的Z值都是浮点型,Z值相等的情况极为罕见。
在部分反走样算法中,不一定是对每一个像素点做Zbuffer,而是对每一个采样点做Zbuffer。
Zbuffer无法处理透明物体,需要特殊处理。
Lecture 7 Shading 1 (Illumination, Shading and Graphics Pipeline)
目前为止,已经学习了视图变换、投影、三角形光栅化等内容;下一步是确定每个像素的值,也就是着色。
着色
着色,即向不同物体应用不同材质的过程。不同的材质和光线有不同的相互作用。
Blinn-Phong反射模型
一种简单的着色模型。光源在同一个物体上一般会形成下面三种效果:
- 高光(镜面反射)
- 漫反射
- 间接光照
定义:

均为单位向量,且三个向量的起点均为shading point。着色是局部的,计算时仅计算着色点、光源和相机,不考虑其他物体。因此在着色过程中,不会产生阴影。shadingshadow
漫反射
光被均匀地反射到各个不同的方向。
物体收到的光线能量与表面法线与光线的夹角的余弦值正比。
点光源的能量耗散
假设点光源在单位距离的单位面积能量为,则距离r处的能量为。在辐射度量学一节中,将会解释为什么不考虑观察点与物体之间的距离引起的亮度衰减。
漫反射公式

由于是单位向量,因此点乘的结果即为余弦值。
某点处有颜色的原因:该处会吸收某些颜色的光,反射它不吸收颜色的光,因此会显示出某种颜色。
由于漫反射会均匀地发散至空间各处,因此无论从何处观察,漫反射的结果总是一致。漫反射的公式也因此与无关。
Lecture 8 Shading 2 (Shading, Pipeline and Texture Mapping)
镜面反射/高光
当观察方向和镜面反射方向(光源方向的镜面对称方向)比较接近时,会出现高光项。
Blinn-Phong模型:当观察方向和镜面反射方向相近时,法线方向和半程向量方向相近。
半程向量
类似地,有
为镜面反射系数,因为高光通常是白色的,所以高光通常是白色项。blinn-phong模型中忽略了项,也就是忽略掉了着色点在此处接收到的光照项,在更精确的模型中往往不能忽略这一项。
指数项增大两向量之间距离差距造成的衰减,使得更大的角度差距会造成这一项因子更小。在blinn-phong模型中,p的取值一般为100~200之间

环境光照
来自四面八方的光照,使得某个着色点即使没有被光源直接照亮,也有一定的亮度。
Blinn-phong模型中,假设各点处的环境光照都是相同的,并且与观测方向、法线方向也无关。
这是一个粗略的假设,之后需要全局光照进行更精确的计算。

着色频率
Flat shading
对于每个三角形求一个法线,然后三角形进行着色。
对于光滑的平面效果不佳。
逐三角形/逐面着色。
Gouraud shading
对于三角形每个顶点求法线。每个顶点着色,三角形内部着色通过插值得到。
逐顶点着色。
Phong shading
计算每一个顶点的法线,插值得到每一个像素的法线,然后对每一个像素进行着色。
与Blinn-Phong模型不同。
逐像素着色。
当模型足够复杂/面数足够多时,逐像素着色的工作量不一定最大,逐面着色效果也不一定差。(例如,面数大于像素数的情形。)
三角形顶点的法线
- 根据基础形状获取法线方向。例如,通过三角形面组成球面,则根据球面的法线方向求三角形顶点的法线方向。
- 通过三角形面法线方向推断顶点法线方向。例如顶点关联的三角形法线的平均(简单平均或加权平均)。
每个像素的法线
重心坐标插值。
图形管线/实时渲染管线

Shader程序
GLSL与C++的语法非常相似。
Shader程序允许用户自定义逐面/逐顶点/逐像素的着色方法。
现代图形学的发展
GPU可以高度并行地处理复杂的三角形和着色。
GPU是图形管线的硬件实,有一部分是可编程的,如顶点着色器和片段/像素着色器等。
GPU是高度并行化的多核处理器。
纹理映射(Texture Mapping)
定义任何一个点的基本属性(例如,漫反射系数等)
物体表面
任何三维物体的表面都是二维的。
纹理(Texture)上的每个点和实际物体上的每个点是一一对应的。
在实际的模型中,每个三角形都复制纹理上的一部分图像,对应一个纹理坐标,
三角形的每个顶点都对应一个(u,v),映射方法在本课程中不做展开讲述。
纹理映射并不必须是单射,也就是,同一个(u,v)可以被多个顶点复用。
tileable texture:纹理的上方和下方、左方和右方可以无缝衔接。
Lecture 9 Shading 3 (Texture Mapping cont.)
三角形内部的插值:重心坐标
应用于纹理坐标、颜色、法线方向等。
三角形所在平面上的任意一点(x, y),满足
由于三个系数线性相关,只要有两个系数就可以确定另一个。
如果,则这个点不在三角形平面内。
如果这三个系数都是非负的,那么这个点在三角形内(包含边界)。
重心坐标可以通过顶点“对面”的三角形面积占总面积的比值求出(上图)。
从这个定义,我们可以得出是三角形的重心。
同时,也可以用下面的公式求出重心坐标:
使用重心坐标插值
使用该公式对位置、纹理、坐标、深度等属性进行插值。
在投影变换下,不能保证重心坐标的不变。例如,先(三维空间的)插值后再做投影变换,可能会与先做投影变换再做(屏幕空间的)插值的结果不同。
待看:计算机图形学六:透视矫正插值和图形渲染管线总结 - 知乎 (zhihu.com)
因此,如果要做三维空间的插值,应该先做(三维空间的)插值,然后做投影变换,映射至屏幕空间。
应用纹理

问题:
纹理放大(Texture Magnification)
纹理上的像素——texel,纹理元素
纹理本身比较小, 而需要贴图的位置较大。简单的处理方法是,将计算得到的纹理坐标四舍五入至最近的纹理元素。此时多个像素会被映射至同一个纹理元素。
双线性插值

前文中的简单方法是,找最近的纹理元素,这会导致多个像素有相同的纹理。
双线性插值的做法是,找该点最近的四个元素,进行线性插值。

双线性插值仍不是当前质量最佳的插值法。
Bicubic 插值
取周围的16个点进行更多的插值。
更多的计算量,提高质量。
纹理缩小
当纹理过大时,会引起更大的走样问题。

原因:同样一个像素,对应纹理图上不同大小的范围。近处一个像素对应纹理图上较小的范围,而远处的一个像素会对应更大的纹理图范围。

此时不能单纯地用像素中心计算纹理坐标。
使用超采样可以解决走样问题,但是会引起较大的开销。
问题原因:在一个像素内,包含了多个纹理元素。也就是,像素(采样频率)大于纹理元素(信号频率)。
解决方案:避免采样,计算一个像素对应的纹理元素区域的平均值。
点查询问题和范围查询问题。
Mipmap:快速的近似正方形范围查询算法
生成多张纹理,使得每一张纹理都是前一级分辨率的一半。

在计算机视觉方面的Mip金字塔(Mip hierarchy)是相似的概念。
Mipmap只额外占用1/3的存储空间(级数求和)
计算结束Mipmap后,使用渲染点与其邻近两个像素,求其在纹理图上所占大小,映射至特定层的Mipmap:

右式:估算屏幕上一个像素对应纹理坐标系下的边长;(这只是估算方法之一,max是为简单起见的估计)
左式:计算使用第几层Mipmap;
如果D不是整数,例如D=1.8,则在上一层(D=1)和(D=2)层上分别进行插值,然后这两层之间再使用层数作为权重再进行一次插值。(三线性插值)
如此,做两次查询,通过三线性插值,就可以得出连续的纹理区域范围内的平均。
Mipmap:Overblur问题
Mipmap会造成Overblur。由于Mipmap只能查询正方形范围的平均,以及插值带来的平均,因此会导致overblur
各向异性过滤(Anisotropic Filtering)
由于Mipmap只能进行长宽的均匀压缩,只能适用于正方形范围。

由于采样范围并不总是正方形,Mipmap会扩大求平均值的范围,造成overblur。

Mipmap只能产生上图的对角线,各向异性过滤补全了上图的其他部分。
上图又被成为Ripmap。各向异性:在纵向和横向上的表现不同。2x各向异性过滤:在横向和纵向上产生2张压缩图像。当各向异性过滤级别足够高时,额外开销收敛至原来的2倍。各向异性过滤只对显存有影响,几乎不会影响计算性能。
各向异性过滤对于矩形的查询可以得到比Mipmap更好的结果,但是对于倾斜矩形的查询,仍然无法解决全部问题。
EWA过滤
将不规则的图形拆成多个圆形,进行多次查询。
纹理的应用
在现代GPU中,纹理=显存中的内容+允许范围查询(滤波)
环境光照/环境映射/环境贴图(Enviroment Map)
可以使用纹理描述环境光的样式,并渲染在物体上。环境光不止指太阳光,环境中的物体能被我们看到,是因为其反射了一定的光线,环境中的物体也是环境光的一部分。
Spherical Environment Map
将环境光保存在一个球体上。但是在展开时会出现扭曲问题,球面上纬度较高处占面积较小。
为了解决这个问题,使用Cube Map
Cube Map
将球上的环境光反向延长线至立方体对应的六个面上。
凹凸贴图/法线贴图
纹理不一定只能描述颜色,它可以定义不同位置不同的属性,例如可以定义物体不同部位沿法线方向向上向下凹凸的程度。在不把物体模型变复杂的前提下,可以通过应用一个复杂的纹理来使纹理变得更加精细。
在不同位置看到凹凸效果,是因为物体表面的高度影响了物体表面法线的位置,影响了阴影效果。
通过法线贴图,可以在不增大三角形面数的情况下增加表面的细节。
通过法线贴图,影响物体表面各处的法线位置。
使用差分求出法线贴图的切线,然后它逆时针旋转90°即为法线方向。

3D情况下:

需要注意的是,在上述两个例子中,法线方向都被默认为了(0,1)或(0,0,1),实际操作中要建立一个局部坐标系,使得法线方向是上述坐标,计算完毕后再映射回世界坐标系。
位移贴图
法线贴图的现代版本;凹凸贴图没有实际改变物体的几何形状,只是改变了法线方向;位移贴图则是直接改变各个三角形的位置。
凹凸贴图在边缘、模型本身具有大量阴影区域时效果不佳;
位移贴图需要模型具有足够多的三角形面数,三角形的频率要高于纹理贴图的频率。
DirectX的动态曲面细分:初始有较少的三角形面数,根据需要再产生更多的三角形面数。
三维噪声函数+三维纹理
定义一个噪声函数,动态地生成纹理,在空间的每一个点都对应一个纹理元素。例如Perlin Noise
保存预计算结果
例如,可以使用纹理保存环境光遮蔽的结果。
三维纹理和体积渲染
可以将体积渲染内容保存在模型里面,也可以保存在纹理里面。
Lecture 10 Geometry 1 (Introduction)
- 如何保存几何体
- 如何将几何体渲染至屏幕上
表示几何的方式
隐式(Implicit)几何表示
通过点的分类来表示几何。
-
点满足某些关系
e.g. 3D球面上的点满足. 更一般地,.
-
Constructive Solid Geometry(CSG)
e.g. 通过一系列简单几何的布尔运算定义新的几何体
-
距离函数
空间中的任何一个点到想要表现的几何形体的最小距离(正值表示在物体外部,负值表示在物体内部)。
-
水平集(Level Set Methods)
思想与距离函数一致。类比于地理上的等高线。
-
分形
递归地描述几何图形。由于分形的频率较高,可能会引起严重的走样问题。
隐式几何表示对于隐函数的采样(指遍历在表面上的点)可能是困难的,但是判断某个点与几何体的关系是容易的。
优点:
- 易于表述和存储
- 易于点与几何体的位置判断
- 易于光线和表面的求交
- 对于简单的形状,没有采样误差
缺点:
- 难以表述复杂的形状
显式(Explicit)几何表示
显示几何通过直接给出所有点或者参数映射(参数方程)的方法给出点的分布。
e.g.
通过遍历参数可以得到所有点。
-
点云
最简单的表示方式。理论上可以表示任何形状的几何,例如扫描的原始数据一般就是点云。通常转换为多边形面。
-
多边形面(Polygon Mesh)
常见的有四边形面和三角形面。几乎是图形学中应用最广泛的表示。多边形文件格式约定:
v:顶点坐标,vn:材质坐标,vn:法线方向。f:顶点编号/材质编号/法线编号,每一行为一个三角形面。这是一个立方体的定义,由于系统生成,其中存在一些冗余。
显式几何表述中,采样是容易的,但判断点与几何体的关系可能是困难的。
Lecture 11 Geometry 2 (Curves and Surfaces)
贝塞尔曲线Bézier Curves(显式表述)
用一系列的控制点定义曲线。

曲线起点过p_0,起点的切线方向沿p0p1,终点过p3,终点切线方向沿p2p3。这是一条贝塞尔曲线。系数为3是因为这是三阶贝塞尔曲线。
de Casteljau 算法
给出一定数量的控制点,画出贝塞尔曲线。
例如三个控制点可以画出一条二次贝塞尔曲线。
通过递归地插值得到n阶贝塞尔曲线的坐标。


伯恩斯坦多项式:

伯恩斯坦多项式系数之和为1(显然)
贝塞尔曲线的性质
(以三阶贝塞尔曲线为例)
-
规定了起点和终点;
-
规定了起点和终点的切线方向;
-
直接对控制点做仿射变换后绘制贝塞尔曲线,和对整个贝塞尔曲线做仿射变换,得到的结果是一致的;
-
只有仿射变换满足上述性质,对于投影变换等其他变换不符合上述性质;
-
凸包性质:贝塞尔曲线上的任何一个点都一定在控制点的凸包内。(例如,一阶贝塞尔曲线为两个控制点连线的线段)
凸包:平面上有一组点,向最外圈包围橡皮筋,最小的凸多边形即为凸包。
分段贝塞尔曲线 Piecewise Bézier Curves
原因:当贝塞尔曲线阶数较大时,贝塞尔曲线就不够直观。
通常使用Cubic贝塞尔曲线(三阶,四个控制点),将各个贝塞尔曲线相互连接,形成一条较大的贝塞尔曲线。
为了美观和易于控制,常常只连接第1-2个控制点、第3-4个控制点。

分段贝塞尔曲线的连续性


C1连续要求上一段终点两个控制点连线与下一段起点两个控制点连线共线且等长。
C2连续为曲率连续。在制造上有时会要求C2连续。
样条曲线(Spline)

B-样条曲线 (B-Splines)

贝塞尔曲线没有较好的局部性,一个限制点的移动会引起大范围的变化。而B-样条有较好的局部性。
-
We do not cover B-splines and NURBS
-
We also do not cover operations on curves (e.g. increasing/decreasing orders, etc.)
-
To learn more / deeper, you are welcome to refer to Prof. Shi-Min Hu’s course: https://www.bilibili.com/video/av66548502
曲面
贝塞尔曲面
与分段贝塞尔曲线一致,分段贝塞尔曲面使用4x4的限制点来定义一块曲面
在两个方向(u, v)上,分别定义贝塞尔曲线。一个方向上的贝塞尔曲线上四个点当作另一防线上贝塞尔曲线的四个控制点。通过参数u,v就可以定义出贝塞尔曲线的每一个点。
通过这种方法可以定义非常复杂的模型。
拼合分段贝塞尔曲面
保证贝塞尔曲线的连续性。
几何处理
- 网格细分(使用更多的面表示模型)
- 网格简化(在保证几何形状的情况下,使用更少的面表示几何体)
- 网格正规化(使三角形不会特别尖或长,使得所有三角形面的大小都差不多)
Lecture 12 Geometry 3
网格细分 Mesh Subdivision (Upsampling)
Loop Subdivision
提出者的姓氏是Loop,与“循环”没有关系。
只适用于三角形面。
把每个三角形分割为四个三角形(连接每个三角形三边中点);
根据权重调整各个三角形顶点的位置。
-
区分新增的顶点和原有的顶点,这两种顶点分别更新位置,使模型更加光滑。
Catmull-Clark Subdivision (General Mesh)
Loop细分只适用于三角形面细分,而Catmull-Clark细分适用于一般的网格(例如四边形和三角形混杂的情形)。
定义面上的非四边形面,定义面上度数不为4的点为奇异点。
细分步骤:
-
每个边上找出中点,找出每个面的重心点;
-
连接每个面上重心和面上每一条边的中点
在这一步上,原有的奇异点仍为奇异点,在非四边形面的重心的点成为新的奇异点,并且引入新的奇异点之后不再是非四边形面。
也就是,在一次Catmull-Clark细分操作之后,所有非四边形面都成为了奇异点,之后奇异点和非四边形面数不再发生变化。
-
更新顶点的位置
- 对于面中心的点、对于各边的中点、原有的顶点,应用不同的更新方式:
网格简化 Mesh Simplification (Downsampling)
如Mipmap一样,会有不同面数的层次结构,例如一个模型在近处有30000面,而在远处会有3000面。如何实现不同层次结构之间的平滑过渡仍是图形学界待解决的问题。
边坍缩 Edge Collapsing
通过将两个顶点“捏”在一起,实现面数的缩减。

二次误差度量 Quadric Error Metrics
用于计算一个顶点的“重要程度”,是被保留还是进行坍缩;坍缩后移动顶点的位置,使得坍缩后的图形轮廓与本来的轮廓区别不大。
二次误差度量思想:新的顶点应该最小化二次距离(L2 distance)的和。假设坍缩每一条边,并将新顶点置于最优的位置。
问题:在一条边坍缩之后,会引起其他边的变化。解决方案:取最小代价,然后更新其他顶点的值。使用优先队列/堆。

光栅化的阴影
Shadow Mapping
使用Shadow Mapping在光栅化中生成阴影。在图像空间中生成阴影,无须知道空间的几何信息,会产生走样现象。
核心思想:如果某个点不在阴影中,说明这个点必须同时被光源和摄像机看到。
经典的Shadow Mapping只能处理点光源或方向光源,有明显的阴影边界。这种阴影被称为硬阴影。处理步骤为:
- 从光源看向场景(假设有一个虚拟摄像机C),记录能看到的所有点的深度,获取深度图D(Shadow Map),不考虑着色;
- 从摄像机看向场景,对于任何一个点P,获取P在C下的深度(即光源与着色点的距离),并与D中记录的该点深度对比。若相同(由于存在浮点数误差、像素点和着色点的粒度差异等数值精度问题,实际操作中可能是判定距离是否大于深度图中的记录加上某一阈值等),说明在C中能看到点P,若不同,说明C中无法看到点P,即P之前有物体遮挡了光线。
Shadow Mapping成为当今几乎所有的3D游戏、早期电影中广泛应用的技术。
Shadow Mapping的问题
- 需要对整个场景进行两次光栅化,更大的性能开销;
- 只能做硬阴影(一个点要么完全被光源可见,要么完全不可见,会产生锐利的阴影边缘);
- 阴影质量取决于阴影图的分辨率;
- 涉及浮点数比较等数值误差。
软阴影
软阴影为物理上的半影,区别于本影(完全看不到光源)。
取决于物体有多大的范围能看到光源。
网格正规化 Mesh Regularization
课程中未涉及。
Lecture 13 Ray Tracing 1 (Whitted-Style Ray Tracing)
为什么要用光线追踪
-
光栅化无法很好地表现全局的效果:
- 软阴影
- Glossy Reflection (存在一部分反射,也有一定的模糊效果,类似毛玻璃)
- 间接光照
等光线弹射不止一次的情形。
-
光栅化是一种很快但质量相对较低的技术;
-
光线追踪是一种很准确,但很慢的技术。
- 光栅化应用于实时渲染
- 光线追踪更多地应用于离线渲染。
基础的光线追踪算法
光线追踪中对光线有以下的假设:
- 光线按照直线传播(在物理上并不准确,忽略了其波动性)
- 光线不会发生互相碰撞(在物理上并不准确)
- 光线从光源发出经过一定的反射等作用进入人的眼睛(光路是可逆的,从眼睛发出光线抵达光源也是有效的光线)
- 眼睛/摄像机是一个点
光线投射 Ray Casting
-
通过从摄像机向每个像素投射一条光线来生成一张图片;
沿着每根光线,记录光线与模型最近的交点。
-
通过将光线送向光源来检查是否存在阴影。
连接上一步中光线与模型的交点与光源,若中途无遮挡,则该点能被照亮。
-
进行着色
Whitted-Style 递归光线追踪
对光线弹射的每个点都进行着色,依照比例进行叠加,对image plane上的像素进行着色。
光线方程
光线r由起点o和方向d定义。
球面p定义:
求光线r和球面p的交点:
利用二次方程判别式,通过判断交点数量判断光线和球面的交点。
光线和隐式表面的求交
通常的隐式表面p:
使用数值计算的方法解出t的正实数根,即可求出交点。取每条光线最近的交点。
光线和显式表面的求交
朴素算法
通过光线和三角形的求交,也可以实现inside/outside test。在一个闭曲面内的点向外引射线,一定有奇数个交点。
三角形一定在某个平面内。因此将光线和三角形求交简化为
- 光线和平面求交
- 检测交点是否在三角形内
平面由一条法线N和一个点p’定义:
平面方程与光线方程联立,得
判定t是否
判定交点是否在三角形内
Möller Trumbore Algorithm
使用重心坐标的思想
使用Cramer法则求解线性方程组。
光线追踪的加速
朴素方法:
对于场景中所有三角形面,代入光线方程,取每条光线最近的交点。计算量巨大。
包围盒
使用一个简单的几何体包围物体,减少不必要的工作量。
AABB包围盒
三维中最常用的包围盒为长方体,它由三组不同的相对平面的交组成。
short for Axis-Aligned Bounding Box (轴对齐包围盒)
AABB包围盒一定是横平竖直的,任意一边都和坐标轴平行;
光线和包围盒求交
二维情况下:
光线只有进入三组对面后,才进入了包围盒;只要离开任何一组对面,就离开了包围盒。
为什么要轴对齐
简化运算过程:
Lecture 14 Ray Tracing 2 (Acceleration & Radiometry)
使用AABB加速光线追踪。
Uniform Spatial Partitions (Grids)
- 找到一个包围盒
- 创建grid
- 标记物体占据的格子(区分实心物体和空心物体,空心物体仅标记边缘所占据的格子)
如何判断光和哪一个格子有交点:光是朝右上方向传播,那么它下一步经过的格子只可能是右方或者上方或右上方的格子之一,求交点取最近即可(实际算法远比此复杂)。
格子的分辨率会影响加速效果。太稀疏达不到加速效果,太密则会在检测盒子是否相交时耗费较多性能。通常来说,格子数会划分为物体数的常数倍,在三维情形下这个常数常常被设置为27(经验公式)。
Uniform Grids在均匀分布的大规模物体时效果较好。
在物体分布不均匀时,例如“运动场中放了一个茶壶”时效果不佳。
空间划分 Spatial Partitions
解决了上述均匀划分的问题,在物体稀疏时使用更大的格子,在物体较密集时使用更小且密集的格子。
- Oct-Tree(八叉树,每个节点均匀沿每个轴二分,上述二维情况为四叉树;三维下为八叉)
- KD-Tree(每个节点只沿着轴向进行一次分裂,交替地进行水平划分和竖直划分,实际为二叉树)
- BSP-Tree(对空间进行二分,与KD树的区别在于不一定沿轴向分裂)
KD-Tree
定义
数据结构
对于任何一个内部节点,需要储存
- 沿哪个轴划分: x-, y-, 或z-轴;
- 划分位置:沿上一步轴向的哪个方向划分;
- 子节点:指向子节点的指针
- 内部节点不保存物体信息
对于任何一个叶子节点:
- 物体列表被保存在叶子节点之上。
使用KD-Tree 加速光线追踪
遍历KD-Tree,判断光线与某个盒子是否有交点,如果有交点则与该盒子的子节点判断是否相交。直到叶子节点,光线与叶子节点保存的物体进行相交判断。
KD-Tree的问题
-
KD-Tree建立进行子节点的划分时,需要判断物体是否与格子相交。这种判断是困难的;
-
一个物体可能存在于多个盒子内,如此一个物体可能出现在多个叶子节点中。
物体划分 Object Partitions
比起空间划分,业界更常使用物体划分。
Bounding Volume Hierarchy (BVH)
不进行空间的划分,而是对物体进行划分。
优势和问题
- 避免了空间划分的问题;
- 但也可能引起不同的盒的重叠。
划分策略
选一个维度进行划分
- 技巧1:总是沿着测度最大的维度进行划分,使划分后的单元大小平均;
- 技巧2:在居中的物体处进行划分,使二叉树更加平衡(按三角形重心取中位数,使用O(n)的快速选择算法)。
当节点中的元素数量低于指定值时停止划分。
数据结构
对于任何一个内部节点,需要储存:
- 包围盒的轮廓;
- 子节点:指向子节点的指针;
- 内部节点不保存物体信息
对于任何一个叶子节点:
- 物体列表被保存在叶子节点之上。
使用BVH加速光线追踪
辐射度量学 Basic Radiometry
Blinn-Phong模型存在大量的简化;
辐射度量学引入了物理上精确的光的作用。
辐射度量学引入了光的性质(空间上的性质,而非时间性质),例如Radiant flux, intensity, irradiance, radiance. 在辐射度量学中,仍然以几何光学的方法进行计算。
Radiant Energy and Flux (Power)
Definition: Radiant energy is the energy of electromagnetic radiation. It is measured in units of joules, and denoted by the symbol:
Definition: Radiant flux (Radiant power) is the energy emitted, reflected, transmitted or received, per unit time
光源所发出的光能是向所有方向辐射的,对于在单位时间里通过某一面积的光能,称为通过这一面积的辐射能通量。各色光的频率不同,眼睛对各色光的敏感度也有所不同,即使各色光的辐射能通量相等,在视觉上并不能产生相同的明亮程度,在各色光中,黄、绿色光能激起最大的明亮感觉。如果用绿色光作水准,令它的光通量等于辐射能通量,则对其它色光来说,激起明亮感觉的本领比绿色光为小,光通量也小于辐射能通量。
[Radiant] Intensity
Light emitted from a sourse
Definition: The radiant (luminous) intensity is the power per unit solid angle (立体角) emitted by a point light source.

为球面坐标系下的参数

说明并不是对球面的均匀的划分。
单位立体角/微分立体角
使用单位向量表示球面上的方向。
在均匀放出能量的点光源中,
Lecture 15 Ray Tracing 3 (Light Transport & Global Illumination)
辐射度量学 Cont.
Irradiance
Definition: The irradiance is the power per unit area incident on a surface point.

注意:只有与接收点垂直的能量才算入,不与接收面积垂直的需要做投影,加入项。
Radiance
Radiance is the fundamental field quantity that describes the distribution of light in an environment.
- Radiance is the quantity associated with a ray.
- Rendering is all about computing radiance
Definition: The radiance (luminance) is the power emitted, reflected, transmitted or received by a surface, per unit solid angle, per projected unit area.

Recall
-
Irradiance: power per projected unit area
-
Intensity: power per solid angle
So
-
Radiance: Irradiance per solid angle
-
Radiance: Intensity per projected unit area

Radiance 是在 Iradiance 上加上方向。
使用半球,是因为如果从下方入射,则不可能产生反射。
双向反射分布函数 Bidirectional Reflectance Distribution Function (BRDF)
反射的理解:光照射到物体表面,被物体吸收后重新发射出来。

BRDF定义了不同的材质。
反射方程 The Reflection Equation
对于给定的着色点和观测方向/出射方向,积分全空间的光线来源/入射方向(光线传播的线性性质),可以得到最终的渲染结果

其中
也就是,关于radiance的积分为该点处的irradiance,两种计算方式都可以得出正确的结果。
使用半球,是因为如果从下方入射,则不可能产生反射。
困难
出射的radiance可能作为自身入射的radiance,由此产生递归。

渲染方程/绘制方程 The Randering Equation
其中,指半球面。使用半球,是因为如果从下方入射,则不可能产生反射。
为材质自发光的系数。
假设上述的所有向量方向都朝外。例如,即使是,也使用沿物体表面指向光源的方向。
渲染方程:每个点辐射出的Radiance依赖于其他点辐射出的Radiance。
渲染方程是一个第二类Fredholm积分方程。
待看:算子法解微分方程和积分方程
下面部分暂时看不懂,待补充数学知识后补习。





零阶项为光源的光照;
一阶项表明,反射也是一种间接光照。
L/全局光照会收敛到某一个亮度。
概率论回顾
概率、期望、概率分布函数、连续变量的期望
Lecture 16 Ray Tracing 4 (Monte Carlo Path Tracing)
蒙特卡罗法解定积分
- 采样频率越高(N越大),误差越小
路径追踪
Whitted-style 光线追踪
- 总是在镜面反射/折射的物体上进行
- 在漫反射物体上停止反射
这些假设是不准确的,光只有镜面反射、漫反射两种类型,不存在glossy(例如磨砂金属)类型的反射、漫反射的物体之间的反射也被忽略了。
路径追踪
路径追踪=光线追踪+蒙特卡洛方法
渲染方程是正确的,但是不能正确地处理漫反射等情形。
蒙特卡洛方法解直接光照

引入全局光照
加入来自另一个物体的光照:



N=1解决了数量爆炸的问题,但是造成的结果噪声非常大。
对每个像素进行多次路径追踪,降低噪声。

问题:递归没有终止。
限定光的反射次数会产生问题:整体能量不守恒。
俄罗斯轮盘赌算法(RR)
引入俄罗斯轮盘赌算法(Russian Roulette, RR),以一定的概率P继续进行递归,返回值除以P,以1-p的概率返回0。通过这种方式,返回值的期望不变。
对光源进行采样
这样,就得到了一个正确的路径追踪算法。但是这个算法的效率并不很高。
因为光线要在一次路径追踪中击中光源,才能最终得到非零结果,因此光线中会存在大量未击中光源的光线,会造成效率的下降。如果采样率较低的话,这些光线中最终抵达光源的光线会变少,造成整体效果不佳。如果可以直接对光源区域进行采样,在采样率降低的情况下也能得到令人满意的效果。
因为蒙特卡洛方法的分布是可以自定义的,可以通过调整分布函数,使得光线都分布在光源的表面上。
蒙特卡洛要求采样区间和积分区间一致,因此如果想要对光源的面积A进行采样,就需要对渲染方程进行调整,由对半球面的立体角换元为
按照立体角定义,将转向与轴向垂直的方向,然后除以到半径距离的平方。
现在,将一个点的光照分为以下两部分:
- 直接来自光源的光照
- 来自其他物体的光照

路径追踪的点光源
非常难以处理,一般使用较小的面光源实现。
光线追踪:早期和现代概念
- 早期概念
- 光线追踪==Whitted-style ray tracing
- 现代概念
- 光线传播的整体概念,包括
- (Unidirectional & bidirectional) path tracing
- Photon mapping
- Metropolis light transport
- VCM / UPBP
其他概念
如何对一个函数进行采样
sampling
如何在半球、面积、或更一般的函数上进行采样
如何选择蒙特卡洛算法的最好的分布
重要性采样 importance sampling
产生质量足够好的随机数
low discrepancy sequences
将对半球进行采样和对光源进行采样结合起来
把不同的采样结果结合,是multiple importance sampling(MIP)
像素不同位置的radiance需要加权吗
Pixel reconstruction filter解决这个问题
Radiance 代表像素的颜色吗
No. 需要经过Gamma校正。还需要了解Curves, color space
Lecture 17 Materials and Appearances
材质描述了光线如何与物体发生作用。
即使是当下最高级的渲染器,也只能渲染出数十种材质。非物理的方法
材质==BRDF
漫反射系数
假设一个点接收的入射光是均匀的,并且不吸收光,那么根据能量守恒,这个点入射的radiance 和出射的radiance 是相等的。
由于漫反射,这个点的BRDF也是一个常数。因此,有
对半球上的的积分为
由于,可以得到
可以定义反射率albedo ,如此就有了漫反射系数
Glossy 材质
