第二章 OpenGL图形管线
1. OpenGL是整合软硬件的多平台2D和3D图形API
OpenGL
- 软件层提供c的接口调用
- 硬件层提供一个多级图形管线,并提供GLSL语言编程
2. OpenGL程序概览
3. OpenGL图形管线
- 顶点着色器:对顶点进行操作,主要处理顶点的位置
- 曲面细分着色器:用以生成大量三角形(TCS/TES)
- 几何着色器:以图元(三角形/点/四边形)为单位,可操作图元中的多个顶点,主要用于生成额外图元的能力
- 光栅化: 将3D世界的点、三角形展现到2D平面的显示器上,转化为以像素为单位的阵列(插值处理)
- 片段着色器:用于处理光栅化后的像素,指定像素颜色
- 像素操作:处理隐藏面消隐(HSR/z-buffer)
第三章 数学基础
1. 3D坐标系
OpenGL使用右手系,DirectX使用左手系
2. 齐次坐标
- 点的表示(x,y,z,1)
- 向量(x,y,z,0)
3. 矩阵
-
矩阵分为行主序矩阵和列主序矩阵
-
OpenGL使用列主序矩阵,计算乘法执行从左往右
-
矩阵类型
-
单位矩阵
[ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} ⎣ ⎡1000010000100001⎦ ⎤ -
转置矩阵: 将矩阵的主对角线翻转,交换矩阵的行索引与列索引
[ A 00 A 01 A 02 A 03 A 10 A 11 A 12 A 13 A 20 A 21 A 22 A 23 A 30 A 31 A 32 A 33 ] = [ A 00 A 10 A 20 A 30 A 01 A 11 A 21 A 31 A 02 A 12 A 22 A 32 A 03 A 13 A 23 A 33 ] T \begin{bmatrix} A_{00} & A_{01} & A_{02} & A_{03} \\ A_{10} & A_{11} & A_{12} & A_{13} \\ A_{20} & A_{21} & A_{22} & A_{23} \\ A_{30} & A_{31} & A_{32} & A_{33} \end{bmatrix} = \begin{bmatrix} A_{00} & A_{10} & A_{20} & A_{30} \\ A_{01} & A_{11} & A_{21} & A_{31} \\ A_{02} & A_{12} & A_{22} & A_{32} \\ A_{03} & A_{13} & A_{23} & A_{33} \end{bmatrix} ^T ⎣ ⎡A00A10A20A30A01A11A21A31A02A12A22A32A03A13A23A33⎦ ⎤=⎣ ⎡A00A01A02A03A10A11A12A13A20A21A22A23A30A31A32A33⎦ ⎤T -
逆矩阵: A ∗ A − 1 = E A*A^{-1} = E A∗A−1=E 或 A B = B A = E AB=BA=E AB=BA=E
-
正交矩阵: A A T = E AA^T=E AAT=E,即: 转置等于其逆的矩阵 A T = A − 1 A^T = A^{-1} AT=A−1
-
-
矩阵运算
- 加法
[ A + a B + b C + c D + d E + e F + f G + g H + h I + i J + j K + k L + l M + m N + n O + o P + p ] = [ A B C D E F G H I J K L M N O P ] + [ a b c d e f g h i j k l m n o p ] \begin{bmatrix} A + a & B + b & C + c & D + d \\ E + e & F + f & G + g & H + h \\ I + i & J + j & K + k & L + l \\ M + m & N + n & O + o & P + p \end{bmatrix} = \begin{bmatrix} A & B & C & D \\ E & F & G & H \\ I & J & K & L \\ M & N & O & P \end{bmatrix} + \begin{bmatrix} a & b & c & d \\ e & f & g & h \\ i & j & k & l \\ m & n & o & p \end{bmatrix} ⎣ ⎡A+aE+eI+iM+mB+bF+fJ+jN+nC+cG+gK+kO+oD+dH+hL+lP+p⎦ ⎤=⎣ ⎡AEIMBFJNCGKODHLP⎦ ⎤+⎣ ⎡aeimbfjncgkodhlp⎦ ⎤
- 加法
-
乘法
[ A X B Y C Z D E X F Y G Z H I X J Y K Z L M X N Y O Z P ] = [ A B C D E F G H I J K L M N O P ] × ( X Y Z ) \begin{bmatrix} AX & BY & CZ & D \\ EX & FY & GZ & H \\ IX & JY & KZ & L \\ MX & NY & OZ & P \end{bmatrix} = \begin{bmatrix} A & B & C & D \\ E & F & G & H \\ I & J & K & L \\ M & N & O & P \end{bmatrix} \times \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} ⎣ ⎡AXEXIXMXBYFYJYNYCZGZKZOZDHLP⎦ ⎤=⎣ ⎡AEIMBFJNCGKODHLP⎦ ⎤×⎝ ⎛XYZ⎠ ⎞ -
平移矩阵
( X + T x Y + T y Z + T z 1 ) = [ 1 0 0 T x 0 1 0 T y 0 0 1 T z ] × ( X Y Z ) \begin{pmatrix} X + T_x \\ Y + T_y \\ Z + T_z \\ 1 \end{pmatrix} = \begin{bmatrix} 1 & 0 & 0 & T_x \\ 0 & 1 & 0 & T_y \\ 0 & 0 & 1 & T_z \\ \end{bmatrix} \times \begin{pmatrix} X \\ Y\\ Z \end{pmatrix} ⎝ ⎛X+TxY+TyZ+Tz1⎠ ⎞=⎣ ⎡100010001TxTyTz⎦ ⎤×⎝ ⎛XYZ⎠ ⎞- 缩放矩阵
[ X ∗ S x Y ∗ S y Z ∗ S z ] = [ S x 0 0 0 0 S y 0 0 0 0 S z 0 0 0 0 1 ] × [ X Y Z 1 ] \begin{bmatrix} X * S_x \\ Y * S_y \\ Z * S_z \end{bmatrix}= \begin{bmatrix} S_x & 0 & 0 & 0 \\ 0 & S_y & 0 & 0 \\ 0 & 0 & S_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} ⎣ ⎡X∗SxY∗SyZ∗Sz⎦ ⎤=⎣ ⎡Sx0000Sy0000Sz00001⎦ ⎤×⎣ ⎡XYZ1⎦ ⎤ - 右手系转左手系矩阵
[ 1 0 0 0 0 1 0 0 0 0 − 1 0 0 0 0 1 ] \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} ⎣ ⎡1000010000−100001⎦ ⎤
旋转矩阵的数值很是类似,个人总结了以下规律:
- 条件:
- 右手坐标系,列主序矩阵
- 旋转方向:从开始轴到目标轴
- 被旋转的轴所对应的矩阵分量值不变
- 起始轴向目标轴旋转,目标轴 s i n ( θ ) sin(\theta) sin(θ)值前加负号
- 左侧列总为: c o s ( θ ) , s i n ( θ ) cos(\theta),sin(\theta) cos(θ),sin(θ)组合
- 右侧列总为: s i n ( θ ) , c o s ( θ ) sin(\theta),cos(\theta) sin(θ),cos(θ)组合
- 缩放矩阵
-
投影矩阵
-
透视投影
-
正交投影
投影矩阵范围中,z方向的范围为[0,1](opengl投影矩阵z方向为[-1,1],可以参考opengl编程指南附录部分) -
LookAt矩阵
4. 向量运算
-
加减
A ± B = ( u ± x , v ± y , w ± z ) A\pm B = (u \pm x, v \pm y, w \pm z ) A±B=(u±x,v±y,w±z) -
点积
A ⋅ B = ( u x + v y + w z ) A \cdot B = (ux + vy + wz) A⋅B=(ux+vy+wz) -
叉积
A × B = ( v z − w y , w x − u z , u y − v x ) A \times B = (vz- wy, wx - uz, uy - vx) A×B=(vz−wy,wx−uz,uy−vx)
-