计算机图形学简介

  1. 计算机图形学:是研究计算机中对图形表示,计算,渲染过程的科学。主要研究内容如下:
    1. 图形建模:研究如何制作建模软件算法等
    2. 图形渲染:图像渲染本质上就是CPU端的程序控制GPU行为的过程,控制过程包括数据传输与指令发送(发送渲染指令)。通过图形渲染算法,将模型呈现为真实,虚拟,风格化等各种渲染结果,进行呈现。
    3. 动画:研究如何制作动画
    4. 模拟仿真:通过物理/几何等算法,模拟物理世界物体之间/物体与环境的真实效果
  2. 图形渲染方法:
    1. 硬件渲染:通过GPU提供的功能接口,比如说OpenGL,Vulkan,DirectX等,利用GPU硬件进行加速渲染
    2. 软件渲染:根据一个画点的功能,自己编写渲染算法,最终在屏幕上呈现三维模型的效果

向量

  1. 向量具有大小和方向
  2. 向量的长度:记作a向量(x,y,z),则其长度为sqrt(x^2 + y^2 + z^2);
  3. 单位向量:长度为1的向量,向量除以向量的长度即为单位向量
2.向量点乘
  1. 向量的点乘也叫做内积,其结果是一个标量。
    1. 以两个二维向量为例,其内积结果为两个向量对应xy两两相乘的结果,即x1*x2+y1*y2
    2. 用向量的长度和两者的夹角来表示:a向量的长度 * b向量的长度 * cosx,其中x为两者的夹角
  2. 向量点乘的应用案例:
    1. 计算a向量在b向量上的投影向量
      image
2.向量叉乘

注意点乘和叉乘的区别:向量点乘通常用于计算两个向量的夹角,而向量叉乘用于计算两个向量的法向量

  1. 二维:(xa,ya)* (xb,yb) = xa*yb - ya*xb,结果是一个标量

  2. 三维:结果是一个向量
    image

    1. 几何意义:
      1. 产生一个与两个原向量所构成平面垂直的法向量,方向满足右手定则(假设a向量与b向量做叉乘,则四指由a向量握向b向量,大拇指的方向即为法向量的方向)。
        image
      2. 产生向量的模等于两者模的乘积与夹角正弦值的乘积,即||a * b|| = ||a|| * ||b|| * abs(sin)
  3. 应用:

    1. 求三角形的面积:s = ||a * b|| / 2
      image
    2. 判断点是否在三角形内部:根据右手定则,右手四指从a向量开始,移动到b向量,大拇指的指向就是a叉乘b的方向
      image
    3. 已知任意两个基向量可以求出另外一个基向量。比如说已知x轴,y轴,则z轴等于x叉乘y(右手坐标系为例子)

直线绘制算法

给定两个点,绘制连接这两个点的直线。

最简单的方案
  1. 每次x在变化时,y值根据直线方程y = (int)k * x + b求出,然后绘制该点。这个简单方案的缺点是每次点的绘制都有一次k*x的浮点数乘法操作和+b的浮点数加法操作,效率较低。
Brensenham直线
  1. Brensenham直线绘制算法核心思想:假设当前点已经通过(xi,yi),当x方向前步进+1时,判断下一个点的纵坐标保持不变还是加一。
  2. 具体判定规则:计算D0和D1,再计算差值
    image
    image
  3. 优点:只使用了整型值数据进行运算与决策,省略了浮点数运算操作,提高了绘制效率。

三角形绘制算法

  1. 问题描述:给出屏幕像素上三个点(v0,v1,v2),计算并返回构成三角形所包围的像素集合
  2. 算法思想:
    1. 寻找本三角形的最小包围盒
    2. 遍历包围盒内的像素,使用叉乘判断是否在三角形内
    3. 三角形内所有像素组成集合返回

颜色混合

  1. 颜色混合:在绘制透明或者半透明物体时,需要将当前物体生成的像素与画布已有的像素进行计算(两种不同的颜色是可以按照比例进行混合的),得到新的像素颜色值的过程
  2. 颜色混合依赖透明度值,透明度决定了一个像素的可见性,0表示完全透明,意味着该像素完全不可见;1表示完全不透明,意味着像素完全可见,没有任何透明效果。

插值算法

1.直线的线性插值算法

image

2.双线性插值算法
  1. 描述
  2. 计算方法:

3.重心插值算法
  1. 根据三角形三个顶点的颜色计算三角形内任意一点的颜色值
    image

空间变换

1.二维变换
  1. 在图形学中,通常引入齐次坐标(即引入第三维坐标,通常为1)来统一表示平移,旋转,缩放等变换。
    1. 齐次坐标系下的缩放矩阵表示为:对一个二维坐标进行左乘缩放矩阵,就可以完成缩放操作。其中sx为x轴方向的缩放因子,sy为y轴方向的缩放因子
    sx 0 0
    0 sy 0
    0 0 1
    
    1. 齐次坐标系下的平移矩阵表示为:其中tx为x轴方向上的平移,ty为y轴方向上的平移
    1 0 tx
    0 1 ty
    0 0 1
    
    1. 齐次坐标系下的旋转矩阵表示为:以(0,0)为原点进行逆时针旋转,a为角度
    cosa -sina 0
    sina cosna 0
    0    0     1
    
    1. 齐次坐标系下表示缩放平移的矩阵表示如下所示,同理可以表示出旋转平移矩阵。
    sx 0 tx
    0 sy ty
    0 0  1
    
