是否可以使用 OpenGL 计算着色器对 mat/vec 类型进行缩减或原子操作?

Is a reduction or atomic operation on mat/vec types with OpenGL compute shader possible?

是否可以在计算机着色器中执行 reduction/update 或原子操作,例如mat3vec3 数据类型?

喜欢这个方案:

some_type mat3 A;
void main() {
    A += mat3(1);
}

我尝试过使用着色器存储缓冲区对象 (SSBO),但似乎更新不是原子的(至少当我读回缓冲区时我得到了错误的结果)。

有没有人有实现这一点的想法?也许创建一个微小的 3x3 image2D 并将 imageAtomicAdd 的结果存储在那里?

GLES 3.1 中有基于缓冲区的原子。

https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf

第 7.7 节

Maybe creating a tiny 3x3 image2D and store the result by imageAtomicAdd in there?

图像原子不是核心,需要扩展。

Thank you for the links. I forgot to mention that I work with ARM Mali GPUs and as such they do not expose TLP and do not have warps/wave fronts as Nvidia or AMD. That is, I might have to figure out another quick way.

评论中针对您的 post 提出的技术(特别是将结果的上半部分向下折叠的 log(N) 除数方法)在马里仍然可以正常工作。该技术不依赖于 warps/wavefronts - 正如最初的 poster 所说,您只需要同步(例如使用 barrier() 而不是依赖波前会给您的隐式屏障) .