第4章 · 渲染管线优化

渲染管线优化

从顶点到像素,系统化降低每帧开销,让管线轻盈流畅。

4.1 渲染管线概述

现代渲染管线是一系列有序的数据处理阶段,将三维场景转化为二维图像。主要分为应用阶段(CPU)、几何阶段(顶点处理)和光栅化阶段(片元处理)。每一阶段都可能成为帧率瓶颈。

应用阶段 CPU · 视锥剔除 几何阶段 顶点着色 · 曲面细分 光栅化 片元着色 · 深度测试 输出合并 帧缓冲 · 后处理

4.2 顶点处理优化

顶点处理是几何阶段的基石,涉及模型变换、光照计算、顶点着色等。优化顶点处理能显著降低CPU/GPU负载。

核心优化策略

  • 顶点缓存与重用:使用索引缓冲区,避免重复顶点。
  • LOD (细节层次):根据距离切换低面模型。
  • GPU实例化:一次绘制调用渲染多个相同物体。
  • 顶点压缩:使用半精度浮点或量化。
原始顶点流 10k 顶点/帧 优化阶段 LOD · 实例化 · 压缩 精简顶点 3.5k 顶点/帧
💡 实战建议: 在顶点着色器中尽量使用标量运算,避免动态分支;将骨骼矩阵预计算后传入常量缓冲区。

4.3 片元处理优化

片元(像素)着色是渲染管线中最耗时的阶段之一,尤其在高分辨率下。优化目标是减少过度绘制与复杂运算。

优化技术描述帧率提升参考
Early-Z / 深度预测试在片元着色前剔除不可见像素20% ~ 40%
降低着色分辨率使用半分辨率或动态分辨率缩放30% ~ 50%
简化片元着色器减少指令、避免高精度运算15% ~ 35%
合并渲染目标 (MRT)减少渲染通道10% ~ 25%
传统片元管线 每个像素执行复杂着色 优化片元管线 Early-Z + 半精度 + 合并 帧率↑ ~2.1x

片元着色器代码示例 (优化前后)

// 优化前:高精度 + 动态分支
precision highp float;
void main() {
    vec3 color;
    if (gl_FragCoord.x < 400.0) {
        color = vec3(0.9, 0.2, 0.3);
    } else {
        color = vec3(0.2, 0.6, 0.9);
    }
    gl_FragColor = vec4(color, 1.0);
}

// 优化后:mediump + 无分支 (mix)
precision mediump float;
void main() {
    float t = step(400.0, gl_FragCoord.x);
    vec3 color = mix(vec3(0.9, 0.2, 0.3), vec3(0.2, 0.6, 0.9), t);
    gl_FragColor = vec4(color, 1.0);
}