HLSL:在结构中使用数组

时间:2010-08-23 09:17:07

标签: directx shader hlsl

我遇到了HLSL的奇怪行为。我正在尝试使用结构中包含的数组,如下所示(Pixel Shader代码):

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循环行):

  

(25,7):错误X3511:强制展开   循环,但展开失败。

但是,当我将数组放在结构体之外时(只在float a[17]中声明shMain),一切都按预期工作。

我的问题是,为什么DirectX在使用struct时会尝试展开(不可滚动的)for循环?这是记录在案的行为吗?除了将数组放在结构外部之外,是否有任何可用的解决方法?

我从2010年6月起使用着色器模型4.0,DirectX 10 SDK。

修改 为了澄清我正在添加工作代码,它只用plain数组替换struct 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];
}

此代码按预期编译和工作。即使我在for循环前添加[loop]属性,这意味着它没有展开(这是一个正确的行为)。它可以工作。

1 个答案:

答案 0 :(得分:1)

我不确定,但我所知道的是硬件调度和过程分段为2x2(用于计算衍生物)。这可能是fxc尝试展开for循环以便着色器程序以锁步模式执行的原因。

您是否也尝试使用[loop]属性生成使用流量控制的代码?