DirectX 计算着色器:如何编写具有可变数组大小参数的函数?

DirectX compute shader: how to write a function with variable array size argument?

我正在尝试在计算着色器 (HLSL) 中编写一个函数,该函数接受作为不同大小数组的参数。编译器总是拒绝它。

示例(无效!):

void TestFunc(in uint SA[])
{
   int K;
   for (K = 0; SA[K] != 0; K++) {
       // Some code using SA array
   }
}

[numthreads(1, 1, 1)]
void CSMain(
    uint S1[] = {1, 2, 3, 4 };  // Compiler happy and discover the array size
    uint S2[] = {10, 20};  // Compiler happy and discover the array size

    TestFunc(S1);
    TestFunc(S2);
}

如果我在 TestFunc() 中给出一个数组大小,那么编译器在调用 TestFunc() 时会很高兴传递该特定数组大小但拒绝调用另一个大小。

不能有大小不确定的函数参数。 您需要初始化一个已知长度的数组,以及一个保存数组长度的 int 变量。

void TestFunc(in uint SA[4], in uint saCount) 
{  int K; 
   for (K = 0; SA[K] != 0; K++)
     { 
        // Some code using SA array, saCount is your array length;
      }
 }

[numthreads(1, 1, 1)] 
 void CSMain()
{
 uint S1count = 4;
 uint S1[] = {1, 2, 3, 4 };
 uint S2count = 2;
 uint S2[] = {10, 20,0,0}; 
 TestFunc(S1, S1count); 
 TestFunc(S2, S2count);
 }

在我的示例中,我将数组的最大大小设置为 4,但如果需要,您可以将其设置得更大。您还可以为不同的数组长度设置多个函数,如果您的数据溢出数组最大大小,则设置多个传递。

编辑以回复评论 问题是 函数参数的数组维数必须显式 作为编译器错误状态。这是无法避免的。但是,您可以做的是完全避免传递数组。如果您在 CSMain 中内嵌 TestFunc,则可以避免传递数组,并且您的例程可以编译和运行。我知道它会使您的代码更长且更难维护,但这是使用未指定长度的数组执行您想要的操作的唯一方法。优点是通过这种方式您可以访问 array.Length,这可能会使您的代码更简单。