2011-02-23 92 views
1

我需要設置GLSL片段着色器來更改當前正在處理的片段以外的片段的顏色。由於這可能不太合適,我將提供一個非常簡短的上下文。通過GLSL設置鄰居片段顏色

該項目利用渲染通道,由此給定的模型被繪製到具有與紋理貼圖中的UV座標對應的唯一顏色的FBO中。然後對這些顏色進行採樣並轉換爲圖像座標,以便可以根據相機可見的內容更新模型的紋理貼圖。本質上:

Render model to FBO 
For each FBO pixel 
    1. sample secondary texture based on FBO pixel position 
    2. convert color at current pixel to image coordinate for the model's texture map 
    3. update model's texture with sampled secondary texture at calculated coordinate 
End loop 

問題是,目前的實現是非常CPU綁定,所以我讀取的FBO像素,然後操縱它們。理想的情況下,因爲我已經在片段着色器中使用了片段的顏色,所以我只想在流程的最後幾個步驟上加以注意,並將所有內容保留在GPU上。

我遇到的具體問題是我不知道如何(或者甚至有可能)讓片段着色器設置它未處理的片段的顏色。如果我不能通過使用一個特大的FBO來工作,只是抵消了我想設置顏色的片段,我可以直接寫入紋理嗎?

任何幫助/建議,非常感謝。謝謝!

回答

2

據我所知,需要在OpenGL中執行散射操作(統一的FBO像素空間 - >隨機網格UV紋理目標)。有一種方法可以做到這一點,因爲你可能期望並不是那麼簡單,甚至沒有那麼快,但我不能找到一個更好的:

  • 運行GL_POINTS類型和大小的繪製調用等於寬度*您的源FBO的高度。
  • 選擇模型紋理作爲目標FBO顏色層,不添加深度圖層
  • 在頂點着色器中,使用gl_VertexID計算原始屏幕座標。
  • 從源FBO紋理中採樣以獲取顏色和目標位置(假設您的原始FBO表面是紋理)。指定一個合適的gl_Position並將目標顏色傳遞給片段着色器。
  • 在片段着色器中,只需將顏色複製到輸出。

這將使GPU遍歷每個原始的FBO像素,並將計算出的顏色分散到目標紋理上。

+0

嗯..這是一個非常有趣的想法。湯米的方法更符合我已經實施的方式,所以我認爲我會先投入一些。不過,我也可以試試這個。 – Xenethyl 2011-02-23 23:15:41

+0

@ Xenethyl。我可能沒有完全理解你的任務,但從我所看到的 - 分散不能以@Tommy描述的方式實現。所以如果你認爲他的想法符合你的需求,那麼繼續下去,當然,因爲它比我的簡單得多。 – kvark 2011-02-24 00:01:02

+0

今晚晚飯後我想到這件事後,我開始意識到如何做乒乓球傳球並不能真正解決我的問題。我不知道你的解決方案是否適用於我目前的設置,但我認爲這比Tommy討論的更正確。現在我已經將這標記爲已接受。謝謝你指出我的誤解。 – Xenethyl 2011-02-24 03:03:19

5

無法將片段着色器寫入除正在處理的片段以外的任何位置。你可能想要做的是乒乓渲染。

在代碼中,你有三個紋理,符合上市的任務:

  1. 次要紋理
  2. 源模型紋理貼圖
  3. 目標模型紋理貼圖

第一次運行時,您可以使用(1)和(2)作爲源紋理,繪製到(3)。下一次通過循環你會使用(1)和(3)寫入(2)。然後你會切換回使用(1)和(2)寫入(3)。等等。 (2)和(3)與幀緩衝區對象連接,紋理以顏色緩衝區提供,代替渲染緩衝區。

在2009年,NVidia創作了GL_NV_texture_barrier extension,允許您將(2)和(3)壓縮爲單個紋理,只要您明確瞭解您正在閱讀的位置和您正在書寫的位置之間的分界線即可。我沒有專業知識來說明它有多廣泛。

試圖讀取和寫入相同的紋理(儘可能與FBO),否則在OpenGL中產生未定義的結果。在硬件層面提出問題與高速緩存和多重採樣有關。

+0

非常好,謝謝你的解釋。我在腦海中經歷了這一切,我想我會看到它如何爲我工作。 – Xenethyl 2011-02-23 22:23:43

+0

對不起,我拒絕接受這一點,但我認爲kvark是正確的,因爲做乒乓通行證實際上不會讓我寫信給任意位置......除非我錯過了某些東西? – Xenethyl 2011-02-24 03:13:06

+0

不,很對。我已經把這個請求作爲事情的一部分,不過希望我能以某種方式幫助。 – Tommy 2011-02-24 09:46:18