使用系统自动生成的值

系统生成的值由 输入汇编程序(IA)阶段(基于用户提供的输入 语义)生成,以允许着色器操作中的某些效率。 通过附加数据(例如实例 ID(对 顶点着色器(VS)阶段可见)、顶点 ID(对 VS 可见)或基元 ID(对 几何着色器(GS)阶段可见)或像素着色器(PS)阶段/、可见),后续的着色器阶段可以查找这些系统值以优化该阶段的处理。

例如,VS 阶段可能会查找实例 ID,以便为着色器获取额外的每个顶点数据或执行其他操作,而 GS 和 PS 阶段可以使用基元 ID 以相同方式获取每个基元的数据。

顶点编号

每个着色器阶段都使用顶点 ID 来标识每个顶点。 它是一个 32 位无符号整数,其默认值为 0。 当输入装配器(IA)阶段处理基元时,它将被分配给顶点。 将顶点-ID语义附加到着色器输入声明,以便通知IA阶段生成每个顶点的ID。

IA 将向每个顶点添加一个供着色器阶段使用的顶点 ID。 对于每个绘图调用,顶点 ID 递增 1。 在索引绘制调用中,计数器将重置为初始值。 如果顶点标识符溢出(超过 2的32次方减1),则它重置为 0。

对于所有基础类型,每个顶点都有与其关联的顶点 ID,无论是否邻接。

PrimitiveID

每个着色器阶段都使用基元 ID 来标识每个基元。 它是一个 32 位无符号整数,其默认值为 0。 当基元由 输入汇编程序(IA)阶段处理时,它将分配给基元。 若要通知IA阶段生成基元ID,请将基元ID的语义附加到着色器输入声明。

IA 阶段将向每个基元添加一个基元 ID,以供第一个在 IA 阶段之后激活的阶段使用,不论是 几何着色器(GS)阶段,还是 顶点着色器(VS)阶段。 对于每个索引的绘图调用,基元 ID 递增 1,但每当新实例开始时,基元 ID 都会重置为 0。 所有其他绘图调用都不会更改实例 ID 的值。 如果实例 ID 溢出(超过 2~1),则它会包装到 0。

像素着色器(PS)阶段 没有单独的基元 ID 输入,但任何指定基元 ID 的像素着色器输入都使用常量插值模式。

不支持为相邻基元自动生成基元 ID。 对于带邻接的基元类型(如带邻接的三角形带),仅为内部基元(非邻接基元)维护基元 ID,就像没有邻接的三角形带中的基元集一样。

InstanceID

每个着色器阶段都使用实例 ID 来标识当前正在处理的几何图形的实例。 它是一个 32 位无符号整数,其默认值为 0。

如果顶点着色器的输入声明包括实例 ID 语义,那么 输入汇编器 (IA) 阶段 将会为每个顶点添加一个实例 ID。 对于每个带索引的绘图调用,实例 ID 递增 1。 所有其他绘图调用不会更改实例 ID 的值。 如果实例 ID 溢出(超过 2的32次方减1),则它会回到 0。

示例

下图显示了如何将系统值附加到 输入汇编程序(IA)阶段中的实例化三角形条

插图展示了实例化三角形条带的系统值

这些表显示为同一三角形条带的两个实例生成的系统值。 第一个实例(实例 U)以蓝色显示,第二个实例(实例 V)以绿色显示。 实线连接基元中的顶点,虚线连接相邻顶点。

下表显示了实例 U 的系统生成的值。

顶点数据 C,U D,U E、U F、U G、U H、U I、U J,U K、U L、U
顶点 ID 0 1 2 3 4 5 6 7 8 9
InstanceID 0 0 0 0 0 0 0 0 0 0

 

三角形条带实例 U 具有 3 个三角形基元,具有以下系统生成的值:

值 1 值 2 值 3
PrimitiveID 0 1 2
InstanceID 0 0 0

 

下表显示了实例 V 的系统生成值。

顶点数据 C、V D、V E、V F、V G、V H、V I、V J,V K、V L、V
顶点 ID 0 1 2 3 4 5 6 7 8 9
InstanceID 1 1 1 1 1 1 1 1 1 1

 

三角形条带实例 V 具有 3 个三角形基元,具有以下系统生成的值:

值 1 值 2 值 3
PrimitiveID 0 1 2
InstanceID 1 1 1

 

输入汇编程序(IA)阶段 生成 ID(顶点、基元和实例):另请注意,为每个实例提供唯一的实例 ID。 数据以带切割结束,该切割用于分隔三角条带的每个实例。

Input-Assembler(IA)阶段