我需要我的片段着色器调用以原子方式向某些图像添加向量,因为更多片段可以访问相同的纹素。
所以我的问题是,最好的方法是什么?
每个片段应添加两个向量,一个应具有16位组件,另一个应为8位组件。
我想到了一个自旋锁,但我尝试使用的每一个自旋锁都崩溃......
另一种选择是将packSnorm2x16/4x8
的数据打包成R32UI
的3 atomicAdd
个纹理,第一个包含16位向量的xy
,第二个将包含16位向量的z
,第三个纹理将包含整个8位向量(packSnorm4x8
),但问题是总和将超过1.0f
,但{{1}我正在使用带符号的规范化值,我甚至不知道你是否可以只添加打包数据并获得良好的结果。
答案 0 :(得分:0)
我通过使用包含浮点数组的着色器存储缓冲区解决了这个问题。正如评论中所提到的,我试图将矢量存储到3D纹理中,SSB为3D纹理的每个纹素包含一个向量的每个分量的浮点数,还有一个浮点数,它保存了添加的向量数。这消耗了大量内存,但似乎没有更好的解决方案。
我将向量的每个组件原子地添加到着色器存储缓冲区,因为我正在使用NV_shader_atomic_float
扩展名。
然后,在计算着色器中,我使用浮点数来保存矢量用于平均并将结果写入实际的3D纹理。