2、GPU发展简史:从固定管线到可编程管线,了解架构演进的驱动力
GPU(图形处理器)自诞生以来,其核心使命始终是“将三维数学描述转化为屏幕上的像素”。然而,实现这一目标的方式在三十年间发生了根本性变革。早期GPU采用固定功能管线(Fixed-Function Pipeline),硬件电路被固化以执行特定的图形算法;而现代GPU则全面转向统一着色器架构(Unified Shader Architecture),允许开发者通过编程语言(如HLSL、GLSL)自由控制渲染的每一个环节。理解这一演进过程,不仅是回顾历史,更是理解当前GPU为何以“大规模并行计算单元”为核心、以及游戏渲染技术(如光线追踪、实时全局光照)为何能成为可能的关键前提。
上图清晰地展示了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渲染”——先绘制场景,再以半透明多边形叠加模拟反射。这种“欺骗”手段不仅性能开销大,而且效果生硬。更关键的是,当游戏需要一种全新的“卡通描边”效果时,固定管线完全无能为力,因为硬件中没有“边缘检测”电路。
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闲) | 动态均衡 |
| 代表API | DirectX 7 | DirectX 8/9 | DirectX 10/11/12, Vulkan |
| 典型GPU | Voodoo3, TNT2 | GeForce 3/4, Radeon 9700 | GeForce 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核心负责去噪和着色,两者通过统一调度协同工作。
- 画质需求:从简单光照到PBR、全局光照,算法复杂度指数级上升。
- 创作自由:开发者需要表达独特艺术风格,而非受限于硬件预设。
- 效率与成本:统一架构减少晶体管浪费,同时为GPGPU(通用计算)打开大门,使GPU成为AI训练的核心硬件。
常见误区与复盘
误区1:认为“可编程管线就是让CPU写代码”。实际上,着色器代码运行在GPU上,CPU与GPU通过API(如DirectX 12)进行命令交互。
误区2:忽视“分支发散”问题。统一架构中,如果相邻线程执行不同分支(如if语句),GPU会串行执行所有分支路径,导致性能下降。这是现代GPU编程中最重要的性能陷阱之一。
误区3:认为“统一架构=万能”。虽然着色器可编程,但纹理单元、光栅化单元(ROPs)仍是固定功能硬件。GPU是“可编程+固定功能”的混合体。