这是“ 90年代后期地震的3D卡开发成功”系列的第二篇文章。 在第一部分中,我们研究了1996年底的
RenditionVérité1000 ,以及一个名为vQuake的特殊游戏端口。 Rendition设法击败了Quake市场上的所有人。 在很短的时间内,它仍然是唯一能够通过硬件加速启动id软件大片的主板。
但这一切都在1997年1月发生了变化,当时id Software发布了新版本的Quake,称为GLQuake。 由于端口是使用miniGL(OpenGL 1.1标准的子集)创建的,因此任何硬件加速器制造商都可以编写miniGL驱动程序并参与3D卡竞赛。 从那时起,竞争的可能性向所有人开放。 目标是每秒生成尽可能多的帧。 奖励是客户的名利。 简要研究了历史,便可以了解到,当时的两个权威无疑将两个山峰的生产者视为国王。
到目前为止,毫无疑问:雷神之锤的世界由伏都教统治。 由于Quake统治着游戏世界,因此购买3Dfx Voodoo对于游戏玩家来说几乎是不可避免的。
-Tom's硬件,1997年11月30日
3DFX巫毒1
-所有其他卡的测量标准。
-John Carmack .plan文件。 1998年 2 月12日 [2]
仅查看说明
[ 50
]填充速率为50兆像素/秒的规格,我立即就想研究此卡并了解3dfx如何创建如此强大的产品。
3dfx互动
罗斯·史密斯(Ross Smith),斯科特·塞勒斯(Scott Sellers)和加里·塔罗利(Gary Tarolli)在SGI一起工作时相识
[4] 。 在Pellucid工作了一段时间后,他们试图出售IrisVision PC板(1994年,这种板的价格为每块4000美元),同事们在Gordy Campbell TechFarm的支持下创立了自己的公司。 3dfx Interactive成立于1994年,总部位于加利福尼亚州圣何塞。
最初,该公司打算为街机创建强大的硬件系统,但后来通过开发PC板改变了发展方向。 这有三个原因。
- RAM的价格相当低。
- 从FastPage RAM开始,然后从EDO RAM开始,RAM中的延迟减少了30%。 现在,内存可以高达50 MHz的频率工作。
- 3D(或伪3D)游戏变得越来越流行。 DOOM,Descent和Wing Commander III等游戏的成功表明,3D加速器市场即将出现。
该公司的创始人意识到,他们需要创建功能强大的产品,专为游戏设计,零售价在300-400美元之间。 1996年,该公司宣布创建SST1架构(以创始人-Sellers-Smith-Tarolli-1的名字命名),该架构很快就获得了多家OEM的许可,例如Diamond,Canopus,Innovision和ColorMAX。 对于他们的创造,提出了市场名称“ Voodoo1”,强调了其神奇的性能。
与V1000一样,制造卡时,制造商只能更改所选的RAM类型(EDO或DRAM),板的颜色以及芯片的物理布局。 几乎所有其他内容都已标准化。
Diamond Monster 3D,图片取自vgamuseum.info。Canopus Pure3D,图像取自vgamuseum.info。BIOSTAR Venus 3D,图片取自vgamuseum.info。ORCHID正义3D,图像取自vgamuseum.info。在查看SST1板时,它与竞争对手Rendition Verite 1000和NVidia NV1的差异非常明显。
首先,3dfx迈出了大胆的一步,放弃了2D渲染的支持。 Voodoo1有两个VGA端口,一个用作输出,另一个用作输入。 该卡是作为附加产品开发的,它以已经安装在计算机中的二维VGA卡的输出为输入。 当用户使用操作系统(DOS或Windows)时,Voodoo1只是将信号从其VGA输入重定向到VGA输出。 切换到3D模式时,Voodoo1控制了VGA输出,并忽略了其VGA输入的信号。 某些主板具有在2D和3D模式之间切换时会发出咔嗒声的机械开关。 这一决定意味着该卡只能用于全屏渲染,没有“窗口”模式。
SST1的第二个值得注意的方面是它不是由一个CPU而是由两个不可编程的ASIC(专用集成电路,专用集成电路)制成的。 如果沿着轮胎轨道行走,您会看到标记为“ TMU”和“ FBI”的每个芯片都有自己的RAM。 在存储卡上,平均分配了4 MB的RAM:2 MB的TMU用于存储纹理,2 MB的FBI用于存储颜色缓冲区和z缓冲区,而值分别存储为16位RGBA和16位整数/半浮点数。 具有4 MB的存储卡,支持的分辨率最高为640x480(2个彩色缓冲区(640x480x2)用于双缓冲+ 1个深度缓冲区(640x480x2)= 1843200)。 带有4 MB FBI RAM的最新型号允许使用高达800x600的分辨率(2x800x600x2 + 800x600x2 = 288万)。
SST1渲染管道
规格中未对传送带进行详细描述。 根据我的解释,三角形的寿命包括五个阶段。
- 在计算机的主处理器(通常是奔腾)中创建并转换了一个三角形。 这样的操作包括与模型/投影空间的矩阵相乘,截断,顶点透视划分,切除齐次坐标以及变换视场。 在此过程结束时,仅保留屏幕空间的可见三角形(由于剪切,一个三角形可能变成两个)。
- 使用triangleCMD命令,将三角形通过PCI总线传输到帧缓冲区接口(FBI)。 它们将转换为由纹理映射单元创建的栅格字符串查询。 对于栅格线的每个元素(称为片段),如果开发人员需要双线性过滤,则TMU每像素最多执行四个搜索查询。 在TMU中也执行片段透视划分。
- TMU将片段作为纹理化的16位RGBA颜色值+ 16位z值发送给FBI。
- FBI在z缓冲区中执行片段测试,并将它们与专用RAM进行比较,该RAM存储RGBA值和帧缓冲区的z值。
- 最后,根据片段的颜色属性和在64个元素的雾化表中进行搜索,将光照应用于片段。 如果需要混合,FBI将生成的片段与颜色缓冲区中已有的片段合并。
有趣的事实:如果您是3D爱好者,您可能知道快速反向平方根代码,该代码因原始的Quake 3代码而闻名:
float Q_rsqrt(float number) { long i; float x2, y; const float threehalfs = 1.5f; x2 = number * 0.5f; y = number; i = * (long*) &y;
为了寻找
[5] ,软件的Q_rsqrt Rys来源联系了Gary Tarolli,后者说他在SGI中工作时仍在使用此代码。 因此可以假设SST1管道中也使用了它。
东西不匹配
熟悉传送带并了解每个组件(TMU,FBI,EDO RAM)的工作频率为50 MHz之后,我们可以了解到计算中存在某种错误,并且卡无法达到50兆像素/秒的速度。 这里必须解决两个问题。
首先,TMU必须读取四个纹理像素以执行双线性纹理过滤。 这意味着需要访问RAM的四个周期,这将导致TMU缺少数据,并且填充率为50/4 = 12.5兆像素/秒。
FBI级别还有另一个瓶颈。 如果启用了z缓冲区检查,则在写入或丢弃片段的传入z值之前,应将其与z缓冲区中已存在的z值进行比较。 如果测试成功,则必须记录该值。 这是RAM的两个操作,导致填充率降低了一半:50/2 = 25兆像素/秒。
四路交织TMU
SST1规范中提到了TMU阶段的四个样本问题的解决方案。
完全交织在纹理存储数据路径中实现,它允许单个存储体访问数据,而不管用于访问其他存储体中数据的地址如何。
-规格SST1
它不指示总线是使用地址多路复用还是公共数据和地址总线。 如果您不进行多路复用和分隔就将它们绘制出来,则更容易弄清楚。
无论细节如何,TMU体系结构都允许每个周期接收4 x 16位纹理像素。 如果输入数据到达正确的频率,则TMU可以按w进行分片除法,然后生成分片的z值(16位)和分片的颜色(16位),然后将其传输到FBI。
双向交错FBI
在规范中也没有描述在FBI阶段对两个RAM访问操作的解决方案。 但是,该文档提到由于使用glClear可以在每个周期记录两个像素,因此使用glClear可以达到100兆像素/ s的填充率,这使我们理解这里使用了双向隔行扫描。
FBI一次读取和写入两个像素(2 x 1像素,由16位彩色和16位z = 64位组成)。 为此,21位地址生成两个20位地址,其中最低有效位被丢弃,以便按顺序读取/写入两个像素。 由于在水平线中写入/读取所需的栅格线算法从左向右移动,因此一次读取两个序数像素效果很好。
64位总线TMU-> FBI
难题的最后一部分是64位FBI-TMU总线。 规范中几乎没有写任何关于它的内容,但是FBI消耗的数据可以理解它的行为。 由于FBI一次处理两个像素,因此可以合理地假设TMU不会尽快发送纹理像素,而是将它们组合为两个16位颜色+ 16位z值。
编程Voodoo1
在最低级别上,Voodoo1编程是使用内存映射寄存器完成的。 该API由数量惊人的少量命令组成,其中只有五个命令:TRIANGLECMD(具有固定点),FTRIANGLECMD(具有浮点),NOPCMD(无操作),FASTFILLCMD(缓冲区清除)和SWAPBUFFERCMD,与加载用于混合设置的数据寄存器有关, z测试,雾色下载等。 VRAM中的纹理加载是通过具有内存映射的8兆字节只写PCI RAM执行的。
(真实)Voodoo1编程
开发人员通过Glide API
[6]对Voodoo1进行了编程。 API设计逻辑受IRIS GL / OpenGL启发,它使用状态机和所有内容的前缀(仅使用“ gr”代替“ gl”,并且程序员需要控制VRAM,就像现在在Vulkan中所做的那样。)
#include <glide.h> void main( void ) { GrHwConfiguration hwconfig; grGlideInit(void); grSstSelect( 0 ); grSstQueryHardware(&hwconfig); grSstSelect(0); grSstWinOpen(null, GR_RESOLUTION_640x480, GR_REFRESH_60HZ, GR_COLORFORMAT_RGBA, GR_ORIGIN_LOWER_LEFT, 2, 0); grBufferClear(0, 0, 0); GrVertex A, B, C; ... // Init A, B, and C. guColorCombineFunction( GR_COLORCOMBINE_ITRGB ); grDrawTriangle(&A, &B, &C); grBufferSwap( 1 ); grGlideShutdown(); }
“标准” MiniGL
尽管MiniGL是OpenGL 1.1标准的子集,但从未为其发布规范。 MiniGL只是“ Quake使用的那些功能”。 通过为quake.exe二进制文件运行objdump,可以轻松构建“官方”列表。
$ objdump -p glquake.exe | grep“ gl”
glAlphaFunc glDepthMask glLoadIdentity glShadeModel
glBegin glDepthRange glLoadMatrixf glTexCoord2f
glBlendFunc glDisable glMatrixMode glTexEnvf
glClear glDrawBuffer glOrtho glTexImage2D
glClearColor glEnable glPolygonMode glTexParameterf
glColor3f glEnd glPopMatrix glTexSubImage2D
glColor3ubv glFinish glPushMatrix glTranslatef
glColor4f glFrustum glReadBuffer glVertex2f
glColor4fv glGetFloatv glReadPixels glVertex3f
glCullFace glGetString glRotatef glVertex3fv
glDepthFunc glHint glScalef glViewport
如果您最近开始学习OpenGL,那么您应该会对glColor3f,glTexCoord2f,glVertex3f,glTranslatef,glBegin和glEnd这样的函数名称感兴趣。 它们被用于称为“立即模式”的模式,其中顶点坐标,纹理坐标,矩阵操作和颜色一次由一个函数调用指示。
这就是“在那些日子里”由古洛德三角形构造和着色的方式的绘制方式。
void Render { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glBindTexture(GL_TEXTURE_2D, 1);
雷神之锤
理论上最大填充速度为50兆像素/秒,可以每秒提供近50帧,分辨率为640x480。 但是,由于Quake在每个表面上合并了两层纹理(一层用于颜色,另一层用于光照贴图),因此SST1必须在第二遍中将每个帧绘制两次,并进行附加混合。 结果,Quake在P166Mhz上以26 fps的速度运行。
通过在同一台机器上将分辨率降低到512x384,可以实现41 fps的流畅
[7] ,这在当时是任何竞争对手都无法提供的。
软件渲染
GLQUAKE VOODOO1
有趣的事实: SST1并不适合所有人。 有些人喜欢这些像素,并发现双线性过滤“模糊”。 其他人对伽玛校正的丧失感到恼火。
Glquake看起来很烂。 我认为有人可以对此进行争论,但让我们承认-它看起来很糟糕,尤其是在NVidia卡上。 在3dfx板上,一切都还不错...但是颜色仍然模糊。 在TNT2上,图片令人作呕; 她太黑暗阴郁了。
-@Frib,非官方Glquake和QW指南 [8]
3fdx Voodoo 2
如果我说1996年至1998年3dfx在市场上占主导地位,那将是轻描淡写。 在SST1之后,Voodoo
2技术得益于100 MHz EDO RAM,频率为90 MHz的ASIC,而不仅仅是一个,而是两个TMU,它们可以一次渲染多纹理Quake帧(颜色+照明)
[9] 。 这项技术是真正的怪物,甚至图形卡本身看起来也很豪华。
Voodoo
2的填充速度几乎翻了一番,达到90兆像素/秒。 Quake基准在Pentium II 266 MMX上飙升至惊人的80 fps(与Voodoo1相比为56 fps),实际上达到了游戏逻辑和监视器功能的极限。
Super Voodoo 2 12MB,图片取自vgamuseum.info。不幸的是,在1999年Voodoo3发行之后,3dfx的故事发生了急剧变化。 面对日益激烈的竞争,她开始努力开发自己的通用卡,并停止销售OEM技术。
过渡没有按预期完成,并且与NVidia的GeForce 256(能够提供硬件细分和照明功能)相比,Voodoo3的性能令人失望(奔腾在流水线中做了这部分)。
为了响应NVidia,3dfx取消了Voodoo4的开发,开始使用VSA-100(Voodoo可扩展架构)技术构建Voodoo5。 结果出乎意料:在发布“ Napalm”(卡的代号)后,它遇到了功能更强大的NVidia GeForce 2和ATI Radeon卡。 最后,2000年3月28日3dfx申请破产,并被NVidia收购。
对于90年代后期居住并乐于玩Voodoo1或Voodoo2的人们来说,3dfx仍然是具有里程碑意义的公司,象征着卓越。 她通过勇气,杰出的才能和辛勤工作成为应得的成功的颂歌。 谢谢你们!
参考文献
[1]资料来源:
RenditionVérité1000的故事[2]资料来源:
约翰·卡马克(John Carmack)。 1998年2月12日[3]来源:
SST-1,用于3D游戏加速的高性能图形引擎[4]资料来源:
3dfx口述历史面板[5]来源:
Quake3快速InvSqrt的起源()[6]来源:
Glide编程指南[7]资料来源:
使用Voodoo和Voodoo 2 3D卡比较GLQuake中的帧速率[8]资料来源:
Frib,非官方的地震和QW指南[9]来源:
用于3D游戏加速的VOODOO2 GRAPHICS高性能图形引擎