中EN
概念页

渲染管线

Rendering Pipeline

更新于 2026-10-13 约 10 分钟基础管线GPU

渲染管线是实时图形的核心:给定虚拟相机、三维物体、光源等,把场景转换成一张二维图像。RTR4 把它粗分为四个功能阶段:应用、几何处理、光栅化、像素处理,各阶段并行执行,整体速度由最慢的阶段决定。

为什么用"管线"

把一个任务拆成 n 个阶段并行执行,理想情况下可以提速 n 倍。但每个阶段都依赖上一阶段的结果,最慢的那个阶段就是瓶颈 (bottleneck),它决定了整条管线的吞吐量;等待瓶颈的下游阶段处于饥饿 (starved) 状态。书里用做三明治举例:每人 20 秒时每分钟能做 3 个,其中一步变成 30 秒,就只能做 2 个。

游戏开发启示:性能优化首先要找到瓶颈在哪个阶段,优化非瓶颈阶段几乎没有收益(详见 RTR4 第 18 章)。

功能阶段 vs 实现

书中讲的是功能阶段:只规定要完成什么任务,不规定怎么实现。真实硬件可能把两个功能阶段合成一个单元,也可能把一个耗时阶段拆到多个硬件单元上。

四个阶段

阶段通常运行在主要工作
应用 (Application)CPU(多核并行)输入处理、碰撞检测、动画、物理、剔除等加速算法;最终把要渲染的图元(点、线、三角形)交给几何阶段
几何处理 (Geometry Processing)GPU顶点着色、投影、裁剪、屏幕映射,决定画什么、怎么画、画在哪
光栅化 (Rasterization)GPU(固定功能)找出每个三角形覆盖了哪些像素
像素处理 (Pixel Processing)GPU逐像素运行程序算颜色,做深度测试、混合

下图是四个阶段的顺序,以及几何处理阶段内部的子阶段。虚线框里的是可选阶段,可以不用。

flowchart LR
    A["应用<br/>CPU"] --> G["几何处理<br/>GPU"] --> R["光栅化<br/>GPU"] --> P["像素处理<br/>GPU"]
    subgraph G2["几何处理内部"]
        direction LR
        VS["顶点着色"] --> OPT["可选:曲面细分 / 几何着色器 / 流输出"] --> CL["裁剪"] --> SM["屏幕映射"]
    end
    G -.-> G2
    style OPT stroke-dasharray: 5 5

应用阶段

  • 开发者完全掌控,可以随意修改实现来提升性能,而且会影响后续阶段,比如在这里减少要渲染的三角形数量。
  • 部分工作也可以用计算着色器 (compute shader) 放到 GPU 上,把 GPU 当作高度并行的通用处理器。
  • 它是软件实现,所以不像其他阶段那样分子阶段,但常在多个 CPU 核心上并行。

几何处理阶段

依次包括:

  1. 顶点着色 (Vertex Shading):算出顶点位置(必须),以及法线、纹理坐标等输出数据。名字来自过去逐顶点计算光照再插值颜色的做法;现在顶点着色器更像"准备顶点数据"的通用单元,也可以做骨骼动画等。坐标变换细节见 坐标空间。
  2. 可选阶段(按顺序,均可不用):
    • 曲面细分 (Tessellation):由 hull shader、tessellator、domain shader 组成,按相机距离生成合适数量的三角形,近处多、远处少,解决"近看有棱角、远看浪费"的问题。
    • 几何着色器 (Geometry Shader):比曲面细分出现得早、能力更有限,常用于粒子,比如把一个点扩展成面向相机的四边形。
    • 流输出 (Stream Output):把处理后的顶点输出到数组,供 CPU 或 GPU 之后再用,常用于粒子模拟。
  3. 裁剪 (Clipping):完全在视景体内的图元保留,完全在外的丢弃,部分在内的被裁剪并生成新顶点。之后做透视除法得到 NDC。
  4. 屏幕映射 (Screen Mapping):把 NDC 的 x、y 平移加缩放到窗口坐标。

光栅化与像素处理

  • 光栅化分为三角形设置和三角形遍历,详见 光栅化。
  • 像素处理分为像素着色(可编程,最重要的技术之一是纹理)和合并(可配置但通常不可编程),详见 合并阶段与帧缓冲 和 深度缓冲。

固定功能与可编程

