3.4.1顶点着色器管道输入
由于顶点着色器直接位于管道中的输入装配程序之后,因此它自然会从那里接收输入。配置输入装配程序的输入布局所做的所有工作都旨在使创建的顶点与顶点着色器阶段的当前程序所期望的格式相匹配。这就是为什么在创建ID3DllInputl_ayout对象时需要将编译的着色器字节代码作为输入,以确保组装的顶点与执行顶点着色器程序所需的顶点相匹配。
如在对输入装配程序的输出的描述中所示,顶点着色器输入除了可以使用装配顶点的属性之外,还可以使用系统值语义。可用作顶点着色器输入的两个系统值语义是SV_VertexID和SV_InstanceID。这两者都为顶点着色器程序提供了有用的信息,开发人员只需要将它们包含在顶点着色器输入签名中即可获取它们。例如,SV_VertexID可以用作查找表的索引,用于向着色器提供伪随机值。类似地,SV_InstanceID也可以用作索引机制。但是,它只针对输入装配程序生成的每个实例进行更新,因此任何查找表值都将统一应用于实例的所有顶点。这可以用于引入网格实例之间的变化,使每个实例看起来更加独特。
我们已经描述了这些系统值语义如何作为输入提供给顶点着色器。它们也可以提供给管道中的后期阶段,但如果以后要使用,它们必须通过顶点着色器输出。这是一个合理的限制——如果系统值是在输入装配程序中生成的,则它们可以直接用于顶点着色器。如果该着色器决定不将系统值进一步向下传播到管道中,则它们不会简单地重新出现在需要它们的后期管道阶段中。开发人员必须确保以后所需的任何系统值语义在使用之前从一个阶段传递到另一个阶段。
顶点着色器不可用的一个系统值语义是SV_PrimitiveID属性。SV_PimitiveID由输入装配程序产生,并为基元流中的每个基元提供标识符。顶点着色器阶段一次处理一个顶点,而与渲染的基本体类型无关。此外,顶点着色器生成的单个已处理输出顶点可以在多个基元中使用,例如在三角形条带中,或者如我们对索引渲染的讨论中所示。这使得为输入顶点属性提供唯一的基元ID变得不合逻辑,因为它可以在多个子元中使用。图3.13显示了一组非常简单的几何图形,该几何图形以三角形条的形式提交,突出了这种情况。
属于多个基元的三角形条带顶点的描述:
当这样的几何体由管道处理时,每个顶点将由顶点着色器阶段单独处理。如果在顶点着色器中允许SV_PimitiveID,则哪个基元索引将分配给顶点v37它属于多个基元,因此不清楚共享顶点应使用哪个基元ID