FXC错误“超出最大临时寄存器索引”

时间:2013-04-09 21:41:01

标签: direct3d hlsl direct3d9

我在HLSL工作,我从我的一个着色器中收到此错误:

  

错误X4505:超出最大临时寄存器索引

造成这种情况的一行是:

int count = Passes[input.Tex.y].y;

通行证定义为:

cbuffer Style  
{  
     float3 Passes[256];  
     ...  
}

和input.Tex是一个声明为TEXCOORD的float2。

有人可以向我解释这个错误吗?它没有记录在MSDN上(或据我所知的其他任何地方),我不清楚这里有什么问题。

我正在使用着色器模型4.0级别9_3。

2 个答案:

答案 0 :(得分:0)

现在它将float作为整数索引读入数组。 说你的浮点数是1.0f, 这意味着3F80 0000(十六进制)或1,065,353,216(十进制)。 它现在尝试阅读地址Passes + 1065353216 * sizeof(float3)这个非常明显的注册表索引超出了考虑单个常量保持4096最大常量。

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476898(v=vs.85).aspx#Shader_Constant_Buffer

答案 1 :(得分:0)

如果这是在像素着色器中,则可能不支持数组索引,并且您的编译器可能会生成如下代码:

if (input.Tex.y == 0)
  count = Passes[0];
else if (input.Tex.y == 1)
  count = Passes[1];
...
else if (input.Tex.y == 255)
  count = Passes[255];

我认为9_3级代码不支持像素着色器中的数组索引。您应该检查反汇编是否有非常冗长的代码。您可能需要减少256到128或64以使其编译。