DirectX11 图形流水线历史以及着色器简介

时间:2022-11-08 16:00:34

图形流水线历史

Direct3D要求使用着色器来渲染几何图形,因此我们会在深入讨论着色器之前就会遇到它们。为了了解着色器的由来,我们首先要了解下图形流水线的历史。

  1. 图形流水线是什么?

    图形流水线是GPU(图形处理器,显卡的心脏)工作的通用模型。它以某种形式表示的三维场景或物体为输入,输出二维的光栅化(光栅化,就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。见下图)图像到显示器。
    DirectX11 图形流水线历史以及着色器简介

  2. 固定图形流水线有哪些流程?

    1. 图形流水线的起点是一个三维模型,三维模型中的顶点列表即是流水线的输入数据,从起点进入流水线。
    2. 顶点可以用来形成多边形,从而拟出近似的表面。由顶点形成多边形最常用的一种方法就是三角化,即每相邻的三个点组成一个三角形。接下来每个顶点要经过一系列的逐顶点操作,比如计算每个顶点的光照,每个顶点的坐标变换等。
    3. 由于显示输出的需要,用户会定义一个视口,即观察模型的位置和角度,然后模型被投影到与视口观察方向垂直的平面上。这个投影变换也是硬件加速的。根据视域的大小,投影的结果有可能被裁剪(clipping)。
    4. 接受模型投影的平面是一个帧缓存,它是一个由像素定义的光栅化平面。光栅化(rasterization)的过程,实际上就是决定帧缓存上的哪些像素该取怎样的值。通过采样和插值,光栅化器会决定一幅最接近原投影图像的位图。
    5. 这些像素或者由像素连成的片段还须经历一些逐片段操作,也就是说,它们的颜色也可以根据算法改变。另外,纹理映射在这一阶段也会覆盖某些像素的值。另外,对于投影和光栅化的结果,还要判断片段的可见性,也就是遮挡探测(occlusion detection)。
    6. 最后帧缓存里的结果被刷新到显示器上。该过程以较高的帧频率重复,用户就能在显示器上看到连续的图形变换。
      这个过程可以简要地表示为图1-5所示的流水线。从顶点列表到最终显示,三维模型主要经历了逐顶点操作、投影变换、裁剪、光栅变换和逐片段操作,最后输出显示。随着日益复杂的图形处理要求和不断完善的硬件加速性能,有越来越多的功能被添加到图形流水线中,下图只概括了流水线的基本功能。
      DirectX11 图形流水线历史以及着色器简介
  3. 那可编程图形流水线是什么?

    下图表示一个可编程图形流水线,其中已经略去了与经典GPGPU方法无关的模块。流水线的功能模块用箭头串起来,表示工序流动的方向。灰色的模块为可编程模块。当然,除了图上所给出的模块之外,它还有其他的模块。这里,除了我们已经熟悉的这条流水线,图下图还添加了另一个重要的模块──纹理缓存(Texture Buffer)。
    DirectX11 图形流水线历史以及着色器简介
    细心的读者也许已经留意到,图1-6中的两个着色器模块被涂成了灰色。这是为了引入一个重要的概念:可编程图形流水线。从结构上来说,上图的流水线模型从应用程序到帧缓存的部分同固定图形流水线中的功能一一对应,只是OpenGL使用了不同的术语来指代这些流水线组件和硬件之间的对应关系。支持可编程图形流水线的GPU就是可编程图形处理器。2001年之前,GPU都是功能固定的,或者是可设置的(configurable)。可编程GPU与它们最大的区别是,用户可以用自定义的算法来实现着色器的功能。在可编程图形流水线中,有两个模块是可以让用户加载自定义算法的,它们是顶点着色器和片段着色器。

  4. 着色器是什么?

    着色器(shader),又叫着色单元,实际上就是GPU的处理器。一般情况下,一个GPU会有多个处理器(几十个甚至几百个),它们同时工作,体现了GPU大规模并行处理的能力。进行几何计算的处理器叫顶点着色器,它负责对顶点进行坐标变换、投影变换等;进行片段的颜色处理的叫做片段着色器(Direct3D中称其为像素着色器)。应用程序输入GPU的是三维的点云数据。从流水线输入端直到顶点着色器,流水线计算的对象都是三维几何模型;从光栅化器开始,所有的操作都是针对二维的像素了。