2、GPU发展简史:从固定管线到可编程管线,了解架构演进的驱动力

GPU(图形处理器)自诞生以来,其核心使命始终是“将三维数学描述转化为屏幕上的像素”。然而,实现这一目标的方式在三十年间发生了根本性变革。早期GPU采用固定功能管线(Fixed-Function Pipeline),硬件电路被固化以执行特定的图形算法;而现代GPU则全面转向统一着色器架构(Unified Shader Architecture),允许开发者通过编程语言(如HLSL、GLSL)自由控制渲染的每一个环节。理解这一演进过程,不仅是回顾历史,更是理解当前GPU为何以“大规模并行计算单元”为核心、以及游戏渲染技术(如光线追踪、实时全局光照)为何能成为可能的关键前提。

GPU架构演进:从固定功能到统一可编程 固定功能管线 (1990s) 几何处理 → 光栅化 → 纹理 → 深度测试 • 硬件电路固化算法 • 开发者仅能配置参数 • 代表:NV TNT2, Voodoo3 • 限制:无法实现新特效 硬件状态机,不可编程 需求驱动 分离式可编程 (2001-2006) VS(顶点着色器)+ PS(像素着色器) • 引入汇编级着色器 • VS与PS硬件分离 • 代表:GeForce 3, Radeon 9700 • 限制:VS/PS资源不均衡 可编程但分工固定 负载不均 统一着色器架构 (2006至今) 统一着色器单元(CUDA核心/流处理器) • 同一硬件执行VS/PS/GS/CS • 高级语言(HLSL/GLSL) • 代表:GeForce 8800, RDNA • 扩展:GPGPU通用计算 完全可编程 + 通用计算 架构演进的三大驱动力 ① 游戏画质需求升级 • 更复杂的光照模型(Phong→PBR) • 高分辨率纹理与抗锯齿 • 动态阴影、粒子、后处理 • 固定电路无法覆盖新算法 ② 开发者创作自由度 • 固定管线只能“调参” • 可编程允许自定义着色算法 • 艺术风格差异化(卡通渲染等) • 引擎迭代不再受硬件限制 ③ 硬件效率与成本 • 分离式VS/PS导致资源闲置 • 统一架构提高晶体管利用率 • 同一芯片兼顾图形+计算 • 制程升级摊薄研发成本 1996 2001 2006 2024

上图清晰地展示了GPU架构从固定功能到统一可编程的演进路径。下方我们将深入剖析每个阶段的技术特征、驱动因素以及其对游戏渲染产生的深远影响。

2.1 固定功能管线时代:硬件固化的“黑盒”

核心原理:状态机驱动的渲染流程

在1990年代中后期,GPU(当时常被称为“3D加速卡”)的设计哲学是“为特定算法制造专用电路”。整个渲染流程被分解为一系列固定的硬件阶段:顶点变换(Transform)、光照计算(Lighting)、光栅化(Rasterization)、纹理采样(Texturing)、雾化混合(Fog/Blending)以及深度测试(Depth Test)。开发者无法改变这些阶段的内部逻辑,只能通过设置状态参数(如光源位置、材质颜色、纹理坐标)来影响输出结果。这种设计在DirectX 7及之前的时代达到顶峰。

关键特征:硬件内部是一个巨大的状态机。例如,要开启光照,开发者调用 glEnable(GL_LIGHTING);要设置雾效,调用 glFogf()。每个功能都是“有则用,无则等”,但无法创造新功能。

判断方法:如何识别固定管线代码

在游戏引擎或图形调试工具中,识别固定管线非常容易:

  • 渲染API调用中大量出现 glBegin()/glEnd() 或 SetRenderState() 模式。
  • 没有自定义着色器文件(.fx、.hlsl、.glsl),所有效果依赖API内置函数。
  • 无法实现半透明阴影、逐像素光照等复杂效果,因为硬件不支持。

案例拆解:Voodoo2与《古墓丽影》的局限

3dfx Voodoo2(1998年)是固定管线的代表作。它仅支持单纹理、无硬件顶点变换(依赖CPU计算)。当游戏《古墓丽影3》需要在水面反射效果时,开发者只能通过“双pass渲染”——先绘制场景,再以半透明多边形叠加模拟反射。这种“欺骗”手段不仅性能开销大,而且效果生硬。更关键的是,当游戏需要一种全新的“卡通描边”效果时,固定管线完全无能为力,因为硬件中没有“边缘检测”电路。

风险提示:固定管线的最大问题在于“算法迭代速度远超硬件迭代速度”。一款GPU需要18个月设计周期,而游戏引擎的渲染算法可能每6个月就出现重大突破。硬件一旦流片,其功能就永远锁死。

2.2 分离式可编程管线:着色器时代的黎明

核心原理:VS与PS的独立革命

2001年,NVIDIA GeForce 3和微软DirectX 8引入了可编程顶点着色器(Vertex Shader, VS)和可编程像素着色器(Pixel Shader, PS)。这是GPU历史上第一次允许开发者编写一小段汇编代码,替代硬件中固定的顶点变换和像素混合逻辑。VS运行在专用的ALU阵列上,PS运行在另一组专用的纹理/算术单元上。虽然它们各自独立,但终于打破了“硬件黑盒”。

