正如我们之前看到的,图形处理器位于NV2A芯片中,与MCPX一样,由英伟达制造。
该公司在图形处理器领域已经有很长的历史,其GeForce系列是计算机市场上最受欢迎的GPU品牌之一,直接与ArtX/ATI的Radeon系列竞争。 总的来说,考虑到这是微软在游戏机市场的首次尝试,这为Xbox的图形质量提供了很好的筹码。
这一切似乎都合情合理,但当年的决定真的是正确的吗? 我们很容易从现在的历史中找到微软选择英伟达而不是当时其他流行品牌(3dfx、PowerVR、S3等)的原因,但如果我们更多地了解一下当时的竞争情况,就会发现选择的全景要复杂得多。
例如,到90年代末,3dfx广受欢迎的"Voodoo 2"系列在PC市场上占据了约 70%的市场份额,而英伟达则在努力推广新的"GeForce 256"(GeForce系列的第一款产品)。 在此之后,微软的选择听起来更像是一种冒险而非安全的赌注,但正如我们现在所知,这种冒险最终得到了回报。
1999 年,英伟达并不像现在一样是业内龙头。 他们遇到了麻烦。 新的GeForce架构还很年轻,很多人都不喜欢它。 现在看来这是理所当然的。 但你需要研究那段历史才能了解这一点,以及为什么我必须为之奋斗。 我当时是对的,但当时并不知道我是对的;我非常担忧。
——Seamus Blackley,初代Xbox的合作制作者
下面,我们将研究这款芯片的内部工作原理。 现在,恐怕我们会发现自己就像CPU部分一样,掺杂了大量的专业术语和营销术语,但不用担心! 我将从最基本的开始。
架构设计
NV2A的GPU内核基于流行的"GeForce3"系列GPU ,在英伟达的技术文档中也被称为NV20。
请注意,虽然Xbox的GPU流水线基于NV20架构,但NV2A有一些与NV20系列其他产品不兼容的修改(最重要的是,它已被调整为在统一内存架构环境中工作)。
所分析的设备还包含许多超出本文范围的功能,因此,如果这部分内容引起您的注意,我建议您查阅相关资料/参考文献。 此外,由于图形相关术语在不断演变(这可能会导致一些混淆),我决定采用微软/英伟达在Xbox时代使用的术语,因此如果你打算从其他来源阅读更多图形相关文章,请记住这一点。
说完这些,让我们来看看Xbox是如何绘制帧的。 其中一些解释与GameCube的Flipper非常相似,因此如果您在阅读这篇文章时遇到困难,也可以阅读一下这篇文章。
指令
首先要解释的是GPU如何从CPU接收命令。 为此,GPU包含一个名为PFIFO的命令处理器,它能以FIFO的方式有效地获取和处理图形命令(称为Pushbuffer),解压缩的命令随后会被传送到PGRAPH(负责图形处理的块)和其他引擎。
与Flipper一样,几何图形不必嵌入命令中。 PGRAPH提供了多种提交图形数据的方式。 例如,CPU可以在RAM中分配一个包含顶点数据的缓冲区,然后指示GPU从该位置获取数据。 这种方法效率很高,因为它可以避免发送重复的几何图形。
接下来的解释将在PGRAPH中进行。
顶点
对于GPU而言,这是一个特别有趣的部分。 在这一阶段,GPU能够对我们的几何体进行顶点变换。 我们已经在Flipper上看到过这一功能,但与Flipper不同的是,这款GPU使用的是可编程引擎。 这意味着开发人员可以指定执行哪些顶点操作以及如何执行,而不是依赖于预定义的程序。 不过,如果需要,NV2A也可以在"固定"模式下运行。
这一阶段由顶点单元处理,NV2A有两个顶点单元。 每个顶点单元可以加载一个包含多达136条指令(也称为微码)的程序。 该程序称为顶点程序,在运行时加载。 顶点程序可执行以下操作:
- 算术运算(即加法、乘法、取最小值等)。
- 这包括辅助图形相关任务的"辅助函数",如点乘。
- 顶点旋转(Vertex Swizzling)(重新排列和/或复制)。
简而言之,顶点单元通过在寄存器中操作顶点来处理顶点。 换句话说,程序加载完成后,16个只读寄存器(称为 "输入寄存器")将被初始化为顶点属性(每个向量包含四个分量)。 然后,该单元利用输入寄存器执行一系列操作(由程序指示)。 此外,还提供了12个可写寄存器和多达196个常量来辅助计算。最后,生成的顶点被存储到另一个由 11 个可写寄存器(每个寄存器都有特定用途)组成的块中,并被传送到下一阶段。每个接收到的顶点都要重复这一过程。 最后,生成的顶点被存储到另一个由11个可写寄存器(每个寄存器都有特定用途)组成的块中,并被传送到下一阶段。 每个接收到的顶点都要重复这一过程。
像素
在这一阶段,顶点被转换成像素。 这一过程由光栅化器开始,光栅化器生成像素来绘制每个三角形。 NV2A的光栅化器每个周期可生成四个像素。之后,4个纹理着色器用于从内存中获取纹理,这些着色器还能自动应用各向异性过滤、mipmapping 和阴影缓冲(shadow buffering)。 阴影缓冲用于测试像素是可见还是被光源遮挡,从而应用正确的颜色。 此时,GPU还可以执行剪切和早期Z测试(NV2A将Z缓冲压缩为原来的四倍,以节省带宽,从而大大提高了性能)。
生成的像素存储在一组共享寄存器中,然后在8个寄存器组合器中循环,每个组合器对像素进行算术运算。 这一过程可通过像素着色器(GPU执行的另一种程序)进行编程。 在每个周期,每个组合器都会从寄存器组接收RGBA值(RGB+Alpha)。 然后,根据着色器设置的操作,对数值进行运算并写回结果。 最后,大量数值被发送至最终组合器,该组合器可专门混合镜面色彩和/或雾气。
寄存器组合器的编程方式与纹理环境单元(Texture Environment Unit)类似。 也就是说,通过特定的设置组合来改变寄存器。 在Xbox中,PFIFO读取推送缓冲区来设置PGRAPH,其中包括寄存器组合器和纹理着色器。
后处理
在将像素写入帧缓冲区之前,NV2A包含四个称为光栅输出单元(Raster Output Unit,"ROP")的专用引擎,它们使用主内存中分配的块执行必要的测试(Alpha、深度和模版)。 最后,只有通过这些测试的像素才会被写回(每个周期四个)。
此外,帧缓冲区还可以使用一种称为多重采样的技术进行抗锯齿处理。 从本质上讲,这种技术对多边形的边缘进行多次采样,并在采样过程中添加不同的偏移量。 然后,对所有采样取平均值,形成抗锯齿图像。 这种方法取代了之前英伟达GPU使用的称为"超采样"的抗锯齿功能(更耗费资源)。
可编程性的重要性
我认为强调英伟达为开发人员提供的全新可编程模式的重要性至关重要。 多年前,大部分图形流水线都是由CPU计算的,GPU只负责加速光栅化操作。 随着"着色器"(指像素着色器和顶点程序)的引入,程序员可以利用GPU的资源优势来加速流水线中的许多计算,从CPU卸下大量工作。
"着色器"的概念是由皮克斯(Pixar)公司于1989年提出的,作为一种扩展Renderman——皮克斯用于3D渲染的开创性软件——的方法。 当时,3D图形主要由工业设备处理。 后来,我们看到某些游戏机也采用了类似的原理,但直到英伟达发布GeForce3系列,着色器才成为消费市场的标准。
ChameleonMark(2002年),英伟达为展示GeForce3着色器而开发的演示程序(跑分软件)。有了顶点程序,GPU现在可以加速模型转换、照明计算和纹理坐标生成。 后者对于合成高阶曲面至关重要。 这样,CPU 就可以集中精力提供更好的物理、AI和场景管理。
对于像素着色器,程序员可以通过多种方式处理和混合纹理,以实现不同的效果,如多重纹理、镜面贴图、凹凸贴图、环境贴图等。
通用GPU(General Purpose GPU,"GPGPU")是由于这种方法而出现的一个新编程概念,它包括将原本完全由CPU完成的任务分配给 GPU。 因此,GPU不仅接管了大部分图形管道,现在还能作为高效的协处理器进行专业计算(如物理计算)。 这是一个新的领域,随着GPU变得更加强大和灵活,它还将不断发展。 不过,由于结合了硬件功能(顶点和像素着色器)和专门开发的应用程序接口(OpenGL的"状态程序"),NV2A已经能够做到这一点。
我有一种预感,着色器将在今后的文章中经常出现。 但请记住,在本文中,着色器可能会被认为有点"原始",有些人可能会认为像素着色器甚至算不上"着色器"(与现在的GPU相比)。
Xbox的帧
游戏的标准分辨率为640x480,这几乎是第六代游戏的标准分辨率。 不过,这个限制只是一个数字: GPU可以绘制高达4096x4096的帧缓冲区,但这并不意味着硬件可以提供可接受的性能。 另一方面,游戏机允许对屏幕设置进行全局配置,这可能有助于推广先进功能(如宽屏幕和"高分辨率"),而不是等待开发人员去发现(如Gamecube/Wii的情况)。
另一方面,视频编码器会尝试将帧缓冲区上的任何内容以电视机能理解的格式播放出来。 这意味着,除非游戏以高清格式输出(即720p或1080i,只有少数游戏会这样做),否则宽屏图像将变成变形图像。
既然如此,那么这款游戏机会输出什么样的信号呢? 相当多。 除了典型的PAL/NTSC复合信号外,Xbox 还提供YPbPr(需要额外配件才能获得"分量"连接器)和RGB(符合SCART和VGA标准)信号。 总而言之,无需昂贵的转换器,非常方便。