2.三维变换
  1. 三维坐标系:包含左手坐标系和右手坐标系。例如在OpenGL中采用右手坐标系
    image
  2. 三维的缩放和平移操作与二维雷同,只是增加了维度
    1. 齐次坐标系下缩放矩阵如下所示:
    sx 0 0 0
    0 sy 0 0
    0 0 sz 0
    0 0 0  1
    
    1. 齐次坐标系下平移矩阵如下所示:
    1 0 0 tx
    0 1 0 ty
    0 0 1 tz
    0 0 0 1
    
  3. 三维世界的旋转:围绕一个基向量以逆时针旋转(x,y,z轴称之为基向量),这种情况下,其中一个轴不变,可以看成二维情况下的旋转
    1. 围绕基向量z轴旋转,a为角度,旋转矩阵如下所示:
    cosa -sina 0 0
    sina cosa  0 0
    0     0    1 0
    0     0    0 1
    
    1. 围绕基向量x轴进行旋转,旋转矩阵如下所示:
    1  0     0    0
    0 cosa -sina  0
    0 sina  cosa  0
    0  0     0    1
    
    1. 围绕基向量y轴进行旋转,旋转矩阵如下所示:
    cosa  0 sina 0
    0     1  0   0
    -sina 0 cosa 0
    0     0  0   1
    
  4. 三维世界的旋转:绕任意轴逆时针旋转。一个点的坐标可以理解为对三个基向量的权重比例。(三个基向量分别为(1,0,0),(0,1,0),(0, 0, 1))
    1. 旋转变换矩阵,内部的三个列向量就是新坐标系R的三个基向量,按序对应于新的XYZ轴。对于旋转后的P点在原坐标系下的坐标计算可以根据旋转矩阵所得:
      image
      image
    2. 旋转变换矩阵如下所示:
      image

本地坐标系和世界坐标系

  1. 世界坐标系:用来表示整个世界的东西南北上下
  2. 本地坐标系:是固定在物体中心点上的坐标系,用来表示物体前后左右上下

摄像机

  1. 渲染技术中,如果坐标系已经确定以及物体位置确定,此时需要确定一台摄像机,描述观察者的身份。
  2. 摄像机相关参数:
    1. 在世界坐标系中的位置
    2. 摄像机看向的方向
    3. 摄像机穹顶方向:定义摄像机"头顶"指向哪个方向。这个参数用于解决方向歧义,比如说将摄像机比喻成人,当正立时,穹顶方向为y轴,倒立时为y轴负方向
  3. 摄像机的初始状态:
    1. 摄像机位置在世界坐标系的原点
    2. 摄像机看向的方向为z轴负方向
    3. 摄像机的穹顶方向为y轴方向
  4. 摄像机的变化状态:经过旋转平移,摄像机位置发生变化。此时需要将物体的顶点坐标由世界坐标系转化到摄像机坐标系中
    image
  5. 视图变换矩阵(将顶点坐标从世界坐标系转换到摄像机坐标系的矩阵):先求得摄像机得变换矩阵,再求其逆矩阵即为视图变换矩阵。注:下图中p为摄像机的当前位置,f为摄像机的朝向,u为头顶向量,其值为r向量和f向量的叉乘,r向量为穹顶向量t和f的叉乘,再求归一化(normalize(f,t))。r,u,-f本质上即为摄像机坐标系下的xyz轴
    image
    image

投影

1.正交投影(Orthographic Projection)
  1. 向幕布进行投影,称之为正交投影,他能更直观得表现出物体在某投影平面的位置关系
  2. 正交投影盒空间:定义一个立方体,只有在立方体内的物体才会可视。即在视图变换的结果中,选择一块区域进行渲染显示
    image
  3. 正交投影矩阵如下所示:其作用是将摄像机空间中的点转化为屏幕上对应的NDC坐标(NDC坐标系为左手坐标系
    image
2.透视投影(Perspective Projection)
  1. 透视投影:向摄像机镜头点进行汇聚投影。透视投影变换最终目的是将视锥内部的物体压缩到一个xyz为-1~1之间的盒体内,即物体坐标转化为NDC坐标,从而与正交投影统一后续计算。
    image
  2. 透视投影和正交投影的区别:透视投影近大远小,正交投影没有远近感
    image
  3. 透视投影定义数据:
    1. 可视范围:near, far。两者都表示距离,为正数
    2. 近平面范围:left,right,top,bottom。left为近平面上最小的x值,有正有负,其余变量的含义同理
      image
  4. 透视投影矩阵如下:将摄像机系下的坐标变换到剪裁空间的坐标,其剪裁空间下的坐标的xyz分量值都乘以了一个-z,-z为原摄像机坐标系下坐标的z分量值
    1. 剪裁空间坐标如下
      image
    2. 使用第三点的定义数据:
      image
    3. 参数代换:已知近锥体参数近平面n,远平面f;y方向视张角fovy,近平面横纵百分比aspect
      image
      image

矩阵的变换流程

图形学中涉及到的矩阵变换如下所示:

  1. 物体经过旋转平移缩放等模型变换矩阵得到了每个顶点的世界坐标位置。
  2. 使用视图变换矩阵将顶点坐标从世界坐标系转化到摄像机坐标系
  3. 使用正交投影变换矩阵或者透视投影变换矩阵将顶点坐标从摄像机坐标系转到剪裁空间坐标系。
  4. 顶点的剪裁空间坐标会经过透视除法,变换到NDC坐标系。最终的NDC坐标会传入后续的管线阶段