由于土星是本系列(译注:世嘉的行星计划)的第一个"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)是一款使用几何变换绘制精灵图的芯片。 结果被写入帧缓冲区,帧缓冲区又被流式传输到VDP2进行显示。
该芯片通过向其发送"绘图命令"进行编程。 因此,为程序员提供了512 KB的专用RAM来存储这些绘图命令和所需的材料(纹理/图块、颜色查找表等)。
因此,VDP1 被设计为使用 四边形作为基本图元,这意味着它只能使用 4 顶点多边形(精灵图)来构成模型。 该芯片应用 正向纹理映射 将纹理点连接到四边形上,沿着那个方向。 它不附带任何滤波/插值技术,因此计算容易出现混淆现象。
VDP1还提供了以下效果选择:
- 两种 着色算法(平面和高洛德)用于光照效果。
- 抗锯齿:在这种情况下,它复制像素以覆盖映射期间的间隙。
- 裁剪用于丢弃相机视口外的多边形。
- 透明度混合两个非不透明位图。
两个256 KB帧缓冲芯片可用于同时绘制游戏的新场景,而不会破坏当前显示的场景。 当辅助缓冲区绘制完成时,VDP1(视频显示处理器1)开始广播这个缓冲区,这一过程称为页面翻转。然后这个继续循环进行。
VDP2
视频显示处理器2(VDP2)专门渲染大的(4096×4096像素)平面,并对其应用变换(旋转、缩放和平移)。
更重要的是,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场景的能力是巨大的,尽管这并不是这款游戏机的主要卖点。
精灵图
在这种情况下,VDP1的任务是绘制传统精图灵,而不应用任何3D失真。
CPU通过写入其寄存器并用命令和图块填充其VRAM来设置VDP1。 由于DMA控制器,该过程也可以加速。
背景
洛克人 X4 (1997)。 VDP2的背景平面。然后指示VDP2绘制背景平面。 这些与精灵图层一起自动混合以形成全彩色场景。
命令部分与VDP1基本相似:程序员有寄存器和VRAM进行相应的设置。
VDP2的一些功能可以用来创建更逼真的风景,例如缩放以模拟热浪(参见"2D平面2")。
结果
没有太多神秘之处,VDP2负责将处理后的信号发送到视频编码器的最后一步。
VDP2与CRT光束同步运行,这意味着它的计算对应于将在下一条扫描线上显示的像素。
作为具有挑战性的3D游戏机
这才是土星同时闪耀和挣扎的地方。 虽然这个游戏机有八个处理器可以利用,但这一切都受制于:
- 程序员是否能够在短时间内掌握控制台的大部分功能(请记住,一旦其继任者发布,甚至宣布,游戏机的商业生命周期将结束)。
- 他们的游戏是否会在合理的日期范围内推出。
出于这个原因,大多数游戏最终在质量上差异很大,因为每个工作室都想出了自己独特的解决方案。
3D建模

Vr战士 Remix(1995)。
没有纹理或背景的角色3D模型。 请注意用于构建模型的基本图元。
到目前为止,我们一直在使用单个正则四边形来形成精灵图和/或背景层。 但是如果我们将多个不规则图元分组并将它们排列成一个更复杂的图形呢? 这就是3D模型如何实现的。
简单来说,像超级任天堂这样的经典2D游戏机将它们的图形(背景和精灵图)排列在准矩形区域。 在某些情况下,例如使用Mode 7,程序员可以提供一个旋转矩阵来对其中一些区域应用转换。 相比之下,土星允许定义四边形的4点,边缘之间有任意角度(世嘉称之为"扭曲精灵图")。 然后,VDP的纹理映射功能用纹理绘制四边形的区域,后者被缩放以符合多边形的形状。
就3D游戏所需的操作而言,CPU和SCU被分配来制定3D世界并将其投影到2D空间中。 然后,命令两个VDP渲染它,应用效果,最后在电视上播放。
像素处理

