2012-04-11 109 views
1

使用圖像的加載和存儲,我想這樣做在GLSL 4.2以下:GLSL 4.2圖像的加載和存儲與內存屏障

vec3 someColor = ...; 
vec4 currentPixel = imageLoad(myImage, uv); 
float a = currentPixel.a/(currentPixel.a+1.0f); 
vec4 newPixel = vec4(currentPixel.rgb*a+someColor*(1.0f-a),currentPixel.a+1.0f); 
imageStore(myImage, uv, newPixel); 

關於「UV」的值可以作爲多個光柵化的像素是相同的。爲了得到正確的結果,我當然不希望其他的sharerexecution在imageLoad()和imageStore()的調用之間寫入我的像素中。

這是可能用memoryBarrier做某事嗎?如果是這樣,這個代碼如何使用?

回答

2

對於多個光柵化像素,'uv'的值可以相同。

然後你不能這樣做。

memoryBarrier不是創建原子操作的方法。它只有只有保證了單個着色器操作的順序。因此,如果特定的着色器調用讀取圖像,將其寫入並再次讀取,則需要一個memoryBarrier以確保讀取的內容是之前寫入的內容。如果某些其他着色器調用寫到它,那麼你運氣不好(除非它是一個依賴調用。這些東西的規則很複雜)。

如果您正在嘗試編程混合,那麼您需要確保每個片段着色器調用讀取/寫入到唯一的值。否則,它不會工作。

你不會說你想要實現的是什麼,所以不可能提供一個更好的方式來獲得你想要的東西。我只能說這個的方式是不行的。

+0

好嗎 - 已thoght左右。非常感謝您的澄清。是的,我嘗試做混合。我可以使用ImageAtomicAdd(..,vec4(someColor,1.0f)),並在讀取除以它們的.a值的像素 - 但問題是,像素最初已經有一個顏色以及一個重量,這個重量是介於0和1之間 – user1282931 2012-04-12 09:38:34

+0

@ user1282931:如果您嘗試進行混合,爲什麼您有多個片段寫入相同的值? – 2012-04-12 17:43:28

+0

它是反射映射上的一種反投影。呈現的反射以及每個像素的對象正常,並且由此反射圖應該是近似的 - 因此多個片段可以映射到相同的反射紋素,並且爲了避免我想要使用混合的噪聲 – user1282931 2012-04-12 18:44:49

0

您需要實現鎖定系統(鎖定/互斥鎖)。 爲此,最好使用imageAtomicCompSwap或使用緩衝區atomicCompSwap。當然,你需要使用全局變量(比如紋理)而不是局部變量。

爲了實現目的,我認爲這個問題是很大一部分回答您的問題:Is my spin lock implementation correct and optimal?