GPU是如何工作的

早在1990年,无处不在的交互式3D图形还只是科幻小说里的东西。十年后,基本上每台新电脑都包含一个图形处理单元(GPU,即Graphics processing unit)。直到今天,GPU的原始计算能力已经超越最强大的CPU,并且差距还在稳步增大。今天,GPU可以直接使用图形硬件来实现许多并行算法。那些利用底层计算能力的适当的算法常常会获得巨大的速度提升。

任何3D图形系统的任务都是根据一个场景的描述来合成一张图片 --- 对实时渲染图形学(例如游戏)来说是每秒60张。这个场景包含了可观察的几何图元以及灯光照亮场景的描述,每个对象反射光照的方式和观察者的位置、朝向。

图形管线输入

大多数实时图形系统假设所有东西都是由三角形组成的,它们首先将任何复杂的形状(例如四边形,曲面)划分为三角形。开发者使用图形库(例如OpenGL或者Direct3D)将每个三角形传递给图形管线,每次传递一个顶点,GPU根据需要将顶点组合成三角形。

模型转换

GPU能够以每个对象自己定义的本地坐标系来指定场景中的对象,这对于按层次定义的对象来说是很方便的。但这种方便是有代价的:在渲染前,GPU首先必须转换所有的对象到一个公共的坐标系中。为了确保三角形不会变形和扭曲,转换被限定在一些简单的仿射操作如旋转、平移、缩放以及类似的操作。这个阶段的输出是一连串的三角形,这些三角形被转换到一个公共的坐标系中,在这个坐标系中,观察者位于原点,朝向z轴正方向。

光照

一旦每个三角形都被转换到一个全局坐标系中,GPU就可以基于场景中的光源来计算它的颜色了。GPU通过累加每个独立的光源的贡献量来处理多光源效果。传统的图形管线支持Phong光照模型,Phong光照模型按如下公式输出颜色C = Kd × Li × (N.L) + Ks × Li × (R.V)^S,其中Kd是漫反射颜色,Li是光源颜色,N是表面法向量,L是顶点到光源的向量,Ks是镜面光颜色,R是光源到顶点的反射向量,V是顶点到摄像机的向量,S是光亮强度。

摄像机模拟

图形管线接着将每个着色的三角形投射到虚拟摄像机平面。这个阶段的输出是一连串在屏幕坐标系中的准备被转换为像素的三角形。

光栅化

每个可见的屏幕空间中的三角形在显示时会导致像素重叠,确定***接近图形的像素集合的过程成为光栅化。GPU设计者多年来合并了许多光栅化算法,都利用了至关重要的一点:每个像素都可以独立于其他任何像素被对待处理。因此,机器能够并行的处理所有像素 --- 确实有一些奇异的机器对于每一个像素都有一个处理器。这个固有的独立性导致GPU设计者去构建逐渐并行的管线集合。

纹理

尽管每个像素的颜色可以通过光照计算产生,但为了真实感,常常会在几何体上使用纹理。GPU把这些纹理存储在高速存储器中,当计算每个像素的颜色时需要访问该存储器。实际上,当纹理出现在屏幕上的尺寸比它的原始尺寸大或者小时,对于每个像素,GPU都需要多次访问纹理进行采样以减少视觉误差。由于对于存储纹理的高速存储器的访问模式通常非常有规则(邻近像素常常访问邻近的纹理坐标进行采样),所以特定的缓存设计将帮助隐藏存储器访问的延迟。

隐藏表面

在许多场景中,一些对象会遮掩另一些对象。如果每个像素只是被简单的写入显存的话,那么最近提交的三角面将会显示。所有的现代GPU都提供了一个深度缓存,深度缓存是用来存储每个像素到观察者的距离的一块内存区域。新像素在写入显存之前,GPU会将新像素到观察者的距离值与已经在深度缓存中的值进行比较,如果新像素到观察者的距离更近的话,GPU将会更新深度缓存中的值。

齐次坐标

在三维世界中通常将点表示为(x, y, z)。然而在计算机图形学中,添加第四个坐标w通常很有用。为了将一个点转换为新的表现形式,我们设置w = 1。当要还原回原始点的时候,我们执行下面的转换:(x, y, z, w) -> (x/w, y/w, z/w)。尽管乍看之下貌似没什么必要,但这种方式有巨大的优点。例如我们可以将向量(x, y, z)表示为(x, y, z, 0)。通过这种对于向量和点的统一的表示方法,我们就可以执行一些有用的变换,例如矩阵-向量乘法。

发展进化的图形管线

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjszd.html