Vr战士 Remix(1995)。
使用3D模型和背景渲染场景。
VDP可以绘制这个新的(投影的)3D空间并标记纹理和效果。 现在,每个游戏中"负责"的芯片各不相同。
一些人优先考虑VDP1来绘制最近的多边形,并让VDP2处理远处的风景,另一些人找到了有趣的变通方法来让VDP2绘制更接近的多边形(从而降低输入VDP1的几何数量负载)。 而挑战在于设计一个高效的引擎,它可以显示令人印象深刻的图形,同时还能保持可接受的帧率。
新的设计
这些是为这个游戏机重新设计的角色的一些示例,模型是交互式的,所以请尝试调试它们!

"现代版本"中可用的互动模型
索尼克在索尼克竞速(1997)。
185四边形。

"现代版本"中可用的互动模型
泰尔斯在索尼克竞速(1997)。
254四边形。
虽然土星只能绘制四边形,但你很快就会注意到,在"线框"模式下,这些模型展示了两个三角形,而不是一个四边形。 这是因为用于编码此模型的格式(glTF,一种现代 3D 建模的开放标准)在撰写本文时,并不支持四边形,所以你的现代设备无法渲染它。 因此,我建议切换到"表面"模式来观察这些四边形。
从某种意义上说,这告诉了我们当今的图形技术在重现其约 30 年前的前辈时可能会遇到的困难!
可见性问题简介
当3D多边形投影到2D空间时,确定哪些多边形从相机位置可见,哪些是要隐藏的 是一个至关重要的问题。 否则,模型将不能被正确地绘制,像透明这样的效果会显得"破损",并且最终会浪费硬件资源。 这个过程被广泛称为可见表面确定或"VSD",它是计算机图形学领域的一个基本问题。 有关这个问题已经有很多发表了的论文,描述了在图形管道的不同阶段解决这个问题的算法。 其中一些给出了非常准确的结果,而另一些则以精度换取更好的性能。
不过,与学术/专业设备不同,消费硬件非常有限,因此算法的选择范围缩小到只有几个...或者什么都没有。

Project Z-Treme(2019,Homebrew)。
该引擎放弃了Z-sor,转而采用二进制空间分区(BSP)方法,修复了故障。
我认为世嘉土星的方法是一个"半解决"的案例。 VDP1没有实现任何VSD功能:你必须按照正确的顺序输入几何数据,否则就会得到一团乱麻的结果。 然而,世嘉提供了一个名为"SGL"的图形库,该库实现了一个名为Z轴排序或画家算法 的解决方案,该解决方案通过软件执行多边形排序。
本质上,SGL分配一个缓冲区来根据与相机的距离(从最远到最近)对多边形进行排序,然后按该顺序向VDP1发出显示命令。
使用3D空间进行Z轴排序的问题之一是其距离值(Z轴顺序)是近似的,因此仍然可能出现图形故障。 为此,程序员可以跳过SGL,转而实现自己的算法。
在后面的文章中,您将看到替代方法。 有些仍然依赖软件,而有些则由硬件加速。
透明度问题
世嘉土星能够绘制半透明图形,换句话说,混合重叠的颜色层(混合),给我们一种可以看穿它们的错觉。 不幸的是,两个VDP并不像人们期望的那样协调,因此当在不同的VDP中发现这些层时,这种效果将无法正常工作。
作为一种解决方法,游戏可以激活纹理上的"网格"属性。 使用"网格"纹理,VDP1将奇数X/Y纹理坐标设置为"透明"(空)。 使得使用透明像素混合其他层成为可能。 奇怪的是,如果游戏机使用复合视频信号(当时除了射频之外,这几乎是标准)连接到电视上,网格会显得模糊不清,从而导致一种偶然但有效的方式来实现半透明。
正如你怀疑的那样,这对一些游戏来说是不起效的,所以最终,这些游戏别无选择,只能完全放弃半透明... 虽然一些工作室发现了巧妙的修复手段,可以看看这两个案例:

Video - Traveller's Tales的索尼克竞速(1997).
除了我糟糕的游戏技巧之外,你会注意到第一个游戏的背景是从无到有突然出现的(没有半透明效果),而第二个游戏不仅实现了半透明,还实现了渐隐效果:Traveller's Tales找到了一个解决方法,通过改变VDP2的"混合比例"寄存器(用于定义纹理的alpha值)并结合随着角色靠近时切换光照级别。






