2013-05-06 44 views
0

在OpenGL中作爲一種過濾器使用的標準過程是什麼?當我說過濾器時,我的意思是像邊緣檢測。例如,假設我想將SSAO過濾器應用於FBO。是否將FBO和深度緩衝區綁定到紋理,然後在使用着色器繪製到單獨的FBO時在相機前繪製四邊形?這就是我迄今爲止所做的,但這有點令人討厭。我想知道大多數人使用的慣例。我可能在這裏錯過了一些相當大的東西。我正在使用LWJGL,所以如果有問題,請勿過量使用。OpenGL使用着色器作爲過濾器

+1

爲什麼你覺得它煩人?你會如何期待這在OpenGL中起作用? – 2013-05-07 05:58:11

回答

2

這正是常見的做法。將場景繪製成一個或多個紋理(通過使用FBO),然後通過繪製帶紋理的屏幕大小的四邊形將這些紋理饋送到過濾着色器,將結果渲染到另一個紋理(通過使用另一個或同一個FBO)或者在完成時直接進入默認(顯示)幀緩衝區。

如今(與OpenGL 4.3硬件和驅動程序),你有另一種選擇。您也可以使用Compute Shader來完成這些任務。這基本上是一種特殊的着色器,與所有其他着色器階段相比,它不是通常的圖形管道的一部分,但是可以將通用GPGPU編程模型(從CUDA或OpenCL中已知)展示給OpenGL,同時能夠使用全部OpenGL數據結構和功能,如圖像加載/存儲或紋理過濾。 (實際上,人們也可以使用CUDA或OpenCL,它們允許與OpenGL進行互操作,但這樣做相當麻煩,而且不適合像圖像過濾那樣適合圖形領域的任務。和互操作開銷使這是一個可用的替代品。)

+0

我想我認爲只是畫一個屏幕大小的四邊形將是「不專業」或什麼的。至少現在我不必更改我的代碼!感謝Compute Shaders的額外信息。 – Abaab 2013-05-07 14:48:35

+0

@Abaab好吧,在某種程度上,它確實是一個黑客,濫用非圖形任務的圖形管道(好吧,圖像過濾仍然是圖形相關的,但它並不真的需要硬件的專用光柵化功能,真的是一個經典GPGPU任務)。這就是GPGPU在CUDA之前完成的工作...... – 2013-05-07 16:00:25

+0

@Abaab ...正確的(或*「professional」*)方法是使用實​​際的計算框架(CUDA/OpenCL),但由於我們已經在OpenGL應用程序中,必要的互操作開銷(如*「編程開銷」*而不是*「運行時開銷」*)不值得。但幸運的是,計算着色器改變了這種情況,因爲它們很好地融入了OpenGL的其餘部分,並且沒有任何圖形計算互操作開銷。 – 2013-05-07 16:01:01

1

這就是你如何做,畫屏幕大小的四邊形。您需要告訴OpenGL屏幕的哪一部分需要過濾,並且由於OpenGL是一個光柵化器,它需要對該部分進行光柵化處理,以便知道將哪些信息輸入到片段着色器中,因此需要四邊形。