多年来开发者只能使用图形 API 定义的固定功能管线,最后一台主要的固定功能机器是 2006 年的任天堂 Wii。现代 GPU 可编程,可以决定各子阶段具体做什么。这条管线也不是唯一的渲染方式:电影离线渲染曾多用微多边形管线,如今多被光线追踪和路径追踪取代。

取舍与常见坑

  • 能在应用阶段解决的(剔除、LOD)尽量提前做,减少进入 GPU 的工作量。
  • 几何着色器和流输出等可选阶段并非所有 GPU 都支持,RTR4 也指出它们通常不常用。

GEA 的视角:从算法到管线(卷 II 11.3.1.4–11.3.1.5、11.4.1–11.4.3、11.4.6.1)

六个算法步骤

GEA 先列出光栅化渲染必须完成的算法步骤,再说明真实管线怎样对应它们(卷 II 11.4.1):

步骤处理单位内容
变换 (Transformation)顶点把顶点变到观察空间
投影 (Projection)顶点投到二维屏幕空间
光栅化 (Rasterization)三角形找出覆盖的像素,把三角形拆成片元,每个片元只被一个像素"看到"
着色 (Shading)片元插值顶点颜色,或逐片元计算光照
片元测试 (Fragment testing)片元可选的深度测试和模板测试,失败即丢弃
合并与混合 (Merging and blending)片元-像素对颜色写入颜色平面、深度写入深度平面,可选与已有颜色混合

书中强调真实管线会合并、拆分或增加阶段,甚至调整顺序、引入反馈回路,但所有光栅化引擎都要大致按这个顺序完成这些步骤。

为什么是管线:数据独立

  • 每一步一次只处理一个数据元素,而且不允许跨元素读写:变换顶点时不能看别的顶点,光栅化一个三角形时不能读别的三角形,片元着色、测试、合并也不能读写其他片元或无关像素(几何着色器能拿到相邻三角形的顶点,是唯一例外)。
  • 数据独立意味着没有数据竞争,于是可以用两种方式并行:各阶段在时间上重叠执行;同一阶段的硬件在芯片上复制多份,同时处理多个元素(卷 II 11.4.2)。
  • GEA 给出的量级:每个 GPU 计算核心是 32 或 64 通道宽的 SIMD,一块 GPU 通常有 50 个以上这样的核心;50 个 32 通道核心满负荷时可同时处理 1,600 个数据元素。访存停顿时 GPU 切换到另一个 wavefront/warp,详见 GPU 并行架构。

逻辑管线与物理管线

  • 逻辑管线是图形 API(OpenGL、DirectX、Vulkan、Metal)定义的编程范式,是实现者与使用者之间的契约:有哪些阶段、怎样连接、每个阶段能做什么。
  • 物理管线是某个具体实现,通常由 CPU 上的软件、驱动层的 GPU 专用软件、GPU 上的固定功能硬件和着色器共同组成。两者的阶段不一定一一对应,例如逻辑上分开的顶点着色器和像素着色器都跑在同一种通用 SIMD 核心上。
  • 多数 API 还提供纯软件的参考实现,作为检验 GPU 实现正确性的"标准答案",不追求性能(卷 II 11.4.3)。这与本页「功能阶段 vs 实现」的区分是同一个意思。

传统光栅管线的九个阶段

GEA 把 DirectX 风格的传统管线列为九个阶段(卷 II 11.4.6.1):输入装配、顶点着色器、外壳着色器、细分器、域着色器、几何着色器、流输出、光栅化器、像素着色器,最后由输出合并器写入帧缓冲。下图按这个顺序画出,虚线框为可选阶段。

