Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 着色器输入到寄存器映射_Windows_Reverse Engineering_Direct3d_Pixel Shader_Direct3d11 - Fatal编程技术网

Windows 着色器输入到寄存器映射

Windows 着色器输入到寄存器映射,windows,reverse-engineering,direct3d,pixel-shader,direct3d11,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字段

我有一个已编译的像素着色器4.0,我没有这方面的源代码,输入签名中有以下内容:

// Name                 Index   Mask Register
// TEXCOORD                 4   xyz         4
// TEXCOORD                 8      w        4
还有其他输入槽,我只粘贴了签名的有趣行

如您所见,签名显示TEXCOORD4和TEXCOORD8输入值都进入v4输入寄存器,前者进入xyz字段,后者进入w字段

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;
}
因此,如果您希望创建一个输出到此特定着色器的顶点着色器,您可以在输出中镜像该布局,例如:

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传递给标量输出,结果将是相同的。

您说得对,谢谢。我不是在写VS,我是在自动修补和重新编译这些PS es,游戏有3k编译像素着色器。这是我正在使用的HLSL反编译器中的一个bug。当我查看反汇编的ASM代码时,实际上它只访问了v4.xyz/xxyz或v4.w/wwww,但反编译的HLSL包含访问所有这些代码的代码,如标量参数的w4.xww,无法编译回。