显卡管线
大家都知道,CPU中的管线通过分配将一个大程序划分为许多个独立的单元,然后各个独立单元再分别各自运行,这样能够使得CPU的效率得以提高。那么显卡处理器(GPU)中的管线有对于显卡的工作又有何作用呢?今天我们为大家简单介绍一下显卡中管线的工作原理。
相信很多对CPU有所熟悉的读者都知道现行的台式机处理器运用一种名为“管线”的架构,将所要运行的程序分割成诸多个小的独立单元,然后这些被分割的独立单元分别运行各自部分。这样就使得你可以在同一时间内运行几个不同的程序,而工作频率则是各个被分割的独立单元中最低的频率。
举个现实中的例子来说,如果你需要自己用洗衣机洗衣服的话,那么你需要做的是,将要洗的衣服放入洗衣机,开动洗衣机,将已经洗好的衣服从洗衣机中取出烘干后再将他们叠好后放入衣橱等着下次穿的时候再拿出来。
现在假设你需要洗的衣服的数量很多,一次并不能洗完,这样,“管线”的作用就体现了出来,假如我们在洗衣机中也运用了管线技术,那么等你把第一批洗好的衣服取出洗衣机,将第二批要洗的机器放入洗衣机时,同时上一批已经洗好的衣服此时正在被烘干。等第一批衣服被烘干后,你就可以将它们叠起来了,而此时因为有了管线的帮助,洗衣机可以同时进行第二批衣服的烘干以及第三批衣服的洗涤。此时,你拥有的便是一个三级管线,而有了管线以后,你甚至可以同时做更多的工作。
没有管线时:
洗涤->
烘干->
叠好->
洗涤->
烘干->
叠好->
洗涤->
烘干->
叠好
有了管线以后:
洗涤
洗涤->烘干
洗涤->烘干->叠好
烘干->叠好
叠好
通过上面的直观列表我们可以看到在同样的情况下,有了管线的洗衣机,运行三个任务所用的时间大大减少,工作效率飞速提高。对于显卡处理器而言,管线的作用也基本相同。例如,当你的显示器需要显示3D模型时,显卡处理器通过管线将这项工程分割成许多级或者部分,当你提高显卡处理器的工作频率,每个独立的级完成各自任务所用的时间就会相对减少。这样,完成整个任务所用的时间也相应减少。
通过上面的简要介绍以及一个直观的例子,我们对管线在显卡处理器中所发挥的作用有了一个大致的了解,那么究竟管线具体是如何工作的呢?我们在后面的文章会为您进行详细的介绍。
显卡管线——显卡处理器中的管线
在游戏或者其他渲染程序中,每个被表现出来的物体都被视作一个3D模型,都有自己独立的坐标系以及特定的放缩比例,并且物体的每一个部分都从各个角度被染色。这些部分通常是由一些三角形所组成,这是因为三角形的三个顶点是处在同一平面之内的。当一个场景产生时,它需要包含几个不同的部分,所有的这些部分被定义在了同一坐标系中,它们在坐标系中的缩放比例也是相同的。而这便是电脑中显卡的作用,显卡的作用便体现于此。
管线工作步骤
那么管线究竟是如何工作的呢?通常来说,我们将管线的工作过程分为几个步骤,下面就让我们来分别介绍和分析一下管线工作过程中的这几个部分。
第一步是将需要表现的物体按照统一的缩放比从不同坐标系中的转移到一个统一的坐标系中,这个坐标系就是我们刚刚提到的那个。比如通过缩放,一辆汽车在游戏中很有可能只有一张咖啡桌大小,等等。管线通过这一步制造出我们所熟知的图像最基本的组成部分——帧,然后再由这些帧组成画面。
管线工作的第二个步骤是将这些经过缩放且处于同一坐标系中的物体移到透视图中,而用户则是通过这张透视图看到所有景象的。这通常被叫做“照相”角度。所有的物体在这个角度中都必须以照相机呈像的原理得以表现出来。为了使得所有的物体都能够从第一步中的坐标系中移入这个“照相”角度的坐标系中,通常它们要被经过旋转,转化以及缩放等处理方法。通常而言,近距离的物体要比远距离的物体显得大,而这正是我们通常所说的“近大远小”的原理。
经过以上两步之后,我们现在要做的就是去除一些不需要的成分。这一步就是管线工作的第三步,叫做“遮断剔除”。这一步是将一些隐藏的三角形去除,因为我们确实没有必要将一些例如隐藏在墙背后的物体进行渲染,这样做显然是徒劳无功的。比如,你和我们所要渲染的汽车处于同一平面中,你能看到的仅仅是乘客这一侧,因此,我们也就没有必要再去对你看不到的驾驶员的那一侧进行渲染以及其他处理了。
有的时候我们所需要呈现的一些物体是透明的,例如水。我们不能将鱼的模型放入水面十分平静的河中,因为庋雌鹄春懿徽媸怠R虼耍庖徊酵ǔ1怀莆叭コ彼觥薄?
显卡管线——照明
接下来的一步通常被称做“点亮”或者“照明”。如果呈现在用户眼前的场景是一个完全黑暗以至于你看不见任何东西的场景,你会有什么感觉?一定是很令人厌烦吧。而这便是“照明”这一步所要做的,它要将全部黑暗的景象进行光学处理,然而确切的说这一步是十分复杂的一步。因为它所要做的不光仅仅是给部分景象进行点亮处理,还要根据实际情况,因地制宜的进行更改,因为只有这样,图像看起来才会显得真实。在普通3D模型中,越接近真实的亮度是越好的。这通常需要做很多工作才可以达到最佳的效果。熟悉OpenGL的人可以告诉你,这项工作到底有多么的艰难。即便是你拥有很强大的系统,要捕捉,制造一个近乎真实的亮度场景也是需要颇费一番功夫和时间的。
当然,结果通常还是比较令人满意的。但是,如果你花费了整整2天的时间去对你的游戏进行渲染,这多少显得有些吹毛求疵。
我们经过了缩放,移入同一坐标系,去除多余的三角形,以及点亮和上色之后(但是图像尚未经过纹理和阴影处理,这些将在后面进行),现在呈现在我们眼前的场景与照相机所能看到的一样。现在展现在我们眼前的景象通常被称为“视锥”,但是我们还没有将所有的细节都制作完成。下面的图片展示的就是到目前为止,我们所能够得到的景象,也就是所谓的照相机景象。
所有在平截头体以外的模型部分都被删除,这一步与上面的那些步骤相比而言就要简单的多了。这一步的关键就是要选取在视角中的三角形对它们进行保留,并且去除视角之外的部分。这需要做一定的“取舍”。
在决定了哪部分要被去除之后,留在视角中的三角形要被缩小,此时管线要通过减切等方式尽量减少三角形的数量。不同的构架有各自不同的方式,因此也会有不同的处理速度以及效果质量。在完成了这一步之后,我们就得到了我们接下来要用的所有三角形。
显卡管线——将3D图像转换为2D图像
接下来管线工作过程中的一步是极为关键的一步,就是将原本立体的3D图像转化为在用户电脑显示器上所显示出来的平面2D图像。
这一步的最开始,所有的数据被保持在了顶部,然后被转换为电脑显示器将要展现的象素。然后,立体3D(x, y, z坐标系)坐标系被转化为平面2D(x, y坐标系)坐标系,而用户的显示器也是一个平面的坐标系。最后,纹理,阴影,抗锯齿处理,各向异性过滤,暗部,雾化,ALPHA混合,模板,深度以及其他一些显卡功能将在后面的过程中得以进行。
非常感谢您阅读我们今天这样一篇介绍性的文章,希望读者可以从这篇文章中获取一些有关3D图形以及他们是如何在显示器中呈像的知识。