glsl - 我可以将常量传递给函数而不将常量复制到参数中吗?
glsl - Can I pass a constant to a function without the coping the constant into the parameter?
我有一个 glsl 函数 可以接受几个常量数组之一,并使用该数组中的信息进行一些操作。例如:
const uint A[] = { /* 10 values here */ };
const uint B[] = { /* 10 different values here */ };
const uint C[] = { /* 10 different values here */ };
float doSomethingWithArray(const uint arr[10], float x){
// do some operations which use the constant array and a non-constant value. Eg:
uint a = arr[floor(x)];
uint b = arr[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
如果我要调用此函数,将常量数组之一作为参数传递 doSomethingWithArray(A, 5.0)
,我担心数组会被复制到参数中,从而减慢程序速度。
https://www.khronos.org/opengl/wiki/Core_Language_(GLSL)#Parameters
values passed to functions are copied into parameters when the function is called
这让我觉得拥有 3 个独立的函数会更快,每个函数都使用不同的常量数组。这样,就不必复制数组。例如:
float doSomethingWithA(float x){
uint a = A[floor(x)];
uint b = A[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
float doSomethingWithB(float x){
uint a = B[floor(x)];
uint b = B[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
float doSomethingWithC(float x){
uint a = C[floor(x)];
uint b = C[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
但是,这会导致大量重复代码,尤其是在有更多常量数组的情况下。有没有办法在不复制数组且不重复代码的情况下执行此操作?
我正在使用 glslc 编译成 .spv。
不使用 Vulcan,因为我的 gfx 卡不支持它,但在 GLSL 中,我可以随意使用该函数,而不是像这样:
#define doSomethingWithArray(arr,x) ((arr[arr[floor(x)]] * 2 + 3 + arr[floor(x)]) * x)
宏将为您硬编码 3 个实例...这是一个示例(片段着色器):
#version 420 core
out layout(location=0) vec4 col;
#define test(arr,x) ((arr[arr[int(floor(x))]] * 2 + 3 + arr[int(floor(x))]) * x)
const uint A[]={0,1,2,3,4,5,6,7,8,9};
const uint B[]={1,2,3,4,5,6,7,8,9,0};
const uint C[]={2,3,4,5,6,7,8,9,0,1};
void main()
{
float x=3.75;
col=vec4(test(A,x),test(B,x),test(C,x),1.0);
}
#version 420 core
是第一个不会对您在我的 nVidia
上使用的东西(如 const 数组等)抛出一堆警告和错误的版本
我有一个 glsl 函数 可以接受几个常量数组之一,并使用该数组中的信息进行一些操作。例如:
const uint A[] = { /* 10 values here */ };
const uint B[] = { /* 10 different values here */ };
const uint C[] = { /* 10 different values here */ };
float doSomethingWithArray(const uint arr[10], float x){
// do some operations which use the constant array and a non-constant value. Eg:
uint a = arr[floor(x)];
uint b = arr[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
如果我要调用此函数,将常量数组之一作为参数传递 doSomethingWithArray(A, 5.0)
,我担心数组会被复制到参数中,从而减慢程序速度。
https://www.khronos.org/opengl/wiki/Core_Language_(GLSL)#Parameters
values passed to functions are copied into parameters when the function is called
这让我觉得拥有 3 个独立的函数会更快,每个函数都使用不同的常量数组。这样,就不必复制数组。例如:
float doSomethingWithA(float x){
uint a = A[floor(x)];
uint b = A[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
float doSomethingWithB(float x){
uint a = B[floor(x)];
uint b = B[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
float doSomethingWithC(float x){
uint a = C[floor(x)];
uint b = C[a] * 2 + 3;
float c = (b + a) * x;
return c;
}
但是,这会导致大量重复代码,尤其是在有更多常量数组的情况下。有没有办法在不复制数组且不重复代码的情况下执行此操作?
我正在使用 glslc 编译成 .spv。
不使用 Vulcan,因为我的 gfx 卡不支持它,但在 GLSL 中,我可以随意使用该函数,而不是像这样:
#define doSomethingWithArray(arr,x) ((arr[arr[floor(x)]] * 2 + 3 + arr[floor(x)]) * x)
宏将为您硬编码 3 个实例...这是一个示例(片段着色器):
#version 420 core
out layout(location=0) vec4 col;
#define test(arr,x) ((arr[arr[int(floor(x))]] * 2 + 3 + arr[int(floor(x))]) * x)
const uint A[]={0,1,2,3,4,5,6,7,8,9};
const uint B[]={1,2,3,4,5,6,7,8,9,0};
const uint C[]={2,3,4,5,6,7,8,9,0,1};
void main()
{
float x=3.75;
col=vec4(test(A,x),test(B,x),test(C,x),1.0);
}
#version 420 core
是第一个不会对您在我的 nVidia