GAMES101-现代计算机图形学入门

Homogeneous coordinates

齐次坐标就是用N+1维来代表N维坐标

3D Rotations

standard coordinate system is the right-handed coordinate system

Rotation around x

Rx(α)=[10000cosαsinα00sinαcosα00001]\pmb{R}x(α)= \begin{bmatrix} 1&0&0&0\\ 0&cosα&-sinα&0\\ 0&sinα&cosα&0\\ 0&0&0&1 \end{bmatrix}

Rotation around y

Ry(α)=[cosα0sinα00100sinα0cosα00001]\pmb{R}y(α)=\begin{bmatrix} cosα&0&sinα&0\\ 0&1&0&0\\ -sinα&0&cosα&0\\ 0&0&0&1 \end{bmatrix}

Rotation around z

Rz(α)=[cosαsinα00sinαcosα0000100001]\pmb{R}z(α)=\begin{bmatrix} cosα&-sinα&0&0\\ sinα&cosα&0&0\\ 0&0&1&0\\ 0&0&0&1 \end{bmatrix}

any 3D Rotation

Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)\pmb{R}xyz(α,β,γ)=\pmb{R}x(α)\pmb{R}y(β)\pmb{R}z(γ)

Rodrigues’Rotation Formula

Rotation by angle α around axis n (n经过原点)

R(n,α)=cos(α)I+(1cos(α))nnT+sin(α)[0nznynz0nxnynx0]\pmb{R}(\pmb{n},α)=cos(α)\pmb{I}+(1-cos(α))\pmb{n}\pmb{n}^T+sin(α)\begin{bmatrix} 0&&-n_z&&n_y\\ n_z&&0&&-n_x\\ -n_y&&n_x&&0 \end{bmatrix}

View/Camera Transformation

通过将相机移动到规定位置,物体则相应变换。相机摆放在原点,指向-z方向,向上为+y方向。

旋转矩阵是正交矩阵。

Orthographic projection(正交投影)

通俗的讲正交投影不会出现近大远小的现象。

将(x)左右端点[l,r],(y)上下端点[b,t],(z)前后端点[f,n] 经过平移缩放成为[-1,-1]^3^的立方体

注意远近关系由坐标系原因朝向-z轴看,所以实际上越远的值越小。(看具体实现,如OpenGL采用左手坐标系避免这一现象)

Mortho=[2rl00002tb00002nf00001][100r+l2010t+b2001n+f20001]M_{ortho}= \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0\\ 0&\frac{2}{t-b}&0&0\\ 0&0&\frac{2}{n-f}&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} 1&0&0&-\frac{r+l}{2}\\ 0&1&0&-\frac{t+b}{2}\\ 0&0&1&-\frac{n+f}{2}\\ 0&0&0&1 \end{bmatrix}

Perspective Projection(透视投影)

远近平面,将远平面“挤压”至与近平面同一高度上,再通过正交投影投射到近平面上

远近平面中间的平面z会往远端靠近

Mpersportho=[n0000n0000n+fnf0010]M_{persp\rightarrow ortho}= \begin{bmatrix} n&0&0&0\\0&n&0&0\\0&0&n+f&-nf\\0&0&1&0 \end{bmatrix}

Mpersp=MorthoMpersporthoM_{persp}=M_{ortho}M_{persp\rightarrow ortho}

上述转换过程综合为MVP
M:Model transformation (placing objects)
V: View transformation (placing camera)
P: Projection transformation(Orthographic projection and Perspective projection)

Rasterization(光栅化)

屏幕长宽比Aspect ratio= width / height

垂直可视角度Vertical Field of View

用于定义透视投影视锥的两个要素

tan(fovV2)=tnaspect=rttan(\frac{fovV}{2})=\frac{t}{|n|} \\aspect=\frac{r}{t}

对于屏幕,图形学中抽象的认为一个二维数组,数组的每一个元素都是一个像素

屏幕的大小我们称为分辨率,表示像素的多少

屏幕是一个典型的光栅成像设备

Raster:screen in German

Rasterize:drawing onto the screen

Pixel’s color is a mixture of (red,green,blue)

此篇按GAMS101规定,假定任一像素坐标为(x,y),宽高为1,其中心点为(x+0.5,y+0.5),像素坐标范围由(0,0) to (width-1, height-1),像素覆盖范围为(0,0) to (width, height)

Canonical Cube to Screen
先忽略z,将x,y从[-1,1]^2^ to [0,width]*[0,height]
变换矩阵:
除了宽高变为width和height,然后将原点(0,0)移到屏幕中心点(width/2, height/2)

