如何避免 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++ 那样的引用系统,也没有实际的指针。因此,避免概念复制的唯一选择(实现可以并且 应该 已经对其进行了优化)是使用宏。
以下代码:
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++ 那样的引用系统,也没有实际的指针。因此,避免概念复制的唯一选择(实现可以并且 应该 已经对其进行了优化)是使用宏。