您在屏幕上看到的是由运行在62 MHz的真实协处理器(RCP),一个由硅图设计的的巨大芯片生成的。 这个芯片包含一大堆 电路,所以如果你觉得难以理解,请不要担心,这个图形子系统有着非常复杂的架构!
这个设计基于GPU并不意味着像 竞争者一样是一个"简单的"光栅化器的哲学。 相反,它还应该能够加速几何计算(将负载从CPU转移),为此,需要更多的电路。
架构
这个芯片分为三个主要模块,其中两个用于图形处理:
真实信号处理器
也被称为 RSP, 它只是包含以下部件的另一个CPU :
- 标量单元:另一个MIPS R4000的削减衍生物。 这一次,它只实现了 MIPS III ISA的一部分,因而缺少许多普通用途功能(比如说中断和异常)、64位扩展、乘法与除法功能。
- 矢量单位: 一个执行矢量操作并拥有32个128位寄存器的协处理器。 每个寄存器都被分为八个部分,以一次操作八个16位矢量(就像传统CPU上的SIMD指令一样)。 正如您所看到的,这个组件为标量单元做一些繁重的任务。
- 系统控制器: 另一个提供DMA 功能并控制其邻居模块RDP(稍后会介绍它)的协处理器 。
要操作此模块, CPU 在内存中存储一系列名为 显示列表 的命令以及将被操纵的数据, 然后RSP 读取列表并对数据应用所需的操作。 可用的特性包括几何变换(例如透视投影)、剪切与光照。
这似乎是直截了当的,但它是如何执行这些操作的? 好的,这里是有趣的部分:与竞争者(PS1和Saturn)不同, 几何引擎不是硬连线的。 相反, RSP 包含了一些存储 微代码 (一个不超过 1000 条指令的小型程序)的内存 (4KB 用于指令,4KB 用于数据) 来 实现图形管线 换言之,它指导标量单元如何操作我们的图形数据。 微代码在运行时由 CPU 提供。
任天堂提供了可以选择的不同微代码,并且与 SNES的背景模式相似,每个微代码都以不同地方式平衡资源。
真实显示处理器
在RSP完成处理我们的多边形数据后,它将开始向下一个模块,RDP发送一个光栅化命令以绘制帧。 这些命令要么使用一个叫做 XBUS 的专用总线发送,要么通过主内存发送。
RDP是另一个处理器(这次具有固定功能),它包括多个引擎来光栅化矢量,将纹理映射到多边形上,混合颜色并组成新帧。
它可以处理 作为原始数据的三角形 或 矩形 ,后者有助于绘制精灵。 RDP的光栅化管线包含以下模块:
- 一个光栅化器: 将由顶点组成的原始数据转换成像素。
- 一个纹理单元: 使用 4 KB 的专用内存(称为"TMEM") 处理纹理,允许最多使用8个图块进行纹理处理。 它可以对它们执行以下操作:
- 双线性过滤:将选定的2D纹理映射到3D形状上,并对其进行平滑,以避免产生像素化区域(由过采样引起)。
- 但是,"完整"过滤器需要四个点才能进行插值。 这台主机只使用三个(三角形插值),这导致了一些异常。 因此,某些材质必须事先"调整"。
- Mip Mapping:根据纹理的详细程度,自动选择纹理的缩放版本。 这就避免了计算远离相机的大型材质,并防止了锯齿(欠采样的产物)。
- 如果启用,RDP 将使用 三线性过滤 映射纹理图。 这种新算法还会在mipmap之间进行插值,以缓解细节程度的突然变化。
- 透视校正: 将纹理映射到三角形的选用算法。 与其他逆映射算法不同,该算法考虑了每个图元的深度值,从而获得更好的结果.
- 双线性过滤:将选定的2D纹理映射到3D形状上,并对其进行平滑,以避免产生像素化区域(由过采样引起)。
- 一个彩色组合器: 混合和插值多层颜色(例如应用阴影)。
- 混合器:根据当前帧缓冲区混合像素以应用半透明、抗锯齿、雾、抖动。 它还执行Z缓冲(稍后会详细介绍)。
- 一个内存接口: 被前几个模块用来读取和写入当前内存帧缓冲区和/或填充TMEM。
RDP提供四种功能模式,每种模式将这些模块以不同方式组合,以优化特定操作。
由于这个模块不断更新帧缓冲区,它处理的内存非常不一样:还记住不寻常的 9 位 '字节' ? 第九位用于与帧缓冲相关的计算(Z缓冲和抗锯齿),并且只能通过内存接口操作。
剩余步骤
生成的帧必须发送到 视频编码器 以便在屏幕上显示。DMA 和 视频接口 组件是完成这个任务所必需的。
理论上最大可输出24位彩色深度(1680万种颜色)和640x480分辨率(或PAL区域中的720x576)。 我把它说成是"理论上的",因为使用最大功能可能会使资源匮乏。 这样程序员趋向于使用较低的输出分辨率与色深来腾出足够的资源用于其他功能。
快速演示
让我们把先前的所有解释都放在正确的位置上来。 我会借助任天堂的 超级马力欧64 来展示如何生成一帧:
顶点处理