flowchart LR
    IA["输入装配"] --> VS["顶点着色器"] --> HS["外壳着色器"]:::opt --> TS["细分器 固定功能"]:::opt --> DS["域着色器"]:::opt --> GS["几何着色器"]:::opt --> SO["流输出"]:::opt --> RS["光栅化器 固定功能"] --> PS["像素着色器"] --> OM["输出合并器"]
    classDef opt stroke-dasharray: 5 5
  • 应用通过 draw call 提交几何(OpenGL 的 glDrawArrays/glDrawElements,D3D11 的 Draw/DrawIndexed,Vulkan 的 vkCmdDraw/vkCmdDrawIndexed),输入是一个或多个顶点缓冲,可带索引缓冲。
  • 图元类型主要有点列表、线列表、三角形列表,以及带索引的变体和三角形带;可附带邻接信息(三角形多带三个相邻顶点、线段多带两个),只有几何着色器能看到。
  • 输入装配器读取顶点和索引缓冲,把不同格式(索引列表、非索引列表、三角形带)统一装配成图元,还能把多个顶点缓冲里的属性交错拼成一个"结构体"交给着色器。
  • DirectX 功能规范并不把光栅化器当作一个"阶段",而是看作阶段之间的接口;它负责裁剪、透视除法、视口变换、三角形遍历、属性插值和裁剪矩形测试,也可以整个禁用,把管线变成只经流输出写内存的数据处理管线。
  • 各阶段细节见 顶点着色器、曲面细分与几何着色器、像素着色器、合并阶段与帧缓冲。

与 RTR4 的分歧:应用"阶段"还是应用"层"

  • RTR4 把应用阶段算作管线的第一个阶段(本页「四个阶段」)。
  • GEA 指出 OpenGL、DirectX 等 API 把应用视为管线的外部客户端,所以书中只说应用层 (application layer),不加"阶段"二字;图形管线指应用之下、由 API 定义的那部分(卷 II 11.3.1.4)。
  • 两种说法描述的是同一套结构,只是边界划在哪里不同。GEA 还指出这条边界一直在往上移:早期整条管线都是 CPU 软件,Voodoo 把最贵的后段搬进硬件,GPU 又接管了更多工作;如今有的引擎把应用层也用计算着色器搬到 GPU 上,加上网格着色器,管线越来越像随机访问,等于重新走向保留模式(卷 II 11.3.1.5)。应用层本身见 图形栈与渲染引擎架构。

延伸阅读

  • Blinn《A Trip Down the Graphics Pipeline》:从零写软件渲染器,讲裁剪和透视插值的细节
  • 《OpenGL Programming Guide》(红宝书)
  1. realtime_rendering_4ed.pdf 第 2 章 The Graphics Rendering Pipeline
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.1.4–11.3.1.5、11.4.1–11.4.3、11.4.6.1 节

相关页面

