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
,这可能会使您的代码更简单。
我正在尝试在计算着色器 (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
,这可能会使您的代码更简单。