我们场景的原始视图。 为了减少多边形数量,一些角色使用精灵 (四边形) 建模。
最初,我们的原料(3D模型等)位于卡带ROM中。 但要保持稳定的带宽,我们需要先将它们复制到内存中。 在某些情况下,数据可能会在卡带中被预先压缩,因此CPU在操作它们之前需要解压缩。
完成后,现在是时候使用我们的模型构建一个场景了。 CPU可以自行完成整个流水线, 但可能需要 非常长的时间, 所以许多任务交给了RCP。 CPU将转而向RCP发送命令。 这是通过执行以下任务来完成的:
- 编写显示列表,其中包含将由RSP执行的操作,并存储在内存中。
- 将RSP指向显示列表所在的位置。
- 向RSP发送微代码以启动标量单元。
之后,RSP将开始执行第一批任务,结果将以光栅化命令的形式发送给RDP。
像素处理
到目前为止,我们成功地处理了数据并对其施加了一些影响,但我们仍需要:
- 渲染矢量,应用纹理和其他效果。
- 显示帧缓冲区
正如你可能猜测的那样,这些任务将由RDP执行。 要完成这项工作,必须使用DMA 将纹理从内存复制到 TMEM。
RDP 有一条固定的管线, 但我们可以根据当前的任务选择最佳的操作模式来提高帧率。
RDP 完成处理数据后,它将把最后的位图写入内存中的帧缓冲区。 此后,CPU必须将新帧传输到 视频接口 (VI) ,最好使用DMA。 VI将依次将其发送到视频编码器进行显示。
设计
以下是为新3D时代重新设计的以前超级任天堂的2D角色的一些示例,它们是交互式的,因此我鼓励您查看它们!

"现代版本"中可用的互动模型
塞尔达传说:时之笛(1998年):
704个三角形.

"现代版本"中可用的互动模型
星之卡比64 (2000).
516个三角形.
现代可见表面判定
如果您已经阅读过上一个主机的文章, 你遇到了关于表面可见性的问题,并且现在可能认为多边形排序是解决这一问题的唯一方法。 嗯,在本系列中,RDP首次采用了一种基于硬件的方法,称为Z缓冲。 简而言之,RDP在内存中分配一个名为"Z缓冲区"的额外缓冲区。 它具有与帧缓冲区相同的尺寸,但不存储RGB值,而存储相对于相机的最近像素的深度(Z值)。
当RDP光栅化矢量后,将新像素的z值与Z缓冲区中的相应值进行比较。 如果新像素包含较小的z值,则意味着新像素位于前一个像素的前面,因此它将进入帧缓冲区,Z缓冲区也将更新。 否则,像素将被丢弃。
总的来说,这是一个非常受欢迎的补充:程序员无需再担心实现基于软件的多边形排序方法,而这会消耗大量CPU资源。 但是,Z缓冲并不能避免您输入不必要的几何体(被丢弃或被过度使用,这两者都会消耗资源)。 为此,游戏引擎可能会选择包含一种遮挡剔除算法,以尽早丢弃不可见的几何体。
秘密和限制
硅图(SGI)显然在这一系统中投入了大量技术。 尽管如此,这是一个家用游戏机,因此,它必须降低成本。 一些艰难的决定给程序员带来了困难的挑战:
流水线暂停
由于图形管线中有大量的组件和操作,RCP最终非常容易发生暂停:在不理想的情况下,所需数据在流水线后级延误,因此子组件在相当长的时间内保持空闲。
这将总会导致性能下降,由程序员来避免这种情况。 尽管为了简化操作,一些计算单元(如标量单元)引入了一个名为绕过的功能,该功能可以绕过一些可以跳过的执行阶段,以更快的速度执行类似的指令。
例如,如果我们必须计算多个ADD指令,则无需将结果写回寄存器,然后在每次完成ADD时将其读回。 相反,我们可以对所有加法运算使用相同的寄存器,并在最后一个ADD完成后进行写回。
纹理内存
RDP依赖4KB的TMEM(纹理内存)作为加载纹理的单一来源。 不幸的是,实际上4KB对于高分辨率纹理来说是不够的。 此外,如果使用mipmapping,则可用内存量将减少到原来的一半。
因此,一些游戏使用了带有高洛德描影的纯色(如超级马力欧64),而其他游戏则依赖于预先计算的纹理(例如,必须预先混合多层纹理)。
通用视频输出
任天堂继续使用和上一台主机一样的 '通用' Multi Out 端口,但坏消息是它不再携带RGB 信号! 在我看来,这是另一种节省成本的措施,因为以前的主机中没有使用RGB。
好消息是,通过焊接一些电缆和安装一个廉价的信号放大器,仍然可以让最初的版本输出RGB。 这是因为视频数模转换器将RGB信号传输到视频编码器。 然而,后来的主板版本将这两种芯片结合在一起,所以剩下的唯一选择是完全绕过视频DAC和编码器,使用自定义电路来产生RGB信号。


