如何避免 GLSL 按值复制?

How to avoid GLSL copy by value?

以下代码:

layout (set = 0, binding = 0) readonly buffer TestBuffer {
    float[32] probs;
} args;

void main() {
    const float[] ps = args.probs;
}

创建浮点数组的深层副本,即复制所有数组成员。我原以为 const 限定符会使 ps 只是 args.probs 的别名,就像将它传递给带有 const in 限定符的函数一样。

再次复制数组,如const float[] ps2 = ps,仅复制引用。

有没有没有运行时开销的方法来做到这一点?当然,在现实世界中 args 更大并且包含嵌套的结构数组,因此能够引用它的一小部分是有用的,但由于巨大的性能损失而不实用。

在我看来,您在这里唯一要做的就是为较长的名称创建一个较短的名称。也就是说,如果 args.probs 类似于 args.foo[30].bar.whatever,您希望将该特定数据称为 ps

这可能最好使用宏来完成:#define ps args.probs。现在显然,这有缺点。例如,宏没有词法作用域;您明确必须 #undef 它们以防止这些名称泄露。

但是 GLSL 没有像 C++ 那样的引用系统,也没有实际的指针。因此,避免概念复制的唯一选择(实现可以并且 应该 已经对其进行了优化)是使用宏。