如何在片段着色器中以原子方式添加向量

时间:2016-09-15 17:59:51

标签: opengl glsl

我需要我的片段着色器调用以原子方式向某些图像添加向量,因为更多片段可以访问相同的纹素。

所以我的问题是,最好的方法是什么?

每个片段应添加两个向量,一个应具有16位组件,另一个应为8位组件。

我想到了一个自旋锁,但我尝试使用的每一个自旋锁都崩溃......

另一种选择是将packSnorm2x16/4x8的数据打包成R32UI的3 atomicAdd个纹理,第一个包含16位向量的xy,第二个将包含16位向量的z,第三个纹理将包含整个8位向量(packSnorm4x8),但问题是总和将超过1.0f,但{{1}我正在使用带符号的规范化值,我甚至不知道你是否可以只添加打包数据并获得良好的结果。

1 个答案:

答案 0 :(得分:0)

我通过使用包含浮点数组的着色器存储缓冲区解决了这个问题。正如评论中所提到的,我试图将矢量存储到3D纹理中,SSB为3D纹理的每个纹素包含一个向量的每个分量的浮点数,还有一个浮点数,它保存了添加的向量数。这消耗了大量内存,但似乎没有更好的解决方案。

我将向量的每个组件原子地添加到着色器存储缓冲区,因为我正在使用NV_shader_atomic_float扩展名。 然后,在计算着色器中,我使用浮点数来保存矢量用于平均并将结果写入实际的3D纹理。