外壳着色器 (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;
}
请参阅操作步骤:创建外壳着色器。
相关主题