使用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 阶段中将系统值附加到实例化三角形条。

illustration of system values for an instanced triangle strip

以下表显示了为同一三角形带的两个实例生成的系统值。 第一个实例(实例 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。数据以条带剪切结尾,它分隔三角形条带的每个实例。

输入装配器阶段