第一章:游戏显卡的黄金时代(1993-2006)
1993年,当黄仁勋(Jensen Huang)与克里斯·马拉科夫斯基(Chris Malachowsky)、柯蒂斯·普里em(Curtis Priem)在硅谷一家 Denny's 餐厅写下英伟达(NVIDIA)的商业计划时,他们或许并未意识到,这家公司将在未来三十年里彻底重塑计算产业的格局。彼时,个人电脑(PC)市场正从文本界面转向图形用户界面,而3D图形仍是一个小众领域,主要应用于专业工作站和街机游戏。微软(Microsoft)即将发布的 Windows 95 计划集成 DirectX 应用程序接口(API),旨在为Windows平台提供统一的3D图形支持,这一动向为第三方硬件厂商打开了机遇之门。然而,当时的3D加速卡市场已被 3dfx Interactive 的 Voodoo 系列和 ATI 的 Mach 系列主导,英伟达作为一家初创公司,资源有限,必须找到突破口。本章将追溯英伟达从1993年创立到2006年的关键历程,聚焦其如何通过技术创新与市场策略,在游戏显卡的黄金时代中脱颖而出,为日后AI帝国的构建奠定基础。我们将深入解析 RIVA 与 GeForce 系列的技术演进,揭示从固定功能管线(Fixed-Function Pipeline)到可编程着色器(Programmable Shader)的革命性转变,并通过经典游戏的渲染对比,直观展现硬件进步对视觉体验的飞跃。
---
早期探索与NV1的挫折(1993-1995)
英伟达的成立正值PC图形产业的混沌期。1993年,市场上主流的3D解决方案是独立的加速卡,但缺乏统一标准。3dfx 的 Voodoo 图形芯片凭借其强大的性能迅速占领街机和高档PC市场,而 ATI 则通过集成显卡方案在主流市场站稳脚跟。英伟达的首款产品 NV1(1994年发布)是一款集成了2D/3D图形、音频和ISA总线接口的多功能芯片。其设计理念是提供“一站式”多媒体解决方案,支持当时流行的二次曲面(Quadratic Surfaces)建模技术,这是一种由 SGI(Silicon Graphics)推广的3D表示方法,旨在用数学曲面减少多边形数量,提升渲染效率。
然而,NV1的结局是商业上的失败。根本原因在于微软在1995年发布 DirectX 1.0 时,选择了基于多边形(Polygon)的三角形网格作为标准3D表示,而非二次曲面。DirectX 成为Windows平台3D游戏的强制API,所有开发者必须适配。NV1对DirectX支持薄弱,且ISA总线带宽不足,难以满足3D纹理映射(Texture Mapping)的吞吐需求。更致命的是,英伟达在NV1上投入了大量资源,导致公司濒临破产,员工数从最初的数十人锐减至不足二十人。这段经历给了黄仁勋深刻的教训:在快速演进的硬件产业中,拥抱开放标准比坚持 proprietary 技术更为关键。英伟达必须彻底转向,全面支持DirectX,并在此基础上寻求性能差异化。
技术背景:3D图形加速的基本流程 在深入后续产品前,需理解3D渲染的核心步骤,即图形流水线(Graphics Pipeline)。传统固定功能管线包含以下阶段: 1. 顶点处理(Vertex Processing):将3D模型顶点从模型空间转换到屏幕空间,涉及模型变换、视图变换、投影变换。 2. 图元装配(Primitive Assembly):将顶点组装成几何图元,如三角形。 3. 光栅化(Rasterization):将矢量图形转换为像素片段(Fragment),决定哪些像素被三角形覆盖。 4. 像素处理(Pixel Processing):对每个片段进行着色、纹理应用、深度测试、混合等操作,最终输出帧缓冲区。
NV1的二次曲面需要在光栅化前进行曲面细分和 tessellation,计算开销大,且与DirectX的三角形流水线不兼容,这直接导致了其被淘汰。
---
RIVA系列:站稳脚跟的转折点(1996-1999)
在NV1失败后,英伟达进行了战略重组,将全部精力押注在支持DirectX的下一代产品上。1996年,RIVA 128(Reliable Image Vector Architecture)发布,这是英伟达首款真正意义上的3D加速GPU。RIVA 128支持 DirectX 5.0 和 OpenGL,拥有 4MB 或 8MB 的显存,核心频率为 100 MHz。其关键创新在于实现了硬件级的三角形设置(Triangle Setup)和光栅化,将CPU从繁重的3D计算中解放出来。相较于当时的竞争对手 S3 Virge(仍依赖CPU部分处理)和 ATI Rage Pro,RIVA 128在3DMark等基准测试中表现卓越,价格却更为亲民。
RIVA 128的成功并非仅靠性能。英伟达采取了“与巨人同行”的市场策略:积极与微软合作,确保驱动对DirectX新版本的及时支持;同时与戴尔(Dell)、康柏(Compaq)等OEM厂商建立紧密合作,将RIVA 128预装在主流消费PC中。这种“捆绑销售”模式迅速扩大了市场份额。1997年,英伟达推出 RIVA TNT(TXTxture eNginE),首次支持 24-bit 真彩色和 32MB 显存,并引入了双像素流水线(Dual Pixel Pipelines),渲染 throughput 翻倍。TNT 直接对标 3dfx 的 Voodoo2,虽在抗锯齿等特效上稍逊,但凭借更广泛的API支持和更低的功耗,赢得了大量主流用户。
技术解析:光栅化流程与纹理映射 以RIVA 128为例,其光栅化单元的工作流程可简化为:
- **边沿方程计算**:对于每个三角形,计算屏幕空间下的边沿方程 $Ax + By + C = 0$,用于判断像素中心是否在三角形内。
- **扫描转换**:沿三角形行扫描,生成片段列表。
- **属性插值**:对每个片段,根据重心坐标(Barycentric Coordinates)插值顶点属性(如颜色、纹理坐标)。若顶点颜色为 $C_1, C_2, C_3$,对应重心坐标 $(\alpha, \beta, \gamma)$,则片段颜色 $C = \alpha C_1 + \beta C_2 + \gamma C_3$。
- **纹理采样**:根据插值后的纹理坐标 $(u, v)$,从纹理内存中采样颜色值。RIVA 128支持双线性过滤(Bilinear Filtering),通过采样周围四个纹素并加权平均,减少锯齿。
纹理映射原理可通过下图直观理解: ```mermaid graph TD A[3D模型顶点] --> B[纹理坐标UV映射] B --> C[光栅化插值] C --> D[纹理采样] D --> E[像素着色输出] ``` 这一阶段,纹理过滤技术仍是基础,各向异性过滤(Anisotropic Filtering)尚未普及,导致斜向纹理容易出现模糊。
---
GeForce系列:GPU概念的诞生与可编程革命(1999-2001)
1999年8月,英伟达发布 GeForce 256,并首次提出 GPU(Graphics Processing Unit) 这一术语,标志着图形芯片从“加速卡”向独立处理器的质变。GeForce 256集成了 2200 万个晶体管(对比当时Pentium III的950万),核心频率 120 MHz,配备 32MB 或 64MB DDR显存。其核心创新是硬件级变换与光照(Hardware Transform & Lighting, T&L)。此前,T&L需由CPU完成,成为系统瓶颈;GeForce 256将顶点变换(将3D坐标投影到2D屏幕)和光照计算(计算顶点受光源影响后的颜色)移至芯片内,大幅减轻CPU负担,使游戏能呈现更复杂的场景和动态光照效果。
GeForce 256的技术规格在当时堪称豪华:
- 4条像素流水线,每条支持单纹理每周期。
- 硬件T&L单元,每秒可处理 1500 万三角形(Million Triangles/s)。
- 支持Cube Environment Mapping(立方环境映射),用于实时反射效果。
然而,真正的革命在2001年随 GeForce 3 到来。GeForce 3 引入了可编程顶点着色器(Programmable Vertex Shader) 和 可编程像素着色器(Programmable Pixel Shader),终结了固定功能管线的时代。在固定管线中,光照、纹理混合等效果由硬件预设的固定算法处理,开发者无法自定义;而可编程着色器允许开发者用类似汇编的语言编写自定义程序,运行在GPU的着色器核心上,实现无限可能的光影、材质和后期处理效果。GeForce 3 的像素着色器(代号“CineFX”)支持 1.1 版着色器模型(Shader Model 1.1),提供纹理地址运算、颜色运算的可编程控制,为后来著名的像素着色器语言(如HLSL、GLSL)铺平道路。
案例:《古墓丽影》与《孤岛惊魂》的渲染对比
- **《古墓丽影》(1996)**:运行在Voodoo显卡上,依赖固定管线,光照为简单的Gouraud着色(逐顶点光照插值),纹理分辨率低,无动态阴影。
- **《孤岛惊魂》(2004)**:运行在GeForce 6800 Ultra(支持Shader Model 3.0)上,使用可编程着色器实现法线贴图(Normal Mapping)、高动态范围光照(HDR)、软阴影等效果。同一场景中, Lara Croft 的皮肤质感、植被光影、水面反射均呈现电影级真实感。
下表对比了关键硬件世代的技术指标:
| 显卡型号 | 发布年份 | 核心创新 | 着色器模型 | 三角形吞吐量 (M tris/s) | 显存位宽 | |--------------|----------|---------------------------|------------|-------------------------|----------| | 3dfx Voodoo2 | 1998 | SLI多卡并行 | 无 | ~7 | 64-bit | | RIVA TNT2 | 1999 | 双像素管线 | 无 | ~10 | 128-bit | | GeForce 256 | 1999 | 硬件T&L | 无 | 15 | 128-bit | | GeForce 3 | 2001 | 可编程顶点/像素着色器 | 1.1 | 30 | 128-bit | | Radeon 9700 | 2002 | 可编程像素着色器 (SM2.0) | 2.0 | 70 | 256-bit |
---
市场竞争:击败3dfx、压制ATI的策略
英伟达在技术领先的同时,执行了精准的市场策略。与3dfx的竞争:3dfx的Voodoo系列虽在3D性能上领先,但仅支持3D加速,需额外2D显卡配合,且价格昂贵。英伟达的RIVA和GeForce系列均集成2D/3D/VGA,提供单卡解决方案,更受OEM和主流用户青睐。2000年,3dfx推出Voodoo 4/5,但采用昂贵的SLI多芯片方案,功耗和成本居高不下;而英伟达的GeForce 2 GTS以单芯片实现更高性能,迅速抢占市场。2000年底,3dfx申请破产,其资产被英伟达收购,包括SLI专利,这为日后英伟达重新启用SLI技术埋下伏笔。
与ATI的拉锯:ATI作为AMD的子公司,拥有强大的芯片组集成优势,并在2002年推出Radeon 9700 Pro,率先支持DirectX 9.0和Shader Model 2.0,一度性能领先。英伟达的反击是GeForce FX系列(2003),但初期因制程问题发热和功耗失控,口碑下滑。转折点出现在2004年的GeForce 6800系列,其“Curie”架构重新优化,支持完整的Shader Model 2.0a/3.0,并在《Doom 3》等游戏中表现优异。更重要的是,英伟达推出了统一驱动模型(Unified Driver Architecture),确保旧卡也能获得新API支持,延长了产品生命周期,增强了用户粘性。到2006年,英伟达在独立显卡市场份额超过60%,ATI虽技术不落下风,但供应链和资金实力不及,最终在2006年被AMD收购,改写了行业格局。
策略总结:
- **标准绑定**:深度参与DirectX和OpenGL标准制定,确保硬件与API同步演进。
- **生态建设**:推出NVIDIA GameWorks(早期为NVIDIA Developer Relations),向游戏开发者提供优化工具和SDK,使游戏针对NVIDIA硬件深度优化。
- **品牌营销**:通过“GeForce”品牌建立高性能形象,与电竞、游戏社区紧密结合。
---
技术深潜:GPU架构、光栅化与纹理映射原理
GPU基础架构
以GeForce 3为例,其核心“Kelvin”架构包含以下关键单元:
- **顶点处理器(Vertex Processor)**:执行可编程顶点着色器,处理顶点变换、蒙皮、动画。
- **光栅化器(Rasterizer)**:将三角形转换为片段。
- **像素着色器(Pixel Shader)**:执行可编程片段程序,实现纹理混合、光照计算。
- **纹理单元(TMU)**:负责纹理地址计算和滤波。
数据流为:顶点数据 → 顶点着色器 → 图元装配 → 光栅化 → 像素着色器 → 纹理采样 → 输出合并(ROP, Render Output Unit)。
光栅化流程详解
光栅化的目标是将三角形覆盖的像素转换为片段。过程包括: 1. 三角形遍历(Triangle Traversal):使用边沿函数判断像素中心是否在三角形内。对于三角形顶点 $V_0, V_1, V_2$,边沿方程可写为: $$E_{01}(x,y) = (y_0 - y_1)x + (x_1 - x_0)y + x_0 y_1 - x_1 y_0$$ 若 $E_{01}(x,y) \geq 0$,则点在边 $V_0V_1$ 的右侧(假设三角形顶点顺序为顺时针)。 2. 深度插值与测试:对每个片段,根据重心坐标插值深度值 $z = \alpha z_0 + \beta z_1 + \gamma z_2$,与深度缓冲区(Z-Buffer)比较,决定是否可见。 3. 模板测试与混合:通过模板缓冲区实现镜面、阴影等效果;混合阶段将片段颜色与帧缓冲区原有颜色按alpha值混合。
纹理映射原理
纹理映射将2D图像贴到3D表面。关键步骤:
- **纹理坐标(UV)变换**:模型空间UV通过矩阵变换到屏幕空间。
- **Mipmap**:为纹理预生成多级分辨率图像(每级尺寸减半),根据像素与纹理的缩放比例选择合适级别,减少摩尔纹和模糊。选择级别公式:$LOD = \log_2(\text{max}(\frac{\partial u}{\partial x}, \frac{\partial v}{\partial x}, \frac{\partial u}{\partial y}, \frac{\partial v}{\partial y}))$。
- **滤波方式**:
- **最近邻(Nearest Neighbor)**:直接取最近纹素,速度快但锯齿明显。
- **双线性(Bilinear)**:取周围4个纹素加权平均,平滑度提升。
- **各向异性(Anisotropic)**:针对斜视角拉伸纹理,采样多个方向纹素,成本高但效果最佳。
```mermaid graph LR A[纹理坐标UV] --> B{Mipmap层级选择} B --> C[最近邻采样] B --> D[双线性采样] B --> E[各向异性采样] C --> F[输出颜色] D --> F E --> F ```
---
可编程着色器:从固定管线到无限可能
固定功能管线的局限性在复杂光照模型面前暴露无遗。例如,实现次表面散射(Subsurface Scattering,如皮肤透光)或基于物理的渲染(PBR)在固定管线中几乎不可能。可编程着色器将原本硬件固定的计算步骤暴露为可编程阶段。
顶点着色器示例(简化GLSL): ```glsl #version 110 attribute vec3 position; attribute vec3 normal; uniform mat4 modelViewProjectionMatrix; uniform mat4 modelMatrix; uniform vec3 lightDir; varying float vLightIntensity;
void main() { gl_Position = modelViewProjectionMatrix * vec4(position, 1.0); vec3 transformedNormal = normalize(modelMatrix * vec4(normal, 0.0)).xyz; vLightIntensity = max(dot(transformedNormal, lightDir), 0.0); } ``` 此代码计算顶点在光源下的强度,传递给像素着色器进行插值。
像素着色器示例: ```glsl #version 110 varying float vLightIntensity; uniform sampler2D diffuseTexture;
void main() { vec4 texColor = texture2D(diffuseTexture, gl_TexCoord[0].st); gl_FragColor = texColor * vLightIntensity; } ``` 通过组合,开发者可创建自定义光照模型、程序化纹理(如火焰、云雾)乃至后处理效果(景深、运动模糊)。
---
经典游戏渲染对比:技术演进的可视化
为直观展示技术进步,以下对比同一游戏系列在