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

时间:2016-10-19 11:00:51

标签: opengl-es atomic compute-shader

是否可以在计算机着色器中进行缩减/更新或原子操作。 mat3vec3数据类型?

喜欢这个方案:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

第7.7节。

  

也许创建一个小的3x3 image2D并将结果存储在imageAtomicAdd中?

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

  

感谢您的链接。我忘了提到我使用ARM Mali GPU,因此他们没有公开TLP,也没有像Wvid或AMD那样的warp / wave前端。也就是说,我可能需要找出另一种快速方法。

在你的帖子的评论中提出的技术(特别是你将结果的上半部分折叠的log(N)除数方法)在Mali上仍然可以正常工作。该技术不依赖于warp / wavefronts - 正如原始海报所说,你只需要同步(例如使用barrier()而不是依赖于wavefronts会给你的隐含障碍。)