2015-12-04 37 views
0

我可以訪問和更改Fragmentshader中某個位置的另一片段的輸出值嗎?在Fragmentshader OpenGL中訪問不同的片段

例如在main()循環中,我處理所有事情就像平常一樣,並輸出具有某個值的顏色。但除此之外,我還希望位置vec3(5,3,6)處的片段(在世界座標中)具有相同的顏色。

現在我已經在網上做了一些研究。 OpenGL網站說,片段着色器有一個片段作爲輸入,並且有一個片段作爲輸出,這聽起來不太有希望。 另外我知道所有片段正在並行處理。但是也許可以說,如果這個位置上的片段還沒有被處理,就把這個顏色寫入它,並且把這個片段作爲已經處理的片段。

我是有人可以解釋,如果這是可行的,如果不是,爲什麼這不是一個好主意。我最好的猜測是,將這個邏輯構建到着色器中,會對整體性能產生非常不利的影響。

回答

2

我是有人可以解釋,如果這是可行的,如果不是,爲什麼這不是一個好主意。

這不是一個壞主意和好主意的問題。這根本不可能。

最接近此功能的是ARB_fragment_shader_interlock。通過它的互鎖和訂購保證,它允許有限的互操作。這個限制是......它只允許覆蓋相同像素/樣本的片段進行互操作。

因此,即使此功能不允許您寫入其他像素。

絕對最好你能做的就是利用SSBOs和原子櫃檯有片段着色器編寫「世界座標」是什麼顏色值,所以他們喜歡寫,然後有第二個過程執行該緩衝區或者渲染命令或計算着色器來實際編寫該數據。

0

正如在尼科爾的答案已經指出的那樣,你不能寫在片段着色器幀緩衝區表面的額外片段。

你的使用情況的說明不夠明確的告訴了可能是最好的。爲了集思廣益,想到的最直接的方法是根本不使用幀緩衝繪圖表面,而是輸出到圖像。

如果你綁定一個紋理圖像,你可以寫它在使用imageStore()內置功能片段着色器。此函數將座標作爲參數之一,因此您可以寫入任何想要的像素,也可以從相同的着色器調用中寫入多個像素。

根據你想要達到的目標,我也可以想象一種混合方法,你的主渲染仍然會進入幀緩衝區,但是你可以在圖像的所需位置寫入額外的像素值。然後,在第二次渲染過程中,可以將圖像的內容與主渲染相結合。如果數學/邏輯足夠簡單,可以用混合來完成組合。如果需要更復雜的組合中,可以使用一個紋理作爲初始遍的幀緩衝區附着,然後使用的渲染和作爲兩個輸入用於組合遍的片段着色器的額外圖像的結果。