# Linear Algebra
点乘:\vec a{\cdot}\vec b=|\vec a||\vec b|\cos\theta
常用于求夹角,判断向量前后等
![[Pasted image 20240922013742.png]]
叉乘:\vec a{\times}\vec b=|\vec a||\vec b|\sin\theta{\hat n}=\vec c
\vec a\times\vec a=\vec 0
\vec a\times\vec b=-\vec b\times\vec a
\vec a\times(\vec b+\vec c)=\vec a\times\vec b+\vec a\times\vec c
![[Pasted image 20240921073852.png]]
图形学常用三维笛卡尔坐标系,记x、y、z轴的正方向的单位向量分别为$\vec i$、$\vec j$、$\vec k$ ,则有
\vec a=a_x\vec i+a_y\vec j+a_z\vec k
\vec b=b_x\vec i+b_y\vec j+b_z\vec k
$$
\begin{align}
\vec c&=\vec a\times\vec b \\
&=\begin{vmatrix}
\vec i & \vec j & \vec k \\
a_x & a_y & a_z \\
b_x & b_y & b_z
\end{vmatrix} \\
&=(a_yb_z-a_zb_y)\vec i+(a_zb_x-a_xb_z)\vec j+(a_xb_y-a_yb_x)\vec k
\end{align}
$$
常用于判断向量左右,点是否在三角形内,求法线等
![[Pasted image 20240922013713.png]]
3Dvector=(x, y, z, 0)^T
3Dpoint=(x,y,z,1)^T
homogenous coordinate齐次坐标: 在欧氏空间中,同一平面上的两条平行线不能相交,在投影空间中却不一样,此时就需要使用齐次坐标来代替原本的笛卡尔坐标$(x,y,z,w)$进行表示。想要把它变回笛卡尔坐标只需要除以$w$ 即可$(\frac{x}{w},\frac{y}{w},\frac{z}{w},1)$。
以下三个点在欧氏空间中表示同一个点。
![[Pasted image 20240922220232.png]]
矩阵具有结合律,不具有交换律,正交矩阵的逆是它的转置。
# Transformation
我们使用的模型,它的顶点数据多是相对于的model space定义的,需要对它进行一系列的变换使其到屏幕空间。
V^{\prime}=M_{viewport}M_{proj}M_{view}M_{model}V
## Model Transformation
model space -> world space
$$
M_{model}=T_{model}R_{model}S_{model}
$$
### Scale
$$
S(s_X,s_y,s_z)=
\begin{bmatrix}
s_x & 0 & 0 & 0 \\
0 & s_y & 0 & 0 \\
0 & 0 & s_z & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
$$
### Rotation
$$
R_x(\alpha)=
\begin{bmatrix}
1 & 0 & 0 & 0 \\
0 & \cos\alpha & -\sin\alpha & 0 \\
0 & \sin\alpha & \cos\alpha & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
$$
$$
R_y(\alpha)=
\begin{bmatrix}
\cos\alpha & 0 & \sin\alpha & 0 \\
0 & 1 & 0 & 0 \\
-\sin\alpha & 0 & \cos\alpha & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
$$
$$
R_z(\alpha)=
\begin{bmatrix}
\cos\alpha & -\sin\alpha & 0 & 0 \\
\sin\alpha & \cos\alpha & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
$$
R_{xyz}(\alpha,\beta,\gamma)=R_x(\alpha)R_y(\beta)R_z(\gamma)
罗德里格斯旋转公式(Rodrigues' Rotation Formula):
$$
R(\vec n,\alpha)=\cos(\alpha)\bf I+(1-\cos(\alpha)){\hat v}{\hat v}^T+\sin(\alpha)
\begin{pmatrix}
0 & -n_z & n_y \\
n_z & 0 & -n_x \\
-n_y & n_x & 0
\end{pmatrix}
$$
欧拉角:以上使用欧拉角来表示旋转角度
四元数:
### Translation
位移变换不是线性变换
$$
T(t_x,t_y,t_z)=
\begin{bmatrix}
1 & 0 & 0 & t_x \\
0 & 1 & 0 & t_y \\
0 & 0 & 1 & t_z \\
0 & 0 & 0 & 1
\end{bmatrix}
$$
## View Transformation
model space -> view space
$$
M_{view}=R_{view}T_{view}
$$
![[Pasted image 20240921140802.png]]
$$
T_{view}=
\begin{bmatrix}
1 & 0 & 0 & -x_e \\
0 & 1 & 0 & -y_e \\
0 & 0 & 1 & -z_e \\
0 & 0 & 0 & 1
\end{bmatrix}
$$
$$
R^{-1}_{view}=
\begin{bmatrix}
x_{\hat g\times\hat t} & x_t & x_{-g} & 0 \\
y_{\hat g\times\hat t} & y_t & y_{-g} & 0 \\
z_{\hat g\times\hat t} & z_t & z_{-g} & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
$$
$$
R_{view}=(R_{view}^{-1})^T
$$
## Projection Transformation
view space -> clip space
![[Pasted image 20240921141344.png]]
#### Orthographic Projection
$$
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
$$
M_{persp}=M_{ortho}M_{persp\rightarrow{ortho}}
$$
$$
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}
$$
### Clipping
cilp space -> NDC
将齐次坐标变为欧氏空间坐标
## Viewport Transformation
NDC -> screen space
$$
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}
$$
# Rasterization
图元Primitive: 之前的一系列顶点装配为指定的图形结构(线、三角形之类)
但我们直到屏幕上显示的像素,还需要将顶点变为像素,光栅化要做的就是把图元转为片段/片元(比pixel多携带了一些信息)
## 光栅化算法
### DDA数值微分算法
任何直线都可以用$y=kx+b$表示,可以通过斜率得知直线在那个轴上的变化比较快。
当$|k|<1$时,从起点开始画起,每次$x=x+1$,$y=\lfloor{y+k}\rfloor$,来得到屏幕坐标。
当$|k|>1$时,从起点开始画起,每次$y=y+1$,$x=\lfloor\frac{x+1}{k}\rfloor$,来得到屏幕坐标。
### 中点Bresenham算法
### 三角形光栅化算法
可以直接扫描整个屏幕或者三角形的AABB,判断每个像素是否在三角形内即可。
或者更省一些直接从三角形的左下角开始往右扫描,碰到不在三角形内的就换一行继续扫。
![[Pasted image 20240923032252.png]]
## 抗锯齿
上述光栅化工程可以看作对图元的采样,会不可避免的出现走样,此时可以使用一些反走样技术来进行缓解。
### SSAA
### MSAA
## 可见性/遮挡
### z-buffer
## 插值
重心坐标
# Shading
## 光照模型
### Lambert
### Phong
### Blin-Phong
## 光源类型
### ambient
###
## 着色频率
### Flat
### Gouraud
### Phong
# Texture
## 纹理映射
## 走样
### 插值
### Mipmap
### 应用
### SAT
# Geometry
## 表示
### 隐
### 显
## 曲线
## 曲面
### 细分
### 简化
# Material
# Pipeline