3.3.4输入装配管道输出
用户自定义属性
在了解输入装配程序可以产生什么以及如何操作其输出的同时,我们还需要考虑输出流如何与管道的其余部分交互。为了使输入装配程序生成与所需顶点着色器兼容的输出,用于创建输入布局对象的D3D11_INPUT_ELEMENT_DESC结构数组必须与顶点着色器的声明输入特征相匹配。因此,各个顶点属性必须与顶点着色器所期望的内容相匹配,包括数据类型和语义名称。清单3.7显示了HLSL中的一个示例顶点着色器程序。
struct VS_INPUT
{
float3 position : POSITION;
float2 tex : TEXCOORDS;
float3 normal : NORMAL;
};
VS_0UTPUT VSMAIN(in VS_INPUT v)
{
}
对于此示例,应用程序将需要提供顶点数据,该顶点数据由具有三个float元素的POSITION语义属性、具有两个浮点元件的TEXCOORDS语义组件和具有三个浮点数元的NORMAL语义组件组成。创建输入布局对象有助于开发人员确保顶点数据和顶点着色器签名相互匹配。由于顶点数据是由应用程序提供的,因此可以以适当的格式创建或加载顶点数据,以便与特定的顶点着色器一起使用。然后,顶点着色器使用这些输入来执行其自己的计算,然后它还将定义多个输出属性,并将这些属性写出来供下一个活动管道阶段使用。对于每个后续管道阶段,都会重复此过程,每个阶段声明其输出签名,然后在其中提供其输出数据。输入装配程序生成的输入数据的一些典型示例包括但不限于以下内容。
- float 3位 position—输入顶点的位置
- float3 normal——输入顶点的法线向量
- float 3 tangent——输入顶点的正切向量
- float 3 bitangent——输入顶点的余切向量
- uint4-boneID——用于蒙皮的顶点的四个骨骼ID
- float4 boneWeights—用于蒙皮的顶点的四个骨骼权重
输入装配程序还可以生成三种不同的系统值语义:SV_VertexID、SV_PimitiveID和SV_InstanceID。这些系统值语义不是由用户提供的,而是由输入装配程序在创建输出数据流时生成的。SV_VertexID系统值是一个无符号整数,它唯一标识集合顶点流中的每个顶点。它首先在顶点着色器中可用,并提供了稍后在管道中区分顶点的简单方法。SV限制ID为基元流中的每个基元提供类似的唯一标识符。它首先在外壳着色器阶段可用,因为顶点着色器不使用基本体级别的信息。最后,SV_InstanceID唯一标识实例化绘制调用中几何体的每个实例。它首先可用于顶点着色器阶段。这三个系统值一起提供了一种相当广泛的方法来识别输入装配程序生成的每个数据元素。