0

我在 HLSL 中工作,我从我的一个着色器中得到了这个错误:

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

导致这种情况的行是:

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

通行证定义为:

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

并且 input.Tex 是声明为 TEXCOORD 的 float2。

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

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

4

2 回答 2

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 才能使其编译。

于 2014-07-09T09:35:47.590 回答
0

现在它将浮点数作为整数索引读取到数组中。假设你的浮点数是 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

于 2013-04-10T18:55:00.687 回答