着色器输入到寄存器映射

时间:2018-03-31 15:56:43

标签: windows reverse-engineering direct3d pixel-shader direct3d11

我有一个已编译的像素着色器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?

1 个答案:

答案 0 :(得分:1)

我不认为映射是特定于特定组件的--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传递给那个标量输出,它就可以解决这个问题。