传统管线
在过去 20 年里,图形管线不断演进,形成了如今我们熟悉的模样。随着独立硬件供应商(IHV)不断在核心数量、内存容量和带宽方面展开竞争,几何处理模型中的某些固定功能瓶颈也变得日益明显。 图 1. 传统图形管线。蓝色调阶段是固定功能,绿色调阶段是可编程着色器。
网格着色器管线
网格着色器管线针对上述传统图形管线的局限性。首先,它从管线中移除了 IA 和曲面细分器。目的是最大化着色器波的启动速率,将 IA 的职责转移到能够随 GPU 扩展的着色器代码。这有助于使 GPU 核心保持饱和,并对 PA 保持压力。 该管线还提供了在管线中不同位置对工作负载进行剔除的能力。可以使用放大着色器进行低粒度剔除,例如对分组对象、实例或 meshlets 的剔除。网格着色器则能够以逐图元粒度进行剔除。这为尽早且频繁地丢弃可轻松剔除的图元提供了一条路径,可节省宝贵的计算资源、内存带宽和 PA 吞吐量。 图 2. 网格着色器管线的各个阶段。绿色调阶段是可编程的,蓝色调阶段是固定功能。
网格着色器
网格着色器的设计目标是为几何管线提供计算着色器中才有的那种通用性水平。这让开发者能够完全控制每个线程的工作负载。将索引和顶点属性抓取移到着色器代码中消除了对固定功能硬件的依赖,最大化了波启动率,并让 IA 能随着 GPU 的其余部分一起扩展。 它们动态指定顶点和图元导出数量的能力打开了高效、片上支持图元剔除的大门。剔除可以逐 meshlet 或逐图元进行,可基于网格着色器内部任意的剔除标准。这使着色器能够将顶点属性抓取和着色推迟到管线末端,直到已经完成多层剔除之后再进行。放大着色器
计算着色器经常被用于预处理资源,随后通过 ExecuteIndirect 使用其结果发起绘制调用。这是许多逐视图剔除形式的常用技术。它有若干微妙的缺点,若能得到适当的硬件支持则可优化。 其一,计算着色器实例必须将数据写入全局内存。这会带来抓取延迟,并使其受制于 GPU 全局的内存带宽争用。其二,如果计算生产者和图形消费者是连续操作,GPU 必须等待所有计算着色器实例退休后才能启动消费的绘制调用。这是由一个 UAV 资源屏障导致的,该屏障必须确保在任何着色器可以消费之前,所有对最终 UAV 的计算着色器写入都已完成。 图 3. 一个紧随其后立即调用 ExecuteIndirect “DispatchMesh” 绘制的计算着色器的简化波调度可视化。由于 UAV 屏障,计算着色器波(黄色)与网格着色器波(绿色)的执行之间存在管线停顿。带编号的 ID 将调用它的计算着色器线程组与其子网格着色器集群相关联。