图形学实时渲染Real-Time Rendering实时渲染是在计算机上快速生成图像、并让图像随用户输入即时变化的技术。RTR4 认为它由三个要素共同定义:交互性、三维空间感,以及图形加速硬件 (GPU)。图形学坐标空间Coordinate Spaces顶点从模型到屏幕要依次经过模型空间、世界空间、观察空间、裁剪空间、标准化设备坐标 (NDC)、窗口坐标。每一步变换都有明确目的,大部分可以用 4×4 矩阵表示并相乘合并。图形学光栅化Rasterization光栅化(也叫扫描转换)把屏幕空间里带深度和着色数据的顶点,转换成三角形覆盖的像素(片元),交给像素处理阶段。它是几何处理和像素处理之间的同步点:三个顶点在这里组成三角形。图形学深度缓冲Z-Buffer深度缓冲是几乎所有图形硬件用来解决可见性的算法:为每个像素存一个当前最近图元的深度值,新片元更近才写入颜色和深度。它简单、和图元数量成线性关系、允许大多数图元以任意顺序绘制,但不能直接处理半透明。图形学合并阶段与帧缓冲Merging & Framebuffer合并阶段把像素着色算出的片元颜色和缓冲区里已有的颜色结合起来,同时负责深度测试、模板测试和混合。它通常不可编程但高度可配置,也叫 ROP(光栅操作或渲染输出单元)。帧缓冲是系统中所有缓冲区的总称。图形学可编程着色器与 GPU 管线Programmable Shaders & GPU PipelineGPU 把第 2 章的概念管线实现为一组硬件阶段,分为完全可编程、可配置但不可编程、完全固定三类。现代 GPU 采用统一着色器架构:各类着色器共用同一套编程模型和核心,由 GPU 自行分配负载。着色器用 HLSL、GLSL 等类 C 语言编写,输入分为 uniform 和 varying 两类。图形学GPU 并行架构GPU Parallel ArchitectureGPU 为吞吐量而设计:芯片大部分面积是成千上万个着色器核心,而不是缓存和控制逻辑。它靠在大量线程组 (warp/wavefront) 之间快速切换来隐藏访存延迟,用 SIMD 让一组线程锁步执行同一条指令。理解占用率和线程分歧,是写出高效着色器的关键。游戏开发 · UE5UE5 渲染架构UE5 Rendering ArchitectureUE5 的渲染器是独立的 Renderer 模块,在渲染线程 (Rendering Thread) 上以「场景代理」镜像游戏线程的组件状态,每帧按固定顺序执行深度预通道、G-buffer 基础通道、光照、雾、半透明和后处理。现代渲染代码用渲染依赖图 (Render Dependency Graph, RDG) 声明通道与资源,由 RDG 自动排屏障、复用瞬态内存、并行录制;最终命令经 RHI 线程翻译成 D3D12/Vulkan 等图形 API 调用。默认走延迟着色 (Deferred Shading),也可切换前向着色 (Forward Shading)。图形学渲染瓶颈定位与性能度量Bottleneck Location & Performance Measurement渲染管线中最慢的阶段(瓶颈)决定整体吞吐量。优化就是"找到瓶颈 → 优化到瓶颈转移 → 重复",并让非瓶颈阶段做到与瓶颈同样多的工作以换取画质。定位靠逐阶段增减负载的实验和性能工具;度量要用毫秒帧时间而不是 FPS。两条箴言:了解你的架构 (KNOW YOUR ARCHITECTURE);测量、测量、再测量。游戏开发多线程渲染与任务系统Multithreaded Rendering & Task SystemsCPU 时钟频率约在 2003 年停在 3.4 GHz 附近后,性能来自多核。应用阶段的优化一是让代码与内存访问更缓存友好,二是利用多核:多处理器流水线(时间并行,提高吞吐但增加延迟)、并行处理(空间并行,延迟更低)以及两者结合的任务系统;图形 API 用命令缓冲让多个线程并行录制绘制命令,新一代 API(DirectX 12、Vulkan、Metal)把更多责任交给应用以降低驱动开销。图形学并行图形架构与排序分类Parallel Graphics Architectures & Sort Taxonomy提升图形速度的最佳方式是并行:多个几何单元、光栅化单元和像素处理单元同时工作再合并结果。Amdahl 定律指出串行部分限制总加速比。由于 API 要求按提交顺序处理图元,并行单元之间必须在某处做"模型空间到屏幕空间"的排序,按排序位置分为 sort-first、sort-middle、sort-last fragment、sort-last image 四类,各有负载均衡与带宽取舍。本页还简述光线追踪硬件的共同特征。图形学图形栈与渲染引擎架构Graphics Stack & Rendering Engine Architecture渲染引擎要解决的"渲染问题"是:给定由场景元素、虚拟光源和虚拟相机组成的虚拟世界,生成相机看到的二维彩色图像。GEA 把它拆成可见性问题和光照问题,按解法把引擎分为光线追踪、深度缓冲光栅化、辐射度和混合四类;光栅化引擎通常采用立即模式的两层结构:下层是图形管线,上层是负责剔除、提交几何和设置着色器参数的应用层。本页讲这套整体架构,管线内部见 渲染管线。图形学像素着色器Pixel Shader像素着色器(OpenGL 里叫片元着色器)对光栅化产生的每个片元运行,用插值后的顶点数据算出颜色,也可以输出不透明度、修改深度或直接丢弃片元。多渲染目标让它一次输出多组数据,催生了延迟着色。它通常只能写自己所在的像素,但能通过 2×2 quad 拿到相邻像素的导数。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。图形学顶点着色器Vertex Shader顶点着色器是程序员直接控制的第一个管线阶段,逐个处理输入顶点,至少要输出顶点在齐次裁剪空间里的位置。它不能创建或删除顶点,顶点之间也不能传递结果,正因如此可以大规模并行。图形学网格着色器管线Mesh Shader Pipeline网格着色器管线(也叫网格几何管线)是 GPU 厂商为取代传统光栅管线前段而推出的新架构:光栅化器和像素着色器不变,网格着色器和可选的放大着色器(任务着色器)接管顶点、外壳、域和几何着色器的全部工作。它以类似计算着色器的线程组处理叫 meshlet 的小批图元,像启动计算着色器一样启动绘制,还能把部分应用层工作搬到 GPU 上。2019 年进入 DirectX 12,2022 年以 VKEXTmeshshader 扩展进入 Vulkan。

被这些页面引用2 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原