2012-06-21 47 views
0

在GLSL ES中,是否可以按順序組成幾個片段着色器?我想使用兩個着色器S1和S2,其中S2使用由S1輸出的多個片段。例如,我想依次應用兩個卷積,在這種情況下,第二個卷積需要訪問第一個卷積的輸出,在一組像素位置。是否可以按順序組成着色器?

回答

1

是的,但是這需要使用兩種技術之一。 第一個最簡單的叫做多通道渲染。 其中,您將S1的結果渲染爲紋理,然後渲染S2從包含S1結果的紋理讀取。然而,這樣做效率不高,因爲它消除了GPU可能實現的一些並行性。所以通常建議您使用稱爲pipeling的東西。這有點複雜。

  1. 創建2 * N個紋理,其中N是着色器的數量。這樣每個着色器都可以同時具有讀取和寫入紋理。
  2. 立即渲染每個着色器,從着色器的讀紋理讀取紋理,然後寫入紋理。
  3. 在每幀結束時,交換讀取和寫入紋理。

這會導致同時計算多個迭代。但是每次迭代都在N次迭代後完成。

+0

不錯!我理解兩種方法,但爲什麼後者比前者更快?在流水線方法中,每個着色器操作的花費時間與在該節點上執行的所有操作的成本是否相等,而在多次渲染中,成本僅僅是一次操作的成本。難道是因爲有開銷妨礙了多遍渲染的N次執行和流水線迭代一樣快? –

+0

@AlexFlint GPU通常具有相當深的流水線,並且通常可以在渲染像素之前開始渲染其他東西。從正在渲染的紋理渲染讀取會導致圖形管道停頓,直到渲染在該紋理上完成。例如,在iPhone上,頂點在一幀中處理,而在下一個中處理片段。所以使用第一種技術會使它需要相當於3幀的渲染,從而將最大FPS降低到30。這與glReadPixels之類的速度較慢的原因相同。 –

+0

啊,我明白了。非常感謝花時間來解釋 - 真的很有幫助! –