2016-09-15 29 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紋理中。

相關問題