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 数组等)抛出一堆警告和错误的版本