Directx HLSL错误X4507:超出了最大常量寄存器索引

Directx HLSL错误X4507:超出了最大常量寄存器索引,directx,direct3d,hlsl,vertex-shader,Directx,Direct3d,Hlsl,Vertex Shader,我有一个带有cbuffer的顶点着色器,其中包含以下成员: float4 myArray[16]; 在着色器的主体中,我可以使用变量索引读取和使用数组值: float4 anElement = myArray[(int)(input.Color.g * 255)]; 这很好。但是,如果我声明数组包含256个元素: float4 myArray[256]; 然后编译器失败,出现以下错误: 错误X4507:最大vs_4_0_级别_9_1常量寄存器索引(256) 已超出-请尝试减少编译引用的常量

我有一个带有cbuffer的顶点着色器,其中包含以下成员:

float4 myArray[16];
在着色器的主体中,我可以使用变量索引读取和使用数组值:

float4 anElement = myArray[(int)(input.Color.g * 255)];
这很好。但是,如果我声明数组包含256个元素:

float4 myArray[256];
然后编译器失败,出现以下错误:

错误X4507:最大vs_4_0_级别_9_1常量寄存器索引(256) 已超出-请尝试减少编译引用的常量数 失败;没有生成代码

如果在myArray中使用常量索引,则不会发生此错误。MSDN没有关于错误4507的文档。我是否可以动态索引长度大于255个元素的数组?这是DirectX9的帽子吗


我使用的是着色器模型4.0 9_1级

这与其说是一个解决方案,不如说是一个变通办法。您可以将阵列拆分为两个(如果有更大的阵列,则可以拆分为多个)。那么编译器就不会抱怨了。

静态索引是什么意思?你试过将浮点值转换为int吗?静态索引器的意思是一个常量。是的,我尝试了显式强制转换(例如myArray[(int)(input.Color.g*255)];)。似乎编译器在动态情况下创建了更多的常量值(尽管我没有查看编译后的代码)。如果指定
float4 myArray[254]
,则它可以工作。您现在可以将数组一分为二作为解决办法。@NicoSchertler如果您想将您的评论作为答案,我很乐意将其标记为已接受。