图形管道

Direct3D 图形管道设计用于为实时游戏应用程序生成图形。 数据通过各个可配置或可编程的阶段从输入流到输出。

所有阶段都可以使用 Direct3D API 进行配置。 具有常见着色器核心(圆角矩形块)的阶段可通过使用 HLSL 编程语言进行编程。 这使得管道具有非常高的灵活性和适应性。

最常用的是顶点着色器 (VS) 阶段和像素着色器 (PS) 阶段。 如果你甚至不提供这些着色器阶段,则使用默认的无操作、传递式顶点和像素着色器。

direct3d 11 可编程管道中的数据流图示

输入装配器阶段

输入装配器 (IA) 阶段向管道提供基元和邻接数据,例如三角形、线和点,包括语义 ID,以减少对尚未处理基元的处理,从而提高着色器的效率。

  • 输入

    基元数据(三角形、线和/或点),来自内存中的用户填充缓冲区。 和可能的邻接数据。 三角形对于每个三角形将是 3 个顶点,并且对于每个三角形邻接数据可能是 3 个顶点。

  • 输出

    具有附加的系统生成值的基元(例如基元 ID、实例 ID 或顶点 ID)。

顶点着色器阶段

顶点着色器 (VS) 阶段处理顶点,通常执行诸如转换、换肤以及照明之类的操作。 顶点着色器获取一个输入顶点并生成一个输出顶点。 单个每顶点操作,如转换、换肤、变形和每顶点照明。

  • 输入

    具有 VertexID 和 InstanceID 系统生成值的单个顶点。 每个顶点着色器输入顶点可以由 16 个 32 位矢量(每个矢量最多有 4 个分量)组成。

  • 输出

    单个顶点。 每个输出顶点可以由多达 16 个 32 位 4 分量矢量组成。

外壳着色器阶段

外壳着色器 (HS) 阶段是分割阶段之一,其有效地将模型的单个表面分解为许多三角形。 每个修补程序调用一次外壳着色器,它将定义低阶表面的输入控制点转换为构成修补程序的控制点。 它还执行一些按每个修补程序进行的计算,以便为细化器 (TS) 阶段和域着色器 (DS) 阶段提供数据。

  • 输入

    在 1 到 32 个输入控制点之间,它们一起定义了低阶表面。

  • 输出

    在 1 到 32 个输出控制点之间,它们共同构成修补程序。 外壳着色器声明细化器 (TS) 阶段的状态,包括控制点的数量、修补程序面的类型以及在细分时使用的分区类型。

细化器阶段

细化器 (TS) 阶段创建代表几何图形修补程序的域的采样模式,并生成连接这些样本的一组较小对象(三角形、点或线)。

  • 输入

    在每个使用从外壳着色器阶段传入的细化因素(指定域被细分的细微程度)和分区的类型(指定用于分割修补程序的算法)的修补程序上执行一次细化器。

  • 输出

    细化器将 uv(和可选 w)坐标和表面拓扑输出到域着色器阶段。

域着色器阶段

域着色器 (DS) 阶段计算输出修补程序中细分点的顶点位置;它计算与每个域样本对应的顶点位置。 对每个细化器阶段输出点运行一次域着色器,并且该着色器具有对外壳着色器输出修补程序、输出修补程序常量以及细化器阶段输出 UV 坐标的只读权限。

  • 输入

    域着色器使用外壳着色器 (HS) 阶段的输出控制点。 外壳着色器输出包括:控制点、修补程序常数数据和细化因素(例如,细化因素可以包括固定函数细化器使用的值以及原始值(例如在被整数细化舍入前),这有助于加快几何过渡)。 对细化器 (TS) 阶段的每个输出坐标调用一次域着色器。

  • 输出

    域着色器 (DS) 阶段输出输出修补程序中细分点的顶点位置。

几何着色器阶段

几何着色器 (GS) 阶段处理整个基元、三角形、线和点,以及它们的相邻顶点。 它支持几何放大和解扩。 它对于点精灵扩展、动态粒子系统、皮毛/鳍生成、阴影卷生成、单通道渲染到 Cubemap、每基元材料交换和每基元材料设置等算法很有用 - 包括将重心坐标生成为基元数据,使得像素着色器可以执行定制属性内插。

  • 输入

    与在单个顶点上操作的顶点着色器不同,几何着色器的输入是完整基元的顶点(三角形为三个顶点,线为两个顶点或点为单个顶点)。

  • 输出

    几何着色器 (GS) 阶段能够输出形成单个选定拓扑的多个顶点。 可用的几何着色器输出拓扑有 tristriplinestrippointlist。 在几何着色器的任何调用中,发出的基元的数目可以自由地变化,但是必须静态地声明可发出的顶点的最大数目。 从几何着色器调用发出的带长度可以是任意的,并且可以通过 RestartStrip HLSL 函数创建新带。

流输出阶段

流输出 (SO) 阶段可将顶点数据从之前的有效阶段输出(或流式传输)至内存中的一个或多个缓冲区。 流出到内存的数据可以作为输入数据再次循环回到管道,或者从 CPU 读回。

  • 输入

    来自前一管道阶段的顶点数据。

  • 输出

    流输出 (SO) 阶段连续地将来自前一活动阶段的顶点数据(例如几何着色器 (GS) 阶段)输出(或流入)到内存中的一个或多个缓冲区。 如果几何着色器 (GS) 阶段是非活动的,并且流输出 (SO) 阶段是活动的,它会连续地将来自域着色器 (DS) 阶段的顶点数据输出到内存中的缓冲区(或者如果 DS 也是非活动的,它将使用来自顶点着色器 (VS) 阶段的数据)。

光栅器阶段

光栅器 (RS) 阶段剪辑未在视图中的基元,为像素着色器 (PS) 阶段准备基元并确定如何调用像素着色器。 将矢量信息(由形状或基元构成)转换为光栅图像(由像素构成)以便显示实时 3D 图形。

  • 输入

    假定进入光栅器阶段的顶点 (x,y,z,w) 将处于齐性裁剪空间。 在此坐标空间里,X 轴指向右,Y 轴指向上,Z 轴指向与摄像机相反的方向。

  • 输出

    需要渲染的实际像素。 包括一些用于由像素着色器进行内插的顶点属性。

像素着色器阶段

像素着色器 (PS) 阶段接收基元的插值数据并生成每像素数据,如颜色。

  • 输入

    如果管道在配置时未使用几何着色器,像素着色器限制为 16 个 32 位 4 分量输入。 否则,像素着色器可能占用多达 32 个 32 位 4 分量输入。 像素着色器输入数据包含顶点属性(可以在使用或不使用透视校正的情况下内插),或者也可以被视为每基元常量。 像素着色器输入根据声明的内插模式从正在光栅化的基元的顶点属性内插。 如果基元在光栅化之前被剪裁,内插模式在剪裁过程中也受支持。

  • 输出

    像素着色器可输出多达 8 个 32 位 4 分量颜色,如果像素被弃用,则不会生成颜色。 像素着色器输出寄存器分量必须先声明才能使用;允许每个寄存器使用一个独特的输出写入掩码。

输出合并器阶段

输出合并 (OM) 阶段将各种类型的输出数据(像素着色器值、深度和模具信息)与渲染目标的内容以及深度/模具缓冲区组合在一起,以生成最终的管道结果。

  • 输入

    输出合并输入是管道状态、像素着色器生成的像素数据、渲染目标的内容和深度/模具缓冲区的内容。

  • 输出

    最终渲染的像素颜色。