0

我正在尝试在计算着色器(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() 传递该特定数组大小但拒绝调用另一个大小时会很高兴。

4

1 回答 1

1

您不能有不确定大小的函数参数。您需要初始化一个已知长度的数组,以及一个保存数组长度的 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,但如果需要,您可以将其设置得更大。您还可以为不同的数组长度设置多个函数,如果您的数据超出数组最大大小,可以设置多个通道。

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

于 2019-08-23T11:14:30.187 回答