我遇到了一个奇怪的HLSL行为。我尝试使用一个包含在结构中的数组,例如(像素着色器代码):
struct VSOUT {
float4 projected : SV_POSITION;
float3 pos: POSITION;
float3 normal : NORMAL;
};
struct Something {
float a[17];
};
float4 shMain (VSOUT input) : SV_Target {
Something s;
for (int i = 0; i < (int)(input.pos.x * 800); ++i)
s.a[(int)input.pos.x] = input.pos.x;
return col * s.a[(int)input.pos.x];
}
代码在逻辑上毫无意义,它只是一个示例。问题是,当我试图编译这段代码时,会出现以下错误(第25行是for循环行):
循环,但展开失败。
但是,当我将数组放在结构之外时(只需声明
float a[17]
在里面
shMain
),一切正常。
我的问题是,为什么DirectX在使用struct时试图展开(可展开的)for循环?这是记录在案的行为吗?除了将数组放在结构之外,还有其他解决方法吗?
我正在使用shader model 4.0,DirectX 10 SDK,从2010年6月开始。
编辑:
Something
普通数组:
struct VSOUT {
float4 projected : SV_POSITION;
float3 pos: POSITION;
float3 normal : NORMAL;
};
float4 shMain (VSOUT input) : SV_Target {
float a[17]; // Direct declaration of the array
for (int i = 0; i < (int)(input.pos.x * 800); ++i)
a[(int)input.pos.x] = input.pos.x;
return col * a[(int)input.pos.x];
}
[loop]
属性,这意味着它没有展开(这是正确的行为)。