3. GPU基础与渲染管线

在车载座舱中,仪表、中控、HUD、后排娱乐往往由同一颗GPU并行驱动。理解GPU如何把一份三维场景或二维图层变成屏幕像素,是后续做合成与性能优化的基础。现代GPU的渲染管线可以概括为四个阶段:顶点处理、光栅化、片元着色、混合输出。这四个阶段在硬件上高度并行,但瓶颈往往只出现在其中某一环。

一、渲染管线的四个阶段

顶点处理阶段运行顶点着色器,负责把模型空间的顶点坐标经MVP矩阵变换到裁剪空间,并计算法线、纹理坐标、切线等属性。GPU会把顶点按图元(三角形、线段)组织,并做视锥裁剪与背面剔除。这一阶段是可编程的,但顶点数量通常远小于片元数量,因此除非模型极其复杂,顶点阶段很少成为车载场景的主瓶颈。

光栅化是固定功能阶段:把三角形离散成屏幕上的片元(候选像素),并做透视校正插值,把顶点属性插值到每个片元。光栅化还负责early-Z等可见性判断,提前丢弃被遮挡的片元,减少后续着色开销。它的输出是“片元流”,而不是最终像素。

片元着色阶段运行片元着色器,逐片元计算颜色、光照、纹理采样、透明度等。这是最“昂贵”的阶段,纹理带宽、ALU吞吐、分支发散都会直接影响帧率。车载场景中大量使用半透明图层、圆角、阴影、模糊,都会显著加重片元着色负担。

混合输出阶段把片元颜色与帧缓冲中已有颜色按混合方程合并,并写入颜色缓冲、深度缓冲、模板缓冲。混合是顺序相关的:半透明物体必须按从远到近排序,否则会出现错误叠加。最后通过显示控制器扫描输出到屏幕。

GPU渲染管线:从顶点到屏幕像素 ① 顶点处理 顶点着色器 / MVP变换 裁剪 · 背面剔除 输出:裁剪空间图元 ② 光栅化 三角形→片元 属性插值 · early-Z 输出:片元流 ③ 片元着色 纹理采样 · 光照 透明度 · 模糊/阴影 输出:片元颜色 ④ 混合输出 Alpha混合 · 深度/模板 写入帧缓冲 扫描输出到屏幕 车载GPU常见瓶颈 片元着色:半透明图层叠加、模糊、圆角阴影 → 纹理带宽与ALU压力 混合输出:多屏高分辨率 → 填充率与显存带宽 硬件特性 统一着色器 · TBDR/IMR Tile Memory · 多显示控制器 车载限制 功耗/散热受限 · 无独显 功能安全 · 长生命周期 优化方向 减少overdraw · 合批 降分辨率 · 复用图层

二、车载GPU的硬件特性与限制

车载GPU与手机、PC GPU同源,但约束条件完全不同。主流车载SoC(如高通8155/8295、瑞萨、TI Jacinto)多采用统一着色器架构,顶点与片元共享同一组ALU,因此顶点负载和片元负载会互相抢占资源。部分移动派生GPU采用TBDR(Tile-Based Deferred Rendering),把屏幕切成小块,在片上Tile Memory中完成着色后再写回显存,能显著降低带宽,但对频繁切换渲染目标、依赖中间纹理的合成方式不友好。

车载GPU的关键限制包括:

  • 功耗与散热:座舱无主动风扇或风道有限,GPU长时间高负载会触发降频,导致帧率抖动。
  • 显存带宽:多屏4K输出时,仅扫描输出就占用大量带宽,留给纹理采样的余量有限。
  • 显示控制器数量:物理显示管线有限,多屏往往通过合成后统一输出,增加一次全屏读写。
  • 功能安全:仪表区域要求确定性延迟,不能与娱乐应用争抢GPU导致掉帧。
  • 驱动与API:多为OpenGL ES / Vulkan,驱动成熟度与PC有差距,某些扩展不可用。

三、典型场景:多图层座舱合成

假设中控屏需要同时显示:导航地图(不透明)、视频播放器(不透明)、悬浮控制栏(半透明)、通知弹窗(半透明带阴影)。渲染顺序通常为:先画不透明层,再按从远到近画半透明层。若顺序错误,弹窗会被地图遮挡或混合结果异常。

// 伪代码:正确的图层顺序
draw(mapLayer);          // 不透明,可开启深度写入
draw(videoLayer);        // 不透明
draw(controlBar);        // 半透明,关闭深度写入,开启混合
draw(notification);      // 半透明 + 阴影,最后绘制

如果每层都全屏绘制,overdraw会达到4倍以上。优化手段包括:只重绘脏区域、把静态图层缓存为纹理、用裁剪矩形限制绘制范围。在TBDR架构上,还应避免在渲染中途切换FBO,否则会强制Tile Flush,带宽优势丧失。

四、常见误区与复盘

误区一:只看顶点数判断性能。车载场景顶点数通常不高,真正压垮GPU的是片元着色和混合。一个全屏半透明模糊可能比十万个三角形更贵。

误区二:认为混合是免费的。Alpha混合需要读取帧缓冲已有颜色,是“读-改-写”操作,带宽开销是纯写入的数倍。半透明层越多,带宽越紧张。

误区三:忽略TBDR的Tile Flush。频繁切换渲染目标、使用依赖纹理、在片元着色器中写深度,都会打断Tile流水,使带宽优化失效。

复盘要点:先用GPU厂商工具(如Adreno GPU Profiler、Mali Graphics Debugger)定位瓶颈阶段,再决定优化方向。若片元着色占比高,优先减少overdraw和复杂shader;若混合输出占比高,优先降低分辨率或减少半透明层;若顶点阶段异常,检查是否提交了过多小批次draw call。

五、阶段特征速查

阶段 可编程性 主要开销来源 车载优化重点
顶点处理 可编程 顶点数、draw call数 合批、实例化、LOD
光栅化 固定功能 三角形数量、小三角形 减少细碎图元、early-Z
片元着色 可编程 纹理带宽、ALU、分支 降overdraw、简化shader
混合输出 可配置 填充率、显存带宽 减少半透明层、降分辨率