2016-09-15 27 views
1

我需要为我的片段着色器调用原子地将矢量添加到某些图像,因为更多的片段可以访问相同的纹素。如何在片段着色器中原子地添加矢量

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

每个片段应该添加两个向量,一个应具有16位的部件和其他8个组件。

我想过一个自旋锁,但每一个自旋锁我试图用崩溃......

另一种选择是用packSnorm2x16/4x8数据打包成3个R32UI纹理atomicAdd,首先将包含的xy 16位向量,所述第二将包含16位矢量的z和第三纹理将包含整个8比特向量(packSnorm4x8),但问题是,总和将超过1.0f,但(un)packSnorm正在与签名归一化值,我甚至不知道你是否可以添加打包的数据并获得好的结果。

+1

您是否考虑过其他选项来避免原子,比如在稍后的传递中累积矢量或者在计算着色器中使用本地组存储?你能详细说明你需要什么吗? – Quinchilion

+0

我从灯光角度渲染场景,每个片段都应该添加从光源到片段的方向为3D纹理,这些纹理包含我的体素化场景(用于体素锥形追踪),此刻我是只是存储从光线到体素中心的方向,但那不是准确的,我应该存储入射光线方向的平均向量。 – FamZ

+0

因此,如果我理解正确,那么每个片段都会沿着它的射线前进,并将射线方向添加到它穿过的每个体素?或者多个片段如何访问相同的纹理元素? – Quinchilion

回答

0

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

我原子加入矢量的每个分量到着色器存储缓冲器,对于我使用的NV_shader_atomic_float扩展。 然后,在计算着色器中,我使用浮点数来保存向量,以便将结果写入实际的3D纹理中。

相关问题