Windows 着色器输入到寄存器映射
我有一个已编译的像素着色器4.0,我没有这方面的源代码,输入签名中有以下内容: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字段
// 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,无法编译回。