相关影像
一个简短的介绍
欢迎来到3D时代! 嗯…某种意义上是这样。 世嘉在Mega Drive上取得了相当大的成功,因此没有理由强迫开发人员现在就开始编写3D游戏。
不过以防开发人员想要额外的维度,世嘉也调整了一些硬件来启用多边形绘制。 希望结果不会失控!
中央处理器 (CPU)
正如其紧密的竞争对手在 RISC 热潮中被各种选择淹没一样,世嘉也不得不经历选择新供应商的所有难题,这个供应商能够带来下一代游戏(包括那些具有“3D”功能的游戏)。 最后,该公司选择了一个新的CPU,其创造者正在拼命寻找采用者,即日立的 SuperH或“SH”。
虽然最初专注于嵌入式应用,但日立的新产品展示了现代技术,例如 [1]:
- 加载存储架构,这意味着指令不会混合内存和寄存器操作,从而实现更清晰和可扩展的CPU设计。 这正是RISC CPU的支柱之一。
- 32位数据总线和ALU,能够在不消耗额外周期的情况下移动和操作大量数据(32位值)。
- 16个通用32位寄存器,是摩托罗拉68000等以前CPU数量的两倍。 这是源自RISC指南[2] 的另一个设计决策。
- 32位地址总线,最多允许寻址4 GB内存(告别映射器)。
- 具有五个阶段的流水线数据通路:指令的执行现在分为五个步骤或阶段。 CPU将排队最多五条指令,每条指令都在一个阶段分配。 这允许在不空闲的情况下利用所有CPU的资源,同时增加每单位时间执行的指令数量。
- 16位乘法单元:对16位整数执行乘法。
此外,SuperH具有一个名为SuperH ISA的新指令集,除了采用RISC设计外,它的所有指令都是16位宽的。 这令人惊讶,因为这款 CPU 是 32 位的,所以正常情况会预期指令具有相同的长度。 然而,日立设法用一半的尺寸来适应它的ISA。 这种格式不仅减少了程序的大小,而且由于CPU以32位批量获取指令,可以在一个周期内检索到两条指令。 总的来说,这种压缩指令集的技术有助于解决基于RISC的体系结构的一个常见问题,称为“代码密度”,后者则需要更多的指令(当然,更多的内存)来执行与非RISC系统相同的任务。
分支
与之相反,RISC设计的其他缺点在SuperH中仍然存在,例如控制危害。 因此,程序需要包含分支延迟槽以避免计算错误。 为了解决问题,SuperH具有延迟分支指令,这些分支指令预装有延迟槽[3]。
数据危害也存在,但程序员或编译器没有解决,CPU会在需要时自动停止管道处理。
世嘉不满意
然而,所有这些都没有阻止世嘉对最终产品表示不满。 这主要是由于16位乘法器较小,这在处理大量数据时被视为瓶颈(3D游戏的新需求)。 因此,日立将第二个修订版与扩展的乘法器单元和世嘉清单[4] 上的其他要求相结合,从而产生了一个名为SH-2的新CPU。
即便如此,世嘉在听到其竞争对手选择的CPU后还是坐不住了。 因此,世嘉要求日立提高SH-2的时钟频率——一旦芯片已经投入生产,这就是一项不可能完成的任务。 幸运的是,日立还有另一个锦囊妙计:多处理器。 在SH的研究阶段,该团队添加了最小电路,以允许SH同时与同一系统内的其他SH一起工作。 听到这个消息后,世嘉决定为世嘉土星采用双芯片的配置。 其余就是些老黄历了。
最终产品
说完了来历,我们再来看看出货的产品。
这款游戏机采用了不是一个而是两个日立 SH-2的CPU,每个CPU运行在~28.63 MHz的频率 [5]。 虽然两者在物理上相同,不过它们被设置成主从状态,其中第一个可以向第二个发送命令。 这可以实现一定程度的并行性,尽管两者共享相同的外部总线[6](这可能导致拥塞)。
日立包装了SH-2的不同变体,并将它们作为“SH7600”系列的一部分出售。 具备所有这些特性[7]:
- 前述的五级流水线和SuperH ISA。 后者已经扩展了六个额外的专门分支和算术指令。
- 升级后的32位乘法单元,现在使用32位整数执行乘法。
- 在两个CPU之间共享的32位外部数据总线。
为该游戏机选择的特定芯片“SH7604”包含以下附加内容[8]:
- 4 KB缓存:存储以前从内存中获取的少量指令和数据,用以加快未来的读取速度。
- 32位除法单元:使用32位整数执行除法。
- 内部DMA控制器:无需CPU干预即可从内存中传输数据。
- 支持Little endian(小端模式),使 CPU 能够理解以相反顺序编码的值。 当外部内存与其他处理器共享时,这将很有用。
值得指出的是,拥有两个CPU并不意味着游戏的运行速度会提高一倍!而且在实际情况中,需要非常复杂的编程来有效地管理共享同一总线的CPU。 因此,如何有序使用缓存在这款游戏机中也起着关键性的作用。
分裂的内存选择
世嘉土星总共包含2 MB的RAM用于通用用途,称为工作RAM(WRAM)。 现在,这两兆被分成两个非常不同的块:
- 第一个提供1 MB的SDRAM,由于其快速访问速率,该块也称为“WRAM-H”。
- 另一个区块包含剩下的那一兆字节,但它被称为 ‘WRAM-L’,因为它使用的是 DRAM(动态随机存取存储器),从而导致较低的数据速率。
第三个处理器(甚至更多)
令人惊讶的是,这两个SH-2 CPU似乎对世嘉来说还不够。 因此,为了加速矢量处理(以更复杂为代价),游戏机还容纳了一个额外的协处理器,即土星控制单元或“SCU”。
这是一个由两个模块组成的芯片[9]:
- DMA控制器:在三个主要总线之间仲裁对 WRAM 的访问,无需 CPU 干预。
- DSP:用作定点“几何单元”。 与SH-2相比,它可以更快地进行矩阵/向量计算,例如3D转换和光照。 但是,它以半速运行,其指令集更复杂。 此外,它还依赖SH-2的WRAM来获取和存储数据(使用DMA)。
好的一面是,SCU带有32 KB的SRAM供自身使用。 不好的一面是,SCU无法访问WRAM-L。
图形
由于土星是本系列(译注:世嘉的行星计划)的第一个“3D游戏机”,让我们首先回顾一下新一代3D图形的基本设计变化:
- GPU现在依赖于帧缓冲区:不再需要动态渲染图形。 相对的,GPU保留一部分VRAM来绘制带有CPU请求的所有计算几何图形的位图,然后视频编码器拾取该区域并通过视频信号输出它。
- 因此,拥有这个预留的“工作空间”允许GPU即使在完成渲染场景后也能继续操纵位图,因此CPU现在可以将一些详尽的任务(如照明和反混淆现象)负载交给GPU完成。 这时,术语 图形渲染管线 开始变得越来越重要。
- 需要更多的VRAM:帧缓冲区的使用意味着内存需求的增加(这不再是一个大问题),帧缓冲区所需的RAM量与屏幕的尺寸和使用的颜色数量成正比。 例如,使用600 KB的VRAM,我们可以包含一个640x480像素宽的帧缓冲区,每个像素有32k种颜色(16 bpp)。
- 此外,程序员可以自由安排他们的 VRAM 使用方式:并非每个比特都必须分配给帧缓冲区,那么我们为何不也用它来缓存纹理、同时渲染其他帧缓冲区并添加颜色查找表以加快处理速度呢?
- 该 CPU 集成了 向量运算:一个具备 3D 功能的 GPU 如果没有一个能够提供所需几何数据的适当 CPU 支持将是不完整的。 为此,下一代 CPU 包含了一种专门用于加速向量计算的指令形式,这些被称为 单指令多数据 或 ‘SIMD’ 扩展。
- 而土星的实现是,矢量操作由土星控制单元(而不是SH-2 CPU)加速。
世嘉拿出来的东西
该游戏机包括两个专有GPU,每个GPU在同时工作时服务于不同的目的。 有些人可能会争辩说,新的GPU是经典VDP的演变,而另一些人可能会说这是完全重新设计…… 我认为两者都有点对。
说完了这些,我们再来看看两款芯片。
VDP1
视频显示处理器1(VDP1)是一款使用几何变换绘制精灵图的芯片[10]。 结果被写入帧缓冲区,帧缓冲区又被流式传输到VDP2进行显示。
该芯片通过向其发送“绘图命令”进行编程。 因此,为程序员提供了512 KB的专用RAM来存储这些绘图命令和所需的材料(纹理/图块、颜色查找表等)。
因此,VDP1 被设计为使用 四边形作为基本图元,这意味着它只能使用 4 顶点多边形(精灵图)来构成模型。 该芯片应用 正向纹理映射 将纹理点连接到四边形上,沿着那个方向。 它不附带任何滤波/插值技术,因此计算容易出现混淆现象。
VDP1还提供了以下效果选择:
- 两种 着色算法(平面和高洛德)用于光照效果。
- 抗锯齿:在这种情况下,它复制像素以覆盖映射期间的间隙。
- 裁剪用于丢弃相机视口外的多边形。
- 透明度混合两个非不透明位图。
两个256 KB帧缓冲芯片可用于同时绘制游戏的新场景,而不会破坏当前显示的场景。 当辅助缓冲区绘制完成时,VDP1(视频显示处理器1)开始广播这个缓冲区,这一过程称为页面翻转。然后这个继续循环进行。
VDP2
视频显示处理器2(VDP2)专门渲染大的(4096×4096像素)平面,并对其应用变换(旋转、缩放和平移)[11]。
更重要的是,VDP2的工作方式是在运行时即时渲染(没有帧缓冲区),就像之前的基于图块的引擎一样。 它可以显示多达1670万颜色(24位)。 该芯片还负责显示VDP1的缓冲区,也可以转换和/或与VDP2的层混合。 VDP2 的「画面」由最多四个 2D 平面和一个 3D 平面组成;或者两个 3D 平面。
这个芯片依赖于 图块地图来构成平面,并为 3D 纹理映射执行透视校正,这是一种更为复杂的方法,它考虑到深度值来计算旋转。
可用的效果包括多纹理(每个多边形映射多个纹理)和阴影。 对于后者,在VDP2接收到VDP1产生的精灵图后,它可以降低它们的亮度并将它们与半透明混合。 尽管如此,VDP2仅从VDP1接收精灵图流(与CRT光束同步),因此此功能在编码和操作上往往很棘手。
该芯片还包含4 KB的颜色RAM(CRAM),用于将VDP1的自定义颜色值(索引颜色)转换为24位RGB颜色。
最后,即使VDP2仅限于两个3D平面,也没有什么可以阻止CPU使用其VRAM作为帧缓冲区在软件中绘制额外的2D或3D图形。
如果本节引起您的注意,我建议您查看来源(在文章末尾),因为VDP有更多超出本文范围的怪癖。
明确问题
正如你所见,图形子系统的架构相当复杂,因此根据不同的需求会有不同的解释:
作为强大的2D游戏机
与Mega Drive或SNES相比,土星绘制2D场景的能力是巨大的,尽管这并不是这款游戏机的主要卖点。
作为具有挑战性的3D游戏机
这才是土星同时闪耀和挣扎的地方。 虽然这个游戏机有八个处理器可以利用,但这一切都受制于:
- 程序员是否能够在短时间内掌握控制台的大部分功能(请记住,一旦其继任者发布,甚至宣布,游戏机的商业生命周期将结束)。
- 他们的游戏是否会在合理的日期范围内推出。
出于这个原因,大多数游戏最终在质量上差异很大,因为每个工作室都想出了自己独特的解决方案。
3D建模
没有纹理或背景的角色3D模型。 请注意用于构建模型的基本图元。
到目前为止,我们一直在使用单个正则四边形来形成精灵图和/或背景层。 但是如果我们将多个不规则图元分组并将它们排列成一个更复杂的图形呢? 这就是3D模型如何实现的。
简单来说,像超级任天堂这样的经典2D游戏机将它们的图形(背景和精灵图)排列在准矩形区域。 在某些情况下,例如使用Mode 7,程序员可以提供一个旋转矩阵来对其中一些区域应用转换。 相比之下,土星允许定义四边形的4点,边缘之间有任意角度(世嘉称之为“扭曲精灵图”)。 然后,VDP的纹理映射功能用纹理绘制四边形的区域,后者被缩放以符合多边形的形状。
就3D游戏所需的操作而言,CPU和SCU被分配来制定3D世界并将其投影到2D空间中。 然后,命令两个VDP渲染它,应用效果,最后在电视上播放。
新的设计
这些是为这个游戏机重新设计的角色的一些示例,模型是交互式的,所以请尝试调试它们!
线框 | 表面 | 纹理 |
点击启用交互功能 |
185四边形。
线框 | 表面 | 纹理 |
点击启用交互功能 |
254四边形。
虽然土星只能绘制四边形,但你很快就会注意到,在“线框”模式下,这些模型展示了两个三角形,而不是一个四边形。 这是因为用于编码此模型的格式(glTF,一种现代 3D 建模的开放标准)在撰写本文时,并不支持四边形,所以你的现代设备无法渲染它。 因此,我建议切换到“表面”模式来观察这些四边形。
从某种意义上说,这告诉了我们当今的图形技术在重现其约 30 年前的前辈时可能会遇到的困难!
可见性问题简介
当3D多边形投影到2D空间时,确定哪些多边形从相机位置可见,哪些是要隐藏的[12] 是一个至关重要的问题。 否则,模型将不能被正确地绘制,像透明这样的效果会显得“破损”,并且最终会浪费硬件资源。 这个过程被广泛称为可见表面确定或“VSD”,它是计算机图形学领域的一个基本问题。 有关这个问题已经有很多发表了的论文,描述了在图形管道的不同阶段解决这个问题的算法。 其中一些给出了非常准确的结果,而另一些则以精度换取更好的性能。
不过,与学术/专业设备不同,消费硬件非常有限,因此算法的选择范围缩小到只有几个…或者什么都没有。
该引擎放弃了Z-sor,转而采用二进制空间分区(BSP)方法,修复了故障。
我认为世嘉土星的方法是一个“半解决”的案例。 VDP1没有实现任何VSD功能:你必须按照正确的顺序输入几何数据,否则就会得到一团乱麻的结果。 然而,世嘉提供了一个名为“SGL”的图形库,该库实现了一个名为Z轴排序或画家算法[14] 的解决方案,该解决方案通过软件执行多边形排序。
本质上,SGL分配一个缓冲区来根据与相机的距离(从最远到最近)对多边形进行排序,然后按该顺序向VDP1发出显示命令。
使用3D空间进行Z轴排序的问题之一是其距离值(Z轴顺序)是近似的,因此仍然可能出现图形故障。 为此,程序员可以跳过SGL,转而实现自己的算法。
在后面的文章中,您将看到替代方法。 有些仍然依赖软件,而有些则由硬件加速。
透明度问题
世嘉土星能够绘制半透明图形,换句话说,混合重叠的颜色层(混合),给我们一种可以看穿它们的错觉。 不幸的是,两个VDP并不像人们期望的那样协调,因此当在不同的VDP中发现这些层时,这种效果将无法正常工作。
作为一种解决方法,游戏可以激活纹理上的“网格”属性。 使用“网格”纹理,VDP1将奇数X/Y纹理坐标设置为“透明”(空)。 使得使用透明像素混合其他层成为可能。 奇怪的是,如果游戏机使用复合视频信号(当时除了射频之外,这几乎是标准)连接到电视上,网格会显得模糊不清,从而导致一种偶然但有效的方式来实现半透明[15]。
正如你怀疑的那样,这对一些游戏来说是不起效的,所以最终,这些游戏别无选择,只能完全放弃半透明… 虽然一些工作室发现了巧妙的修复手段,可以看看这两个案例:
除了我糟糕的游戏技巧之外,你会注意到第一个游戏的背景是从无到有突然出现的(没有半透明效果),而第二个游戏不仅实现了半透明,还实现了渐隐效果:Traveller’s Tales找到了一个解决方法,通过改变VDP2的“混合比例”寄存器(用于定义纹理的alpha值)并结合随着角色靠近时切换光照级别[16]。
音频
声音子系统由几个部分组成[17]:
- Motorola 68EC000:控制其他组件和与主CPU的接口。 它运行声音驱动程序来操作相邻组件。
- 土星自定义声音处理器(SCSP):也称为雅马哈YMF292,它由两个模块组成:
- 多功能声音发生器:处理多达32个通道,具有PCM采样(高达16位,44.1 kHz,又名“CD质量”)或FM通道。 在后者的案例中,预留了一定数量的通道供操作者使用。
- ADSP:应用如回声、混响和合唱等效果。 文档中也提到了“滤波器”,但我不知道这里指的是包络滤波器还是频率滤波器(例如低通滤波器等)。
- 512 KB的RAM:存储驱动程序、音频数据(即 PCM采样),它也是DSP的工作区域。
机会
新的音频能力意味着工作室终于可以在内部录制/制作音轨,然后直接将其打包进游戏中,而无需重新编排(就像以前受限于音序器或是有着严格合成方法的芯片时所发生的情况)。
这要归功于许多因素的结合:
- 新的游戏存储介质(CD-ROM)使开发人员能够存储大型音轨。
- 音频端点接收并混合质量可接受的PCM数据。
- 音频子系统提供足够的功率和带宽以某种压缩形式流式传输PCM数据,然后即时解码。
操作系统
用户开启游戏机电源后,首先启动的组件是系统管理和外设控制(SMPC),这是一个4位微控制器,负责初始化相邻的芯片(例如开启两个SH-2并设置它们为主从配置)[18]。
之后,主SH-2的重置向量设置为0x00000000
[19],它指向包含初始程序加载器(IPL)的内部ROM。 该程序执行以下功能[20]:
- 完成硬件初始化。
- 如果有卡带插入并且其中包含程序,则继续从那里启动。
- 如果插入了“视频CD”卡,就直接引导
- 如果插入了光盘,先检查它是否是正版。
- 同时,它显示启动画面动画。
- 如果光盘是正版的,启动游戏。
- 如果光盘不是正版的或没有插入光盘,跳转到主交互界面。
交互界面
除了玩游戏之外,Saturn还包括了一个名为“多玩家”的音乐播放器,从中可以打开一个存档管理器。
如果插入了Video CD卡,播放器可以再现从卡本身解码的MPEG视频。
没有BIOS?
与PlayStation不同,其ROM芯片捆绑了BIOS,这反过来又暴露了API供程序员使用。 土星的ROM通常被称为“IPL”,大概是因为它的主要工作是引导游戏并运行主界面。 但是,后者仍然存储一些例程(称为服务)来操作硬件(例如管理保存数据和电源控制)。 它甚至实现了一个“信号量”! (用于同步同时涉及多个处理器的操作)。 因此,ROM的那一部分称为系统程序。
游戏
官方世嘉土星游戏从2x CD-ROM驱动器加载。 它的介质光盘(CD)容量为680 MB,世嘉土星游戏遵循ISO 9660存储数据的标准[21]。 此外,许多游戏将音轨存储在数据轨道旁边,以便在执行游戏时流式传输未压缩的音频。
光盘(CD)
CD是一种光学介质,在其聚碳酸酯表面上通过刻录凹坑和平地来存储信息[22]。 然后,读取器发出红外光,CD表面产生的反射用于读取信息。
将数字信息(1和0)转换为凹坑和平地,反之亦然,这一过程无论如何都不简单,特别是要求光盘必须足够坚固,能够承受日常损坏和密集使用;并且足够可靠,能够存储任何类型的信息,而不必担心数据丢失。 因此,根据其规范,数据采用非归零反相(NRZi)模型进行编码,这意味着比特流将全部是零,直到检测到从平地到凹坑或从凹坑到平地的变化,此时会附加一个1
。
这种设计在读取器遇到一串连续的1(连续的凹坑和平地变化)或长串的0(恒定的凹坑或平地)时仍能良好工作,但在这些情况下,传感器会难以检测或保持同步。 因此,又采用了另一种称为八到十四(ETF)调制的附加模型。 有了这个,在编码之间填充了几个零,这些零在读取过程中有助于传感器读取。
除此之外,还可以添加进一步的错误检测机制,尽管这些超出了本文的范围。 如果您有兴趣了解更多信息,您可以查看亚琛工业大学[23] 的幻灯片演示。
开发
起初,世嘉没有提供完整的软件库和开发工具(事实上,最初的文档还是不准确的),所以获得良好性能的唯一方法是通过苛刻的汇编。
后来,世嘉发布了完整的SDK、硬件套件和一些库,以简化I/O和图形操作。 总体而言,游戏是用C和针对单个组件的各种程序集的混合编写的。
I/O
外设管理和实时时钟也是由上述的系统管理和外设控制(SMPC)提供的。 SMPC由SH-2发送的命令控制。
扩展方法
这款游戏机捆绑了大量的外部连接器和接口,但这些连接器和接口最多只得到了少量的应用。
- 驱动器后面有一个卡槽正式用于额外存储(保存数据)或额外RAM。 在日本和美国,还提供调制解调器以提供联网功能。
- 在游戏机的背面,有一个用于Video CD Card的插槽,用于为支持它的程序/游戏执行MPEG解压缩。
- 最后,游戏机后面有一个神秘的接口,被称为通信连接器。 世嘉并没有为开发人员发布任何文档,但经过一些逆向工程的努力,人们发现它连接到SCSP的MIDI引脚和两个SH-2的串行接口(SCI)[24]。 而且,世嘉还发布了依赖于此接口的软盘驱动器(译注:不愧是日本)。
反盗版和自制软件
为了应对复制光盘的便利性,土星增加了一个复制保护系统(以及区域锁定)来控制游戏的分发。
光盘上的复制保护是通过刻录传统刻录机够不到的特殊数据(称为“系统区域”)来实现的,如果找不到够不到的数据或数据无效,土星拒绝将光盘作为“游戏光盘”启动。 光驱还包含一个自定义SH-1处理器,该处理器使用模糊协议与游戏机的其余部分交互。
值得一提的是,由于土星CD遵循ISO9660(CD数据的标准文件系统),PC可以毫无问题地读取游戏光盘(但是,当然,除非使用模拟器,否则它们无法执行游戏)。
击败
首先,用于禁用复制保护的经典方法包括安装一个自制芯片,当插入刻录光盘时,它可以欺骗CD光驱。 还有一个“换盘大法”,就是在保护检查通过后立即用烧录的光盘热替换正版光盘……但这有可能会损坏光驱!
世纪之交之后,发现了用于运行未经授权代码的替代但更复杂的方法,例如:
- 在复制保护机制中发现了一个漏洞利用,它允许在不通过复制保护检查的情况下启动任何光盘游戏。 这随后以一种名为伪土星的卡带形式出现[25]。 由于使用了卡带介质,Action Replay卡带经常会用伪土星来进行重刷(尽管重刷器也需要以某种方式引导,最常见的就是通过换盘技巧)。
- 这种方法直到2022年仍在使用,不过现在安装的是名为”伪土星凯”的伪土星的一个新分支。
- 另一种方法是在2016年(几乎是20年后)被发现的,利用了视频CD附加组件可以向CD子系统注入未加密代码的事实(完全绕过了CD光驱)。 这最终允许用户独立于老化的光驱加载自制软件 Video CD漏洞利用在名为“Satiator”的产品中进行商业分发(顺便说一句,我没有赞助)。
- 最后,还有另一种商业替代方案,用SD或SATA适配器代替CD光驱。 土星仍然认为它在从光盘上读取,但是“光盘”正在被适配器模拟,适配器反过来又从光盘映像[26] 中读取。 这些产品称为光驱模拟器(ODE)。