Mviewport=[width200width20height20height200100001]M_{viewport}=\begin{bmatrix}\frac{width}{2}&0&0&\frac{width}{2}\\0&\frac{height}{2}&0&\frac{height}{2}\\0&0&1&0\\0&0&0&1\end{bmatrix}

显示器显示的图像其实是存储在显存中

三角形是最基本的多边形,所有多边形都能由三角形组成
三角形一定在一个平面,且在三角形内外定义明确
三角形内部插值?

最简单的光栅化做法:采样(Sampling)
Evaluating a function at a point
output[x] = f(x)

如采样三角形,给定函数inside,若坐标在三角形内,则函数值为1,否则为0

如何判断点是否在三角形内:

基本:对于点Q和向量P1P2,可以通过向量叉乘判断点Q在P1P2的哪一侧,按某一固定方向判断点Q是否在向量的哪一侧,如果都在同侧即在三角形内。如果点落在边界上,要么不做处理,要么特殊处理。

轴向包围盒:水平垂直包围三角形,即不需要让屏幕上所有点都做函数判断(优化)

采样引发的问题:锯齿(Jaggies)/ Aliasing(走样)

反走样AntiAliasing

采样不仅可以发生在不同位置,还可以发生在不同时间,即动画就是一种在时间上的采样

Artifacts(图形学中的术语,理解成error)
Artifacts due to sampling - “Aliasing”:

  1. Jaggies,sampling in space
  2. Moire,摩尔纹, undersampling images
  3. Wagon wheel effect- sampling in time

本质是信号(函数)变化太快,而采样速度跟不上信号变化的速度

Antialiasing
Pre-Filter/Blur(滤波/模糊) before sampling

那么能够采样之后再滤波以反走样吗?这是不行的,甚至也是一种错误,叫做Blurred Aliasing

傅里叶级数展开:任何周期函数都可以写成正余弦函数组合和一个常数项
傅里叶变换:将空间域的函数变换至频域上

走样的分析:对于一个函数,本身有其频率;采样本身也有采样的频率

走样定义:两种频率的函数在一种采样频率下得出的结果无法区分(即这两个函数采样结果相同)

滤波:频率的角度上,即把特定的频段去掉。

傅里叶变换将图像从空间域变换到频域

频域图上,经过移中处理,最后低频部分居中,越往外越高频。而到底有多少信息在频率上,就通过亮度来表示。
而频域图上会出现水平和竖直的两条线。这个原因是,因为对图像作傅里叶变换转换到频域上,对其进行周期性的分析。相当于将图像在水平方向上重复了很多张,竖直方向上也重复了很多张,而图像的左右边界和上下边界一般并不相同,或者极其不同,那么在这过程中相当于产生剧烈的信号变化,极其高的高频?

高频部分,我们认为其蕴含的信息是图像的边界。原因在于,所谓边界,自然就是两边有剧烈信号(像素)变化的情况,自然和高频对应。

时域卷积等于频域乘积,相反时域乘积等于频域卷积

采样:可以看作是在重复原始信号的频谱
走样:在频域上相当于重复原始信号频谱时,频谱图中存在重叠混合。

如何解决走样:增大采样率

反走样:先做模糊、再做采样,通过频率分析可知,先做低通滤波,拿掉了高频信息。

MSAA:认为一个像素实际被划分为很多个小像素,再判断这些点是否在三角形内,取平均,得到三角形对大像素的近似覆盖率。这并不是靠增加分辨率(增加采样点)来解决走样,增加的采样点只是为了近似覆盖率,并没有真正增加分辨率。
FXAA:快速近似抗锯齿,找到边界,对图像后期处理
TAA:通过上一帧的感知的像素结果,应用至当前

超分辨率和抗锯齿

Shading 着色

可见性问题:
即场景中有很多物体,该如何编排绘制物体的顺序,一般都是先画远的,再画近的,通过将近覆盖远的,实现所谓的遮挡。(所提及的画家算法思想则直接就是新画的东西会对旧的东西造成覆盖)

所有物体先按深度(深度的测度)排序,再从远到近绘制
但仍然会存在互相遮挡的情况(即无法通过深度排序),画家算法失效

解决方法:Z-buffering(深度缓存)
维护一个Frame buffer和Depth buffer
物体(三角形)不一定好排序,但是每个像素的最浅深度

伪代码:
即一开始深度缓存中记录的距离都是无限远的,然后遍历每一个三角形,每个三角形都遍历其所有像素,如果该三角形像素的深度比深度缓存中要小(比之前记录的更近),把深度缓存更新为该三角形像素的深度。

但对于透明物体的话,就需要进行特殊处理

着色绘画中就是体现物体明暗颜色变化。
着色:对不同的物体应用不同的材质的过程(101,暗含不同材质对光线的相互作用也不同)

简单着色模型:
Blinn-Phong Reflectance Model: