2015-01-12 54 views
4

如何使用OpenGL着色器修改現有的紋理/幀緩衝區而不使用第二個紋理或幀緩衝區?這甚至有可能嗎?運行OpenGL着色器修改現有的紋理/幀緩衝區

+1

不,你需要一個單獨的緩衝區來保持舊的,而你正在寫新的,你只是無法繞過。 –

+0

因此,使用與採樣器和幀緩衝區相同的紋理是不可能的? – jjxtra

+0

想一想,如果片段着色器對先前調用已寫入的像素進行採樣,OpenGL可以防止程序員犯這個錯誤 –

回答

5

起初: 這在技術上是可行且安全的讀取和使用this extension在同一通寫 - 但是我不建議這一點,尤其是對學生,因爲擴展緊緊有限,可能不支持在每個硬件上。

話雖這麼說:

所以它不可能使用相同的紋理作爲採樣和幀緩衝?

您可以使用紋理作爲一個幀緩衝材質附着相同,渲染它,作爲一個紋理採樣器查找值在着色器,但不在同一通。這意味着,如果您有兩個紋理,您可以從A讀取並寫入B,然後切換紋理並從B中讀取並寫入A.但是從來沒有A-> A或B-> B(沒有提及的擴展名)。

作爲一個技術細節,當前被用作目標的紋理也可以同時綁定到採樣器着色器變量,但是您不能使用它。

所以我們假設我想模糊紋理的一小部分。我必須通過着色器運行到第二個紋理,然後將該紋理複製回第一個紋理/幀緩衝區?

第二個紋理是。但出於效率原因,請勿複製紋理數據。只需刪除源紋理並使用將來渲染的目標紋理即可。如果必須經常這樣做,請將源紋理保留爲渲染目標,以備將來使用,以提高性能。如果你不得不這樣做,那麼每一幀都只是在每一幀交換紋理。開銷很小。

+0

或者如果你有多個通行證你需要做,那麼只是在同一幀中來回渲染。 –

相關問題