2013-07-12 23 views
2

有沒有人熟悉某種OpenGL魔術擺脫計算片段着色器中的一串像素而不是隻有1?特別是對於OpenGL ES來說,這個問題實際上意味着缺乏移動平臺,並且需要更加精確(在性能意義上)的方式。是否可以在gl_FragColor中編寫一組像素?

有任何結論或想法嗎?

P.S.由於GPU架構組織針對每個紋理monad並行運行,因此已知着色器。但也許有技巧將它從一個像素提升到一組像素,或者實現您自己的glTexture組織。在GPU中可以更快地完成很多工作。

+0

'-1' *大量的工作可以GPU內更快地完成這種方式。*的任何證據嗎?這聽起來更像是一廂情願的想法/咆哮而不是實際的技術問題。投票結束。 GPU的構建方式完全是因爲速度更快。它可能是內部使用一個單位來計算一堆碎片;無論如何,它超出了OpenGL的範圍。 –

+0

@BartekBanachewicz我同意,但不會投票結束 - 讓我們告訴他爲什麼不。 –

+0

@BartekBanachewicz請檢查[這裏](http://www.stanford.edu/class/cs448f/lectures/3.1/Fast%20Filtering%20Continued.pdf)是我的一點要說_A很多工作可以更快地執行這樣在GPU_中。我們必須記住,GPU是以這種方式構建的,因爲它對大多數(但不是全部)情況來說速度更快。圖像處理具有廣泛的任務(例如平滑),其輸出取決於相鄰像素的局部區域。這就是爲什麼純並行實現執行起來很糟糕的原因。但是你是對的,它已經超出了OpenGL的範圍。 –

回答

4

的OpenGL不支持着色器寫入多個片段,我認爲有很好的理由。幾乎在所有情況下,它運行速度會非常慢。正如你所提到的,GPU被設計用來設置數據,並且使用着色器並行處理它。我想象如果GPU有足夠的並行處理器,計算每個片段的時間只有最密集的單個片段(顯然在基於瓦片的渲染器等的較小規模上)。增加某種有條件的覆蓋率將極大地減緩這一過程並消除流水線! GPU幾乎被迫放棄並行處理,因爲如果不確定已經進行的操作不會覆蓋它,它就永遠不會啓動新的碎片。

+1

謝謝,夥計們,在裏面。將混合動力(並行與隨之而來的)功能集成到GPU似乎很乏味,這就是爲什麼現在這是不可能的。一切都很清楚。 –

3

那麼首先你需要可以在OpenGL 3及更高版本中計算單個片段着色器的多個輸出。幀緩衝區對象可以附加多個RGBA曲面(渲染緩衝區對象),並通過使用gl_FragData [n]而不是gl_FragColor爲每個RGBA曲面生成RGBA。請參閱第5版OpenGL SuperBible的第8章。

然而,只能爲相同的X來產生多個輸出,Y象素座標每個緩衝器。這是出於同樣的原因,舊樣式片段着色器只能生成一個輸出,並且不能更改gl_FragCoord。 OpenGL保證在渲染任何基元時,唯一的一個片段着色器將寫入目標幀緩衝區中的任何X,Y像素。

如果一個片段着色器可以產生不同的X多的像素值,Y COORDS,它可能會試圖寫入同一個目的地像素爲同一片段着色器的另一個執行。如果片段着色器可以更改像素X或Y,則相同。這是試圖更新共享內存問題的經典多線程。

一個解決這個問題的辦法是說「如果發生這種情況,結果是不可預知」這一現象從程序員角度吸收,因爲它完全在你的控制。或者片段着色器必須鎖定正在更新的像素,這會使GPU變得更加複雜和昂貴,並且性能會變差。或者片段着色器會以某種定義的順序執行(例如左上角到右下角),而不是並行執行,不需要鎖定,但性能會更高。

相關問題