3D图像的历史(1)——曾经被视为二流的DirectX
本系列我们讨论的主题是:为什么NVIDIA、AMD、Intel等不同的半导体制造商制造的GPU能呈现相似的游戏图形?
原作者:西川善司
从结论来说,这是因为业界制定了一种叫做可编程着色器架构的东西,根据这个架构可以编程GPU,然而,实际上在达到这个结论(即当前状态)之前,业界经历了各种各样的历史性斗争。 从这次开始,我想用几期的时间来从半导体、处理器和游戏引擎等方面来观察这些历史性的动向。
除了超级计算机和专业图形工作站,当今可供消费者使用的最先进的实时 3D 图形环境是高端个人计算机 (PC)。
然而,直到 20 世纪 90 年代上半叶,PC 的图形系统都相当落后,这在今天是不可想象的。在这个时代,计算机图形(CG)这个词已经家喻户晓,但即便如此,“家用PC”和“(3D)CG”的联系也还需要一段时间。
在这个时代,街机游戏是我们最熟悉的游戏,也是实现高级实时3D图形的游戏。
是的,就是街机游戏。
![](https://pic2.zhimg.com/v2-348a04b002a0b74abb6419d2be3230c9_r.jpg)
目前,很多街机游戏机都是基于主板上嵌入了Windows的PC,但在当时,每个街机游戏制造商都独立设计了3D图形系统的硬件,在上面运行自己的3D游戏图形。
当时还没有像今天的 GPU 这样物美价廉的“3D 图形专用硬件”,游戏厂商也没有开发专用芯片的预算,所以经常使用(其实是挪用)所谓的 DSP(Digital Signal Processor)。
根据使用目的的不同,DSP的用处也多种多样,但粗略地说,DSP 是一种“专门执行高速信号处理的处理器”。
另一方面,当谈到“CPU的数据处理”时,图像是随着程序的运行,将存储在待处理内存区域中的数据按顺序进行处理。
然而,DSP在概念上恰恰相反。
预先设定一个“小巧”的程序,然后像传送带式地持续输入数据,经过这个程序的处理,处理结果将会不断地输出......可以这么想象。
DSP擅长针对大量数据进行特定计算,尽管参数可能有所不同。
如果大量的数据是“多边形顶点数据”,执行的程序是“几何计算”,就可以进行类似于现在GPU的处理。当时安装在街机游戏系统板上的许多 3D 图形硬件都有这种起源。
当时,技术最先进的公司是南梦宫(现万代南梦宫娱乐)和世嘉。
在这个时代的3D图形系统中,CPU、支持它的协处理器以及前面提到的DSP主要负责图形渲染,而lighting(光照计算)只是对每个多边形进行,而texture mapping是没有的任何功能。
正是在 Namco 的《山脊赛车》(1993) 出现在街机中时,纹理映射才被用于 3D 游戏图形,并开始为普通用户广泛使用。
![](https://pic3.zhimg.com/v2-8f454542d0729843ac26d7c8d54f9bbe_r.jpg)
街机版《山脊赛车》是一款让纹理贴图的威力为世人所知的作品。当时,该作品中使用发光阴影是一个热门话题,但实际上它似乎只是烘焙到纹理中的渐变阴影。游戏的系统板被称为“System 22”。负责图形绘制的处理器是用于几何处理的TI DSP“TMS320C25”,负责纹理映射的是Evans & Sutherland的“TR3”。绘图性能为每秒 240,000 个多边形。
在那之前,当谈到游戏的 3D 图形时,主流的表达方式是描述积木一样的 3D 物体可能会是什么,玩家可以说,“这是一辆汽车”,“这是一个人''等等。我发挥了一定的想象力,并乐于识别游戏中的屏幕画面是什么。
但到了《山脊赛车》,3D物体可以自由移动且成为了一个真正的物体而非机械的积木块,这对许多游戏迷来说是一种文化冲击。
在 20 世纪 90 年代中期,发生了一件让 3D 游戏迷更加熟悉的大事,就是 PlayStation 和 Sega Saturn 的发布。
![](https://pic4.zhimg.com/v2-ee368ef737d5fdfecaaa4399a390bcff_b.jpg)
![](https://pic1.zhimg.com/v2-9c6a58abe0c12644755c7771e83d2dac_b.jpg)
这两款1994年发布的游戏机,图像分辨率都不是很高,但它们不仅支持当时街机游戏系统最先进的纹理贴图技术,还可以实现相邻多边形的匹配。还支持“Gouraud shading”方法,用渐变来绘制颜色的阴影。
一年后,也就是1995年,Windows 95发布,与此同步,提供了“DirectX”(确切地说是DirectX中包含的Direct3D)作为在PC上实现3D图形的子系统。但是,用于Windows PC的3D图形硬件当时功能还很低,DirectX还没有完成,所以直到DirectX 5发布才接近PlayStation和Saturn的表现力,一直持续到1997年左右。
不过当时的3D图形硬件厂商对PC的热情是巨大的,现在看来Intel是跟在两个最强的NVIDIA和AMD(当时的ATI)之后,但其实当时有几十家厂商都发布了自己的3D用于 PC 的图形硬件产品。
其中,开创了新纪元的3dfx在1995年前后推出了一款名为“Voodoo”系列的3D图形硬件产品,在当时的PC游戏迷中极为流行。
![](https://pic2.zhimg.com/v2-08577cd2a0139b018edbe24b1a15ac3d_r.jpg)
现在想想真是不可思议,但为了使用 Voodoo 系列绘制精美的 3D 游戏图形,必须使用 3dfx 自己的 API“Glide”而不是 DirectX。
当时,从最初的Voodoo(1995)到第二代Voodoo2(1998),DirectX在PC游戏界都是“二流”。因此,游戏开发工作室通常会提供基于 Glide 的顶级图形游戏。
至今仍被称为热门系列的《古墓丽影》第一部就是一个典型的例子,起初在PC上,只有Voodoo系列才能享受到精美的游戏画面。
![](https://pic3.zhimg.com/v2-eed63e7672dd1834fddfad6460582376_r.jpg)
也就是说,被视为“失败者”的DirectX(Direct3D)在1999年宣布DirectX 7后迎来了转折点。
生活在现代的我们很难相信,在1998年之前的DirectX 6时代的3D图形硬件只负责计算多边形与像素之间的对应关系的“光栅化”处理,以及在绘制像素的同时将图像纹理贴合到多边形表面的“像素绘制”处理。
更令人惊讶的是,当时以基于多边形的坐标转换处理和基于多边形的光照处理为代表的所谓“几何处理”仍然由CPU处理。
因此,当时为了绘制出高质量的PC游戏画面,要求CPU的运算性能比现在更高。
在那个时候,流行的是CPU的“可以用一条指令对多个数据进行运算的SIMD扩展指令”。第一个支持 SIMD 扩展指令集“MMX”的 CPU 于 1997 年发布。第一个 CPU 是 Intel 的“MMX Pentium”,它开启了这种 SIMD 扩展指令的发展趋势。紧随其后,AMD推出了作为对手的MMX兼容CPU——“K6”。
![](https://pic1.zhimg.com/v2-33f5c65a3c5dfe15394a464d16f0c868_b.png)
事实上,MMX并不支持浮点数运算,而是支持专门针对整数运算的SIMD扩展指令。然而,在当时追求速度而非精度的游戏开发用途中,MMX被积极地应用。因为英特尔也积极地发布了相关资料并努力推广MMX,所以我认为当时的PC游戏爱好者把“MMX”当作一个大品牌来认识。
![](https://pic2.zhimg.com/v2-22176d318063fbe569d345a7f12f03d9_r.jpg)
当时的PC虽然其桌面画面分辨率已经与现代相差无几,很多时候是1600×1200像素,但是当涉及到3D游戏图形时,目标分辨率只有640×480到800×600像素左右。所以,分辨率相当粗糙。
出于这个原因,“速度比精度更重要”,在游戏中,为了加速几何处理,有时会使用固定小数点替代浮点小数点,积极利用MMX等技术。
值得一提的是,1998年,AMD发布了一种类似于浮点数版本MMX的技术——3DNow!,并将其应用于K6-2处理器。稍晚些时候,1999年,Intel也发布了与AMD类似的概念技术SSE,并将其应用于Pentium III处理器。
![](https://pic2.zhimg.com/v2-0f10a31a9f894c7930c283225c6f48e5_b.jpg)
![](https://pic2.zhimg.com/v2-648d1e8627b5db378b06056ea132ea1d_b.jpg)
然而,在PC游戏领域,3DNow!和SSE并没有出现像MMX这样的热潮。
这是因为 1999 年出现的 DirectX 7 提倡一种架构,让 3D 图形硬件来处理绘制 3D 图形的整个过程。 是的,CPU不再需要负责“几何处理”了。
如今,3D 图形硬件通常被称为“GPU”,但大约在 1999 年这个名称被提出并开始流行起来。
第一个兼容 DirectX 7 的 GPU 是“GeForce 256”,它是 NVIDIA 在 1999 年发布的第一个 GeForce 品牌产品。稍晚些时候的 2000 年,ATI(目前并入 AMD)发布了第一款“RADEON”。也正是从这个时机,出现了目前两大GPU品牌。
![](https://pic3.zhimg.com/v2-80dcc719bdbf8b9e6a8788695735b97e_r.jpg)
现在说点题外话。当时,与NVIDIA势均力敌的ATI不喜欢“GPU”这个词,提出了关键词“VPU”(Visual Processing Unit)。 “VPU”这个名字是和3DLabs一起推广的,3DLabs现在已经死了,还制作了Permedia系列等,结果没流传开来。
![](https://pic4.zhimg.com/v2-3d3216bb309f29b84024c2e1f27ed5eb_r.jpg)
直到那时,PC游戏图形的表现才与索尼的第一代PlayStation和Sega Saturn等家用游戏机相当。但从DirectX 7时代开始,越来越多具有吸引力的游戏开始超越了这些家用游戏机里的游戏。
当时,家用游戏机的标准玩法是在电视上进行,因此图像分辨率的极限为640×480像素。相比之下,从那时起,PC上可以以相当于现在所说的HD(High Definition)的1,024×768像素进行游戏,因此在分辨率方面已经超越了家用游戏机的体验。
![](https://pic1.zhimg.com/v2-2826e4db29b278f75df031e092567914_r.jpg)
说回家用游戏机,世嘉Dreamcast于1998年发布,索尼的PS2于2000年发布。 PC 的 3D 图形技术似乎在这个时候赶上了同时代的家用视频游戏机。
![](https://pic4.zhimg.com/v2-8b17b02580f11851939d5093829717bf_r.jpg)
![](https://pic2.zhimg.com/v2-ecf82560733e4f4d6804814f4ced7535_r.jpg)
在家庭游戏机的3D图形技术以5到7年的周期发展的同时,面向PC的GPU每年都在进化。从那时起,PC游戏的3D图形技术经历了疾风骤雨般的进步。
然而,在这个进化过程中,也开始出现了一些“问题”。其中一个问题就是兼容性。
即使某个制造商在自家GPU上搭载了“迷人的图形表现功能”,但这种功能在其他制造商的GPU上可能无法再现,这已经是司空见惯的事情。如果费尽心思制作出的真实表现只能在特定制造商的GPU上重现,那么游戏开发方面就会只使用可以在任何GPU上重现的“最低限度的图形表现”来制作游戏图形。
此外,如果各个GPU制造商继续任意地扩展新功能,那么“没人会用的功能”将不断繁衍在图形子系统中。
出于对这种情况的担忧,业界提议了一种新技术——“可编程着色器”架构,它不是直接在硬件上执行新的图形技术,而是以“可在GPU上运行的软件”的形式来实现。
![](https://pic4.zhimg.com/v2-b2b843389aaa081e47c6e6b278c07b4b_r.jpg)
现在的PC和智能手机能够实现各种用途和功能,这归功于它们可以在设备上运行应用程序(应用软件)。过去,为了创建文档而设计的专用计算机“文字处理器”(ワープロ)曾经大受欢迎,但现在已经完全消失了。这是因为现在任何PC都可以运行文字处理软件。
基于这样的概念,“可编程着色器”架构使得可以编程实现诸如“微妙的凹凸表现”、“模拟人体肌肤质感”和“展示液体湿润质感”等多样化的图形表现,并进一步使其“可执行”。
是的,Programmable意味着“可编程”。着色器(Shader)字面上的意思是“掌管阴影的东西”,但在本文中,我们都将其理解为“图形表现”。
顺便说一下,现在可编程着色器的概念已经应用于PC、游戏机,甚至智能手机。
因此,我们现在看到的几乎所有现行3D游戏图形表现都是通过GPU执行的“着色器程序”实现的。
下次我们将探讨这个可编程着色器技术所迎来的激进变革时代。那场AMD与NVIDIA之间的“没有正义的战斗”将随着可编程着色器时代的开启而愈发激烈。