对比维度固定管线分离式可编程(VS/PS)统一着色器架构
编程模型状态参数配置汇编级着色器高级语言(HLSL/GLSL)
硬件单元专用电路VS单元 + PS单元统一流处理器
灵活性几乎为零有限(受限于VS/PS各自资源)完全可编程
负载均衡固定差(VS忙时PS闲)动态均衡
代表APIDirectX 7DirectX 8/9DirectX 10/11/12, Vulkan
典型GPUVoodoo3, TNT2GeForce 3/4, Radeon 9700GeForce 8800, RTX系列, RDNA

操作流程:编写第一个像素着色器

在DirectX 9时代,开发者使用汇编或高级着色语言(HLSL)编写效果文件。一个简单的“边缘光”效果需要:

// 像素着色器示例 (HLSL)
float4 PS_EdgeLighting(float2 uv : TEXCOORD0) : COLOR0
{
    float4 texColor = tex2D(TextureSampler, uv);
    float3 normal = normalize(texColor.rgb * 2.0 - 1.0);
    float3 viewDir = normalize(float3(0, 0, 1));
    float rim = 1.0 - saturate(dot(normal, viewDir));
    return float4(texColor.rgb + rim * float3(0.5, 0.2, 0.1), texColor.a);
}

这段代码在固定管线中完全无法实现,因为它需要逐像素计算法线与视线夹角。

常见误区:VS/PS资源不均衡的陷阱

分离式架构的致命缺陷在于硬件资源比例固定。例如,某GPU拥有4个VS单元和8个PS单元。如果游戏场景顶点密集(如大量植被),VS单元会成为瓶颈;如果场景像素填充率要求高(如大分辨率后处理),PS单元又会满载。开发者无法动态调整,只能通过降低模型精度或分辨率来妥协。

经验总结:分离式架构虽然带来了“可编程”的曙光,但其硬件隔离的设计违背了图形负载动态变化的本质。这为后续统一着色器架构的诞生埋下了伏笔。

2.3 统一着色器架构:现代GPU的基石

核心原理:同一硬件,多种用途

2006年,NVIDIA GeForce 8800(G80核心)和DirectX 10带来了革命性的统一着色器架构(Unified Shader Architecture)。GPU内部不再区分VS单元和PS单元,而是部署了数百个完全相同的流处理器(Stream Processor)(AMD称为流处理器,NVIDIA称为CUDA核心)。这些处理器可以动态分配任务:帧1可能用60%的单元做顶点计算,40%做像素计算;帧2则可能完全反过来。这种设计极大地提高了硬件利用率。

判断方法:从硬件规格识别架构

现代GPU规格中,CUDA核心数或流处理器数就是统一着色器单元的数量。例如,RTX 4090拥有16384个CUDA核心,它们全部是统一单元,可执行顶点、像素、几何、计算着色器任务。而对比GeForce 6800(分离式),其规格会分别标注“4×2 Vertex Shader”和“16×1 Pixel Shader”。

案例拆解:从《孤岛危机》到《赛博朋克2077》的飞跃

《孤岛危机》(2007年)是首批充分利用统一着色器架构的游戏之一。其标志性的“体积云”和“实时环境光遮蔽(SSAO)”效果,需要大量逐像素计算。在分离式架构上,这些效果会因PS单元满载而帧率暴跌;但在G80上,GPU可以临时将空闲的VS单元“转型”为像素计算单元,从而保证流畅运行。到了《赛博朋克2077》(2020年),光线追踪技术更是将统一着色器架构推向极致——RT核心负责求交运算,而CUDA核心负责去噪和着色,两者通过统一调度协同工作。

架构演进的核心驱动力总结:
  1. 画质需求:从简单光照到PBR、全局光照,算法复杂度指数级上升。
  2. 创作自由:开发者需要表达独特艺术风格,而非受限于硬件预设。
  3. 效率与成本:统一架构减少晶体管浪费,同时为GPGPU(通用计算)打开大门,使GPU成为AI训练的核心硬件。

常见误区与复盘

误区1:认为“可编程管线就是让CPU写代码”。实际上,着色器代码运行在GPU上,CPU与GPU通过API(如DirectX 12)进行命令交互。
误区2:忽视“分支发散”问题。统一架构中,如果相邻线程执行不同分支(如if语句),GPU会串行执行所有分支路径,导致性能下降。这是现代GPU编程中最重要的性能陷阱之一。
误区3:认为“统一架构=万能”。虽然着色器可编程,但纹理单元、光栅化单元(ROPs)仍是固定功能硬件。GPU是“可编程+固定功能”的混合体。

复盘要点:架构演进的本质是“将硬件从算法的束缚中解放出来”。固定管线是“硬件定义软件”,而统一着色器架构是“软件定义硬件”。理解这一转变,是后续学习GPU并行编程模型、渲染管线优化以及光线追踪硬件设计的基础。