中EN
概念页

网格着色器管线

Mesh Shader Pipeline

网格着色器管线(也叫网格几何管线)是 GPU 厂商为取代传统光栅管线前段而推出的新架构:光栅化器和像素着色器不变,网格着色器和可选的放大着色器(任务着色器)接管顶点、外壳、域和几何着色器的全部工作。它以类似计算着色器的线程组处理叫 meshlet 的小批图元,像启动计算着色器一样启动绘制,还能把部分应用层工作搬到 GPU 上。2019 年进入 DirectX 12,2022 年以 VK_EXT_mesh_shader 扩展进入 Vulkan。

当今 GPU 的四种管线(卷 II 11.4.6)

管线说明
传统光栅管线固定顺序连接的一组阶段,见 渲染管线
计算管线独立于光栅管线的通用着色器程序,即 GPGPU,见 计算着色器
光线追踪管线专用硬件对两层加速结构做实时光线投射,见 硬件光线追踪管线
网格着色器管线只有两个可编程阶段,却涵盖传统管线全部功能,还能把应用层的许多工作从 CPU 移到 GPU

四类工作负载可在 GPU 上同时执行,都可由 CPU 提交,部分也可由 GPU 上的着色器发起。

传统管线的问题(卷 II 11.4.6.4)

  • 传统光栅管线脱胎于 Voodoo、GeForce 256 的固定功能硬件,存在一些性能局限,已不能很好地对应最新的 GPU 架构。
  • 关键问题在大型索引三角形列表:索引理论上让每个顶点只写一次,但每个顶点都要经过顶点着色器,输出要暂存到光栅化器用完为止。显存宝贵,不能为结果另开一个同样大的顶点缓冲,所以传统管线按网格的小"块"分批处理,结果暂存在顶点缓存中,GPU 常常对同一顶点多次运行顶点着色器。
  • 离线的顶点缓存优化器能重排顶点减少重复处理,效果可观,但有根本上限(见 三角形带、扇与索引网格)。真正需要的是一种给程序员更多控制、顶点处理更高效、更契合统一着色器架构的新管线。

管线结构

下图是网格着色器管线的阶段,虚线框为可选的放大着色器。

flowchart LR
    APP["应用: DispatchMesh / vkCmdDrawMeshTasksEXT"] --> AS["放大着色器 任务着色器"]:::opt --> MS["网格着色器"] --> RS["光栅化器"] --> PS["像素着色器"] --> OM["输出合并"]
    APP --> MS
    classDef opt stroke-dasharray: 5 5
  • 网格着色器以线程组运行,源码很像通用计算着色器。每次调用处理一个 meshlet:一组顶点加上说明如何组成三角形(或线)的索引。GPU 和 API 对 meshlet 大小有各种限制,最大顶点数通常在 256 到 1,024 之间。

    原书问题(11.4.6.4):"256 到 1,024"偏大。D3D12 规定单个网格着色器线程组最多输出 256 个顶点、256 个图元(DirectX-Specs "Mesh Shader",Output limits);Vulkan VK_EXT_mesh_shader 要求 maxMeshOutputVertices/maxMeshOutputPrimitives 至少 256,主流实现报告的也就是 256。实际推荐的 meshlet 更小:NVIDIA 建议 64 顶点 / 126 图元,AMD 建议约 64–128(NVIDIA "Introduction to Turing Mesh Shaders";AMD GPUOpen "Mesh shaders on AMD RDNA graphics cards")。 另:GEA 在 11.4.6 开头说网格着色器管线"只有两个可编程阶段",但其图 11.51 和本节正文都表明像素着色器仍然保留,可编程阶段实为放大(任务)着色器、网格着色器、像素着色器三个;被两个新阶段取代的只是传统管线前端的顶点、外壳、域、几何着色器(及输入装配)。

  • 网格着色器可以对 meshlet 做任何处理,把数量可变的输出顶点和图元直接送进光栅化器,数量不必与输入一致;它不经过传统的输入装配器。这让它完全掌控哪些图元最终被光栅化,也更自然地映射到现代 GPU 的 SIMD 核心。

发起绘制

  • 传统管线用 draw call 给出要渲染的顶点和索引数量;网格着色器管线则像启动计算着色器一样,用三维网格启动网格着色器线程组:DirectX 12 用 DispatchMesh,Vulkan 用 vkCmdDrawMeshTasksEXT。
  • 线程组既可由 CPU 上的应用启动,也可由放大着色器(任务着色器)在 GPU 上直接启动。放大着色器同样采用计算着色器的编程范式,启用时在网格着色器之前运行,能启动网格着色器线程组,但不能启动自己的新实例。

与传统几何放大的区别

  • 外壳/细分器/域着色器和几何着色器通过把输入面片拆成更多更细的网格来放大几何;放大着色器则通过发起任意数量的网格着色器调用来放大。
  • 传统的细分功能可以由放大着色器与网格着色器协作模拟(见 曲面细分与几何着色器)。

特性级别与硬件

GEA 表 11.2 中,网格着色器管线从特性级别 11_0 起为可选,在 12_2 成为必需(见 图形 API 设备、管线状态与资源)。

取舍

  • 好处:程序员拥有更大权力,顶点处理效率更高,更契合统一着色器架构;剔除等应用层工作可以随之移到 GPU,与 Nanite 一类 GPU 驱动渲染的方向一致(见 图形栈与渲染引擎架构、Nanite 虚拟化几何体)。
  • 代价:需要较新的硬件和 API 支持(DX12 2019 年、Vulkan 2022 年才引入);绘制模型从"提交顶点和索引"变成"启动线程组",引擎的网格数据组织需要相应改为 meshlet。GEA 只做概览,推荐进一步阅读 AMD 和 NVIDIA 关于网格着色的文章。
  1. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  2. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.4.6、11.4.6.4 节

相关页面

图形学可编程着色器与 GPU 管线Programmable Shaders & GPU PipelineGPU 把第 2 章的概念管线实现为一组硬件阶段,分为完全可编程、可配置但不可编程、完全固定三类。现代 GPU 采用统一着色器架构:各类着色器共用同一套编程模型和核心,由 GPU 自行分配负载。着色器用 HLSL、GLSL 等类 C 语言编写,输入分为 uniform 和 varying 两类。图形学渲染管线Rendering Pipeline渲染管线是实时图形的核心:给定虚拟相机、三维物体、光源等,把场景转换成一张二维图像。RTR4 把它粗分为四个功能阶段:应用、几何处理、光栅化、像素处理,各阶段并行执行,整体速度由最慢的阶段决定。图形学曲面细分与几何着色器Tessellation & Geometry Shader曲面细分、几何着色器和流输出是顶点着色器之后的三个可选阶段。曲面细分把曲面描述按需生成合适数量的三角形;几何着色器能把图元变成别的图元,但效率不好、实际用得少;流输出把处理后的顶点写回内存以便复用。图形学三角形带、扇与索引网格Triangle Strips, Fans & Indexed Meshes让共享顶点的三角形成组送入管线,可以减少顶点着色器调用。三角形扇和带把每三角形发送的顶点数降到接近 1;现代 GPU 的标准做法是带单一索引缓冲的三角形网格,理论上每三角形只需处理约 0.5 个顶点,实际效果取决于变换后顶点缓存,由三角形顺序优化(Forsyth、Tipsify 等)决定。图形学计算着色器Compute Shader计算着色器是 DirectX 11 引入的一种 GPU 计算方式:它不固定在图形管线的某个位置,但由图形 API 调用,和其他着色器共用统一着色器核心。它暴露了线程组和组内共享内存,最大的优势是能直接处理 GPU 上生成的数据,不用来回传给 CPU。图形学图形 API 设备、管线状态与资源Graphics API Devices, Pipeline State & Resources所有图形 API(OpenGL、DirectX、Vulkan、Metal)都围绕同一组概念:代表 GPU 的设备、描述各阶段配置的管线状态、承载数据的资源及其视图。GEA 把 API 分成高层(OpenGL、D3D11 及更早)和底层(D3D12、Vulkan、Metal、PlayStation 的 Gnm),并介绍 D3D11 的特性级别、设备上下文与延迟上下文、D3D12 的命令列表、PSO 和根签名。本页按 GEA 的整理讲这些跨 API 的共同概念,不是任何一个 API 的教程。图形学图形栈与渲染引擎架构Graphics Stack & Rendering Engine Architecture渲染引擎要解决的"渲染问题"是:给定由场景元素、虚拟光源和虚拟相机组成的虚拟世界,生成相机看到的二维彩色图像。GEA 把它拆成可见性问题和光照问题,按解法把引擎分为光线追踪、深度缓冲光栅化、辐射度和混合四类;光栅化引擎通常采用立即模式的两层结构:下层是图形管线,上层是负责剔除、提交几何和设置着色器参数的应用层。本页讲这套整体架构,管线内部见 渲染管线。游戏开发 · UE5Nanite 虚拟化几何体Nanite Virtualized GeometryNanite 是 UE5 的虚拟化几何体 (Virtualized Geometry) 系统:导入时把网格切成分层的三角形簇 (Cluster),渲染时按相机视角逐簇选择细节层次并无缝拼接,按需从磁盘流送,并在绕过传统绘制调用 (Draw Call) 的独立通道中渲染,使帧预算不再受多边形数、绘制调用和网格内存约束。图形学硬件光线追踪管线Hardware Ray Tracing Pipeline高端 GPU 提供硬件加速的光线追踪,它像 GPU 中独立于光栅管线和计算管线的另一条管线,但能与它们协调同步。场景几何要先组织成两层加速结构(TLAS 实例层与 BLAS 几何层),光线发射后由 any-hit、closest-hit、miss 等着色器处理结果。由于还不够快,GPU 光追通常与光栅化结合成混合渲染:先光栅化 G-buffer,再对镜面、反射和间接光发射光线。

输入关键词开始搜索

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