Section01 渲染流水线

最后更新于 2022-11-05 501 次阅读


渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所
有效果。它的输入是一个虚拟摄像机 些光源、一些 had 以及纹理等

什么是渲染流水线

使用流水线的好处在于可以提高单位时间的生产量

渲染流水线的工作任务在千由一个三维场景出发、 生成(或者说渲染) 一张二维图像。 换句话说, 计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可以看到的图像。而这个工作通常是由CPU和GPU共同完成的。

一个渲染流程分成3个阶段: 应用阶段(Application Stage)、 几何阶段(Geometry Stage)、 光栅化阶段(Rasterizer Stage)。

应用阶段

开发者具有这个阶段的绝对控制权。在这一阶段中, 开发者有3个主要任务:

  • 首先, 我们需要准备好场景数据, 例如摄像机的位置、 视锥体、 场景中包含了哪些模型、 使用了哪些光源等等;
  • 其次, 为了提高渲染性能, 我们往往需要做一个粗粒度剔除(culling)工作, 以把那些不可见的物体剔除出去, 这样就不需要再移交给几何阶段进行处理;
  • 最后, 我们需要设置好每个模型的渲染状态。

这一阶段最重要的输出是渲染所需的几何信息, 即渲染图元(rendering primitives)。

几何阶段

几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们,在哪里绘制它们。这一阶段通常在 GPU 上进行几何阶段负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。

光栅化阶段

这个阶段也是在 GPU 上运行 。光栅化的任务主要是决定每个渲染图元中 的哪些像素应该被绘制在屏幕上。它需要对上一个阶段得到 的逐顶点数据 (例如纹理坐标 、顶点颜色等)进行插值,然后再进行逐像素处理。

CPU与GPU的通信

渲染流水线的起点是 CPU, 即应用阶段。应用阶段大致可分为下面 3个阶段

  1. 把数据加载到显存中。
  2. 设置渲染状态。
  3. 调用 raw Call

GPU流水线

性绿色表示该流水线阶段是完全可编程控制
的,黄色表示该流水线阶段可以配置但不是可编程的,蓝色表示该流水线阶段是由 GPU 固定实现的,开发者没有任何控制
权。实线表示该 Shader 必须由开发者编程实现,虚线表示该 Shader 是可选的
  • 顶点着色器 (Vertex Shader) 是完全可编程的,它通常用于实现顶点的空间变换 顶点着色等功能。
  • 面细分着色器 (Tessellation Shader) 是一个可选的着色器,它用于细分图元。
  • 几何着色器 (Geometry Shader) 同样是一个可选的着色器,它可以被用于执行逐图元 Per-Pr itive的着色操作,或者被用于产生更多的图元。
  • 下一个流水线阶段是裁剪 (Clipping), 这一阶段的目的是将那些不在摄像机视野内的顶点裁剪掉,并剔除某些 角图元的面片。
  • 几何概念阶段的最后一个流水线阶段是屏幕映射 (Screen Mapping) 。这 阶段是不可配置和编程的,它负责把每个胆元的坐标转换到屏幕坐标系中。

顶点着色器

是流水线的第 个阶段,它的输入来自于 CPU 。

GPU 可以利用本身的特性并行化处理每一个顶点 ,这意味着这一阶段的处理速度会很快。

顶点着色器需要完成的工作主要有:坐标变换和逐顶点光照。

裁剪

不在摄像机视野范围的物体不需要被处理 。而裁剪 (Clipping) 就是为了完成这个目的

一个图元和摄像机视野的关系有 完全在视野内、部分在视野内、完全在视野外

屏幕映射

屏幕映射 (ScreenMapping) 的任务是把每个图元的 坐标转换到屏幕坐标系 (Screen Coordinates) 下。

屏幕坐标系和 坐标 起构成了 个坐标系,叫窗口坐标系 (Window Coordinates) 。这些值会一起被传递到光栅化阶段

三角形设置

光栅化的第一个流水线阶段是三角形设置 (Triangle Setup) 。

这个阶段会计算光栅化一个三角网格所需的信息。

三角形遍历

三角形遍历 (Triangle Traversal) 阶段将会检查每个像素是否被 个三角网格所覆盖。如果
被覆盖的话,就会生成一个片元 (fragment) 。而这样一个找到哪些像素被三角网格覆盖的过程就是三角形遍历,这个阶段也被称为扫描变换 (Scan Conversion)

片元着色器

片元着色器 (Fragment Shader) 是另 个非常重要的可编程着色器阶段。在 DirectX 中,片
元着色器被称为像素着色器 (Pixel Shader), 但片元着色器是 个更合适的名字,因为此时的片元并不是一个真正意义上的像素。

片元着色器的输入是上 个阶段对顶点信息插值得到的结果 更具体来说,是根据那些从顶点着
色器中输出的数据插值得到的。而它的输出是 个或者多个颜色值。

这一阶段可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。

逐片元操作

逐片元操作 (Per Fragment Operations) OpenGL 中的
说法 Direct.X 这一阶段被称为输出合井阶段 (Output-Merger) Mer er 这个词可能更容
易让读者明白这一步骤的目的 合并。

  1. 决定每个片元的可见性。这涉及了很多测试工作,例如深度测试、模板测试等
  2. 如果一个片元通过了所有的测试 就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并 或者说是混合。

Shader

  • GPU 流水线上一些可高度编程的阶段,而由着色器编译出来的最终代码是会在 GPU 上运
    行的
  • 有一些特定类型的着色器,如顶点着色器、片元着色器等
  • 依靠着色器我们可以控制流水线中的渲染细节,例如用顶点着色器来进行顶点变换以及传
    递数据,用片元着色器来进行逐像素的渲染