GPU 渲染管线简单总结(网上资料总结)

2,091

本文是网上各个博客内容的总结

GPU渲染管线概述

绿色为可编程阶段、黄色为可配置阶段、蓝色为固定阶段

  1. 应用程序阶段
    CPU计算出 model 的顶点坐标、法向量、纹理坐标、纹理等数据,作为 GPU 渲染计算的输入
  2. 几何阶段
    负责顶点坐标变化、光照、裁剪、投影以及屏幕映射。该阶段输出经过变换和投影之后的顶点坐标、颜色以及纹理坐标。因为裁剪、投影和屏幕映射涉及到矩阵变换。故结合阶段的主要工作是==变换三维顶点坐标==以及==光照计算==
  3. 光栅化阶段 经过几何阶段的坐标变换后,得到每个点的屏幕坐标和需要绘制的图元(primitive GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP)。该阶段主要通过插值将顶点和图元对应到屏幕像素上(整数),以及为像素添加颜色

几何阶段

几何阶段主要作用是将三维场景转换到二维。在应用程序阶段,获取到的三维模型只提供了模型对象在模型坐标空间上的坐标。进入到几何阶段后,需要对三维模型的坐标进行多次转换,直到生成在二维屏幕上的坐标。
所谓空间转换,简单来讲是指顶点坐标向量乘以空间变换矩阵后得到的顶点坐标为转换后的空间中的坐标系上的坐标。比如对一个模型进行旋转平移变换。旋转平移的变换矩阵即为该模型的模型矩阵。用模型矩阵乘以该模型的顶点坐标,即对模型顶点坐标进行旋转和平移变换。运算后的顶点坐标就是在世界空间中的坐标,而顶点在自己模型空间中的坐标不变。

  1. 模型空间转世界空间
    每个三维模型都有自己的模型空间坐标系,模型在模型空间坐标系上的坐标就是模型的顶点值。模型空间坐标的存在有利于计算该模型的旋转、平移和缩放等操作。 场景中世界空间坐标系具有唯一原点,相对于其它坐标空间来说是固定不变的。三维模型通过世界空间坐标系得知自己的相对位置。
    上图中,黑色坐标系为世界空间坐标系,灰色为模型空间坐标系。假设该模型某顶点在模型空间坐标系下的坐标为列向量 A(x,y,z,1),在世界空间坐标系下的坐标为列向量 B(x1,y1,z1,1)。那么存在M * A = B其中 M 为 4x4 矩阵,称为模型矩阵。该变换称为模型-世界变换。
  2. 世界空间转视图空间
    视图空间:视图空间是由摄像机可视范围形成的一个空间。该空间的坐标系称为摄像机坐标系,原点为摄像机,摄像机镜头对准方向为负Z轴。摄像机右方和上方分别为摄像机坐标系的X轴和Y轴。
    上图为一个透视摄像机的摄像机坐标系示意图。视图空间由摄像机镜头方向、视角(fov)、近平面(near)以及远平面(far)构成。世界空间中的场景只有处于视图空间中的部分才会在屏幕上呈现出来。而视图空间的锥形结构使得三维物体在屏幕上呈现出透视效果。 而另一种正交摄像机的坐标系中,摄像机位于Z轴正方形无穷远处。故正交摄像机无法呈现透视效果。three.js 中移动摄像机实际上是移动摄像机坐标系,场景内物体的移动实际是物体在摄像机坐标系中的位置的变化导致的。
    世界-视图变换:默认情况下,视图坐标系原点即摄像机位于世界坐标系原点,并且坐标系方向与世界坐标系一致。故摄像机镜头初始朝向世界坐标系负Z轴,即垂直屏幕向内。与步骤一同理,世界坐标系中的坐标转换到摄像机坐标系需要乘以一个变换矩阵,即视图矩阵。
  3. 视图空间转齐次裁剪空间
    齐次裁剪空间:裁剪空间指通过摄像机可以被呈现在屏幕上的空间,由六个平面组成。顶点着色器必须要完成模型顶点从模型空间到齐次裁剪空间的转换。齐次裁剪坐标系为左手坐标系,原点位于正方体空间中心,空间各个坐标轴范围为[-1, 1]。齐次裁剪空间与投影类型(透视、正交)以及屏幕分辨率和长宽比独立。裁剪过程即将坐标不在[-1, 1]内的顶点去掉。
    上图表示视图空间到齐次裁剪空间的转换。视图空间中的 A,B 两点在齐次裁剪空间中的坐标分别为(-1, 1, -1)和(-1, 1, 1)。因为齐次裁剪坐标系为左手坐标系,那么Z值越大的顶点离摄像机也越远,故可以利用Z坐标表示顶点的深度
    转换过程:透视投影摄像机坐标系转裁剪空间坐标系的变换矩阵为
    根据上图矩阵先得到裁剪空间坐标系下的坐标:
    最后利用该列向量的 w 分量对 x,y,z 进行标准化,就得到顶点在齐次裁剪空间坐标系中的坐标。其中 w 分量值等于标准化前 z坐标的值,即顶点到摄像机的距离。故 w 越大,在标准化过程中 x、y、z 值就变得越小,即离摄像机越远的物体看上去越小,从而达到了透视的效果。
  4. 几何着色器 第一步到第三步为顶点着色器必须要实现的功能。几何着色器位于顶点着色器之后,为可选部分。几何着色器允许 GPU 高效地创建和销毁几何图元 primitive。
  5. primitive assembly 图元装配 图元装配指根据模型中顶点的原始连接关系还原出网格结构。网格由顶点和索引组成,根据索引将顶点连接在一起,组成线、面单元,然后再进行裁剪。OpenGL ES 支持点、线和面三种图元。
  6. 裁剪 可配置功能阶段,此阶段可以添加自定义的裁剪面
  7. 齐次裁剪空间转窗口空间 顶点在齐次裁剪空间坐标系中的 x、y 值乘以窗口的长高,即可得到顶点在窗口空间中的二维坐标,即顶点在屏幕上的位置。

光栅化阶段

该阶段主要是确定几何阶段输出的各个图元 primitive 所覆盖的像素以及每个像素的颜色

  1. 三角形设置 Triangle Setup
    几何阶段输出的都是三角形网格的顶点。三角形设置阶段需要计算光栅化一个三角网格所需要的信息,具体就是计算三角形边界的表示方式。
  2. 三角形遍历 Triangle Traversal 该阶段会检查每个像素是否被某个三角形覆盖。如果被覆盖的话,就会生成一个片元。三角形遍历阶段会根据上一阶段的计算结果来判断三角网格覆盖了哪些像素,并使用三角网格三个顶点的信息对覆盖区域的像素坐标进行插值
  3. 像素着色器|片元着色器
    像素着色器的输入为三角形遍历阶段得到的各个像素中顶点信息的插值结果。像素着色器中可以处理场景光照和与之相关的效果,以及纹理采样。顶点着色器会输出每个顶点对应的纹理坐标。在光栅化阶段三角形遍历中通过三角形三个顶点的插值运算可以得到三角形内各个像素的纹理坐标,从而可以在像素着色器中确定各个像素在纹理上对应的颜色。
  4. 合并阶段 The Merging Stage
    合并阶段是将像素着色器中生成的各个片段的深度和颜色与帧缓冲结合在一起的地方。

Reference

www.cnblogs.com/ojo-blogs/p…
zhuanlan.zhihu.com/p/26894962
www.sohu.com/a/128065154…