渲染管线
- 应用程序阶段:
把需要显示的几何信息输入到渲染管线。 - 几何阶段
顶点着色、投影变化、裁剪和屏幕映射。 - 光栅化阶段
三角面设置、三角形遍历。
向量
向量长度: ∥ v ⃗ ∥ = x 2 + y 2 + z 2 \lVert\vec{v}\rVert=\sqrt{x^2+y^2+z^2}∥v∥=x2+y2+z2
单位向量: n ^ = v ⃗ ∥ v ⃗ ∥ \hat{n}=\frac{\vec{v}}{\lVert\vec{v}\rVert}n^=∥v∥v
点乘: v ⃗ ⋅ k ⃗ = ∥ v ⃗ ∥ ⋅ ∥ k ⃗ ∥ ⋅ cos θ \vec{v}\cdot{\vec{k}}=\lVert\vec{v}\rVert\cdot\lVert\vec{k}\rVert\cdot\cos\thetav⋅k=∥v∥⋅∥k∥⋅cosθ
v ⃗ ⋅ k ⃗ = 1 ⋅ 1 ⋅ cos θ = cos θ , v 为 单 位 向 量 \vec{v}\cdot{\vec{k}}=1\cdot1\cdot\cos\theta=\cos\theta,v为单位向量v⋅k=1⋅1⋅cosθ=cosθ,v为单位向量
cos θ = v ⃗ ⋅ k ⃗ ∥ v ˉ ∥ ⋅ ∥ k ˉ ∥ \cos \theta=\frac{\vec{v} \cdot \vec{k}}{\|\bar{v}\| \cdot\|\bar{k}\|}cosθ=∥vˉ∥⋅∥kˉ∥v⋅k
矩阵
矩阵缩放:[ S 1 0 0 0 0 S 2 0 0 0 0 S 3 0 0 0 0 1 ] ⋅ ( x y z 1 ) = ( S 1 ⋅ x S 2 ⋅ y S 3 ⋅ z 1 ) \left[\begin{array}{cccc} S_{1} & 0 & 0 & 0 \\ 0 & S_{2} & 0 & 0 \\ 0 & 0 & S_{3} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] \cdot\left(\begin{array}{c} x \\ y \\ z \\ 1 \end{array}\right)=\left(\begin{array}{c} S_{1} \cdot x \\ S_{2} \cdot y \\ S_{3} \cdot z \\ 1 \end{array}\right)⎣⎢⎢⎡S10000S20000S300001⎦⎥⎥⎤⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞=⎝⎜⎜⎛S1⋅xS2⋅yS3⋅z1⎠⎟⎟⎞
矩阵位移:[ 1 0 0 T x 0 1 0 T y 0 0 1 T z 0 0 0 1 ] ⋅ ( x y z 1 ) = ( x + T x y + T y z + T z 1 ) \left[\begin{array}{cccc} 1 & 0 & 0 & T_{x} \\ 0 & 1 & 0 & T_{y} \\ 0 & 0 & 1 & T_{z} \\ 0 & 0 & 0 & 1 \end{array}\right] \cdot\left(\begin{array}{c} x \\ y \\ z \\ 1 \end{array}\right)=\left(\begin{array}{c} x+T_{x} \\ y+T_{y} \\ z+T_{z} \\ 1 \end{array}\right)⎣⎢⎢⎡100001000010TxTyTz1⎦⎥⎥⎤⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞=⎝⎜⎜⎛x+Txy+Tyz+Tz1⎠⎟⎟⎞
沿x xx轴旋转:[ 1 0 0 0 0 cos θ − sin θ 0 0 sin θ cos θ 0 0 0 0 1 ] ⋅ ( x y z 1 ) = ( x cos θ ⋅ y − sin θ ⋅ z sin θ ⋅ y + cos θ ⋅ z 1 ) \left[\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & \cos \theta & -\sin \theta & 0 \\ 0 & \sin \theta & \cos \theta & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] \cdot\left(\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right)=\left(\begin{array}{c} x \\ \cos \theta \cdot y-\sin \theta \cdot z \\ \sin \theta \cdot y+\cos \theta \cdot z \\ 1 \end{array}\right)⎣⎢⎢⎡10000cosθsinθ00−sinθcosθ00001⎦⎥⎥⎤⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞=⎝⎜⎜⎛xcosθ⋅y−sinθ⋅zsinθ⋅y+cosθ⋅z1⎠⎟⎟⎞
沿y yy旋转:[ cos θ 0 sin θ 0 0 1 0 0 − sin θ 0 cos θ 0 0 0 0 1 ] ⋅ ( x y z 1 ) = ( cos θ ⋅ x + sin θ ⋅ z y − sin θ ⋅ x + cos θ ⋅ z 1 ) \left[\begin{array}{cccc} \cos \theta & 0 & \sin \theta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin \theta & 0 & \cos \theta & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] \cdot\left(\begin{array}{c} x \\ y \\ z \\ 1 \end{array}\right)=\left(\begin{array}{c} \cos \theta \cdot x+\sin \theta \cdot z \\ y \\ -\sin \theta \cdot x+\cos \theta \cdot z \\ 1 \end{array}\right)⎣⎢⎢⎡cosθ0−sinθ00100sinθ0cosθ00001⎦⎥⎥⎤⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞=⎝⎜⎜⎛cosθ⋅x+sinθ⋅zy−sinθ⋅x+cosθ⋅z1⎠⎟⎟⎞
沿z zz旋转:[ cos θ − sin θ 0 0 sin θ cos θ 0 0 0 0 1 0 0 0 0 1 ] ⋅ ( x y z 1 ) = ( cos θ ⋅ x − sin θ ⋅ y sin θ ⋅ x + cos θ ⋅ y z 1 ) \left[\begin{array}{cccc} \cos \theta & -\sin \theta & 0 & 0 \\ \sin \theta & \cos \theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] \cdot\left(\begin{array}{c} x \\ y \\ z \\ 1 \end{array}\right)=\left(\begin{array}{c} \cos \theta \cdot x-\sin \theta \cdot y \\ \sin \theta \cdot x+\cos \theta \cdot y \\ z \\ 1 \end{array}\right)⎣⎢⎢⎡cosθsinθ00−sinθcosθ0000100001⎦⎥⎥⎤⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞=⎝⎜⎜⎛cosθ⋅x−sinθ⋅ysinθ⋅x+cosθ⋅yz1⎠⎟⎟⎞
坐标系统
- 局部空间(Local Space,或者称为物体空间(Object Space)):物体所在的坐标空间,即对象最开始所在的地方。
- 世界空间(World Space):顶点相对于(游戏)世界的坐标。
- 观察空间(View Space,或者称为视觉空间(Eye Space)):将世界空间坐标转化为用户视野前方的坐标。观察空间也就是从摄像机的视角所观察到的空间。
- 裁剪空间(Clip Space):将坐标变换为标准化设备坐标,而范围(-1.0, 1.0)之外的点会被裁剪掉(Clipped)。将所有可见的坐标都指定在-1.0到1.0的范围内不是很直观,所以我们会指定自己的坐标集(Coordinate Set)并将它变换回标准化设备坐标系。
- 屏幕空间(Screen Space)

变换矩阵:模型矩阵、观察矩阵和投影矩阵。
V clip = M projection ⋅ M view ⋅ M model ⋅ V local V_{\text {clip }}=M_{\text {projection }} \cdot M_{\text {view }} \cdot M_{\text {model }} \cdot V_{\text {local }}Vclip =Mprojection ⋅Mview ⋅Mmodel ⋅Vlocal