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