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



我正在尝试在计算着色器(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

相关内容

  • 没有找到相关文章

最新更新