着色器输入到寄存器映射

Shader inputs to registers mapping

我有一个已编译的像素着色器 4.0(我没有它的源代码),输入签名中包含以下内容:

// Name                 Index   Mask Register
// TEXCOORD                 4   xyz         4
// TEXCOORD                 8      w        4

还有其他的输入槽,我只贴了签名有意思的几行

如你所见,签名表明 TEXCOORD4 和 TEXCOORD8 输入值都进入 v4 输入寄存器,前者进入 xyz 字段,后者进入 w 字段。

MSDN says TEXCOORD[n] 输入的类型是 float4.

TEXCOORD8 输入值的哪个分量进入 v4.w 字段,x 或 w?

我不认为映射特定于特定组件 - HLSL 编译器只是试图将输入映射到更有效的布局。我相当确定着色器的输入签名将类似于:

float4 myPixelShader(float3 input_f3 : TEXCOORD4, float input_scalar : TEXCOORD8)
{
    // ...
}

所以如果你想创建一个输出到这个特定着色器的顶点着色器,你可以在你的输出中镜像那个布局,比如:

struct MyInterpolants
{
    float3 something : TEXCOORD4;
    float  something_scalar : TEXCOORD8;
}

MyInterpolants MyVertexShader(...)
{
    MyInterpolants o;

    float3 calc;
    float4 some_var;

    // Some code here that does something and fills elements of some_var and calc

    o.something = calc;
    o.something_scalar = some_var.z;

    return o;
}

应该映射就好了。局部变量的哪个元素映射到该输出并不重要,只要您传递标量并且像素着色器输入和顶点着色器输出之间的签名匹配即可。因此,您可以将 x、y、z 或 w 传递给该标量输出,结果相同。