使用System-Generated值

系统生成的值由 IA 阶段生成, (基于用户提供的输入 语义) ,以实现着色器操作的一定效率。

通过附加数据(例如 VS) 可见 (实例 ID、VS) 可见的顶点 ID (,或者 GS/PS) 可见 (基元 ID),后续着色器阶段可能会查找这些系统值来优化该阶段的处理。 例如,VS 阶段可能会查找实例 ID 来获取着色器的其他每个顶点数据或执行其他操作;GS 和 PS 阶段可能以相同的方式使用基元 ID 来抓取每个基元数据。

VertexID

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

IA 将向每个顶点添加一个顶点 ID,供着色器阶段使用。 对于每个绘图调用,顶点 ID 将递增 1。 对于所有已建立索引的绘制调用,计数将重置回起始值。 对于 ID3D11DeviceContext::D rawIndexedID3D11DeviceContext::D rawIndexedInstanced,顶点 ID 表示索引值。 如果顶点 ID 溢出 (超过 2² – 1) ,则它包装为 0。

对于所有基元类型,顶点都有一个与其关联的顶点 ID (,而不考虑相邻) 。

PrimitiveID

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

IA 阶段将向每个基元添加一个基元 ID,供几何着色器或像素着色器阶段使用, (以 IA 阶段) 后的第一个活动阶段为准。 对于每个索引绘制调用,基元 ID 将递增 1,但是,每当新实例开始时,基元 ID 将重置为 0。 所有其他绘制调用不会更改实例 ID 的值。如果实例 ID 溢出 (超过 2² – 1) ,则它换行为 0。

像素着色器阶段没有针对基元 ID 的单独输入;但是,任何指定基元 ID 的像素着色器输入都使用常量内插模式。

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

InstanceID

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

如果顶点着色器输入声明包含实例 ID 语义,则 IA 阶段将向每个顶点添加实例 ID。 对于每个已编制索引的绘图调用,实例 ID 将递增 1。 所有其他绘制调用不会更改实例 ID 的值。如果实例 ID 溢出 (超过 2² – 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
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 0 0 0 0 0 0 0 0 0 0

 

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
VertexID 0 1 2 3 4 5 6 7 8 9
InstanceID 1 1 1 1 1 1 1 1 1 1

 

PrimitiveID 0 1 2
InstanceID 1 1 1

 

输入汇编程序 (顶点、基元和实例) 生成 ID;另请注意,每个实例都有一个唯一的实例 ID。数据以条带切割结束,该剪切区分隔三角形带的每个实例。

输入装配器阶段