外壳着色器 (HS) 阶段

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

用途和用法

外壳着色器阶段图示

三个分割阶段一起将高阶图面(保留了模型简易度和效率)转换为多个三角形,从而在图形管道中进行精确渲染。 分割阶段包括外壳着色器 (HS) 阶段、细化器 (TS) 阶段域着色器 (DS) 阶段

外壳着色器 (HS) 阶段是可编程着色器阶段。 使用 HLSL 函数实现外壳着色器。

外壳着色器在两个阶段中运行:控制点阶段和修补程序常量阶段,它们由硬件并行地运行。 HLSL 编译器提取外壳着色器中的并行度,并将其编码为驱动硬件的字节码。

  • 每个控制点运行一次控制点阶段,该阶段会读取修补程序的控制点,并生成一个输出控制点(通过 ControlPointID 标识)。
  • 每个修补程序运行一次修补程序常量阶段,以生成边缘细化因素和其他每个修补程序的常量。 在内部,许多修补程序常量阶段可以同时运行。 修补程序常量阶段对所有输入和输出控制点具有只读访问权限。

输入

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

  • 外壳着色器声明细化器 (TS) 阶段所需的状态。 这包括控制点的数量、修补程序面的类型和在分割时使用的分区类型等信息。 此信息作为声明显示,通常位于着色器代码的前面。
  • 细化因素决定细分每个修补程序的量。

输出

在 1 到 32 个输出控制点之间,它们共同构成修补程序。

  • 无论细化因素的数量是多少,着色器输出都在 1 到 32 个控制点之间。 来自外壳着色器的控制点输出可由域着色器阶段使用。 修补程序常量数据可由域着色器使用。 细化因素可由细化器 (TS) 阶段域着色器 (DS) 阶段使用。
  • 如果外壳着色器将任何边缘细化因素设置为 ≤0 或 NaN,则修补程序将被剔除(省略)。 因此,细化器阶段可能运行也可能不运行,域着色器将不运行,并且不会为该修补程序生成可见输出。

示例

[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
     InputPatch<MyInPoint, 12> InPts)
{
     MyOutPoint result;
     
     ...
     
     result = TransformControlPoint( InPts[Id] );

     return result;
}

请参阅操作步骤:创建外壳着色器

图形管道