代码之家  ›  专栏  ›  技术社区  ›  Karel Petranek

HLSL:在结构中使用数组

  •  3
  • Karel Petranek  · 技术社区  · 14 年前

    我遇到了一个奇怪的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] 属性,这意味着它没有展开(这是正确的行为)。

    1 回复  |  直到 14 年前
        1
  •  1
  •   elmattic    14 年前

    我不确定,但我所知道的是,硬件时间表和进程片段由2x2块组成(用于计算导数)。这可能是 fxc 尝试展开for循环,以便在lockstep模式下执行着色器程序。

    你也试过用吗 [loop]