Directx HLSL:在结构中使用数组

Directx HLSL:在结构中使用数组,directx,shader,hlsl,Directx,Shader,Hlsl,我遇到了一个奇怪的HLSL行为。我尝试使用包含在结构中的数组,如下所示(像素着色器代码): 这段代码按照预期编译和工作。即使我在for循环前面添加了[loop]属性,这意味着它没有展开(这是一种正确的行为)。我不确定,但我知道的是,硬件计划和处理片段是按2x2块进行的(用于计算导数)。这可能是fxc尝试展开for循环以使着色器程序在锁步模式下执行的原因 您是否也尝试使用[loop]属性来生成使用流控制的代码?谢谢您的回复。实际上,我没有使用VSOUT结构来存储数组,是名为的结构造成了麻烦。我编辑

我遇到了一个奇怪的HLSL行为。我尝试使用包含在结构中的数组,如下所示(像素着色器代码):


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

我不确定,但我知道的是,硬件计划和处理片段是按2x2块进行的(用于计算导数)。这可能是
fxc
尝试展开for循环以使着色器程序在锁步模式下执行的原因


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

谢谢您的回复。实际上,我没有使用VSOUT结构来存储数组,是名为
的结构造成了麻烦。我编辑了我的帖子以显示工作代码。我尝试将数组打包为float4,但行为是相同的
[loop]
只是给出了一个稍微不同的消息:无法使用
[loop]
展开循环市场。我也并没有使用任何需要计算导数的ddx/ddy/sampler函数(至少不是有意的),啊,我现在明白了,这很奇怪。所以这与寄存器的使用无关。关于ddx/ddy,我认为无论您是否使用它,硬件都会按四元组处理片段,因为效率原因。你应该问问微软。也许这只是一个
fxc
编译器的限制。经过更多的测试之后,似乎除了将我的数组放在结构之外没有其他选择了。
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];
}
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];
}