《计算机图形学编程(使用OpenGL和C++)》笔记(2)-图形管线和矩阵变换

第二章 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 AA1=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=A1

  • 矩阵运算

    • 加法
      [ 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} XSxYSyZSz = 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} 1000010000100001
      在这里插入图片描述

    旋转矩阵的数值很是类似,个人总结了以下规律:

    • 条件:
      • 右手坐标系,列主序矩阵
      • 旋转方向:从开始轴到目标轴
    • 被旋转的轴所对应的矩阵分量值不变
    • 起始轴向目标轴旋转,目标轴 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) AB=(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=(vzwy,wxuz,uyvx)

关注公众号

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值