2012-06-19 57 views
1

我正在做一個有很多計算的項目,我有一個想法是把一些工作扔給GPU,但是我想知道我們是否可以從GLSL檢索結果,如果它是可行的,怎麼樣?我們如何從GLSL獲取變量值?

+1

GLSL不用於通用GPU編程,因爲硬件和軟件接口是爲此目的而開發的。除非你需要編寫超過6年的GPU,否則這可能不是你想要的問題。 – Potatoswatter

回答

4

GLSL除了放置在幀緩衝區之外不提供輸出。

要編程GPU並更方便地獲得結果,請使用CUDA(僅限NVidia)或OpenCL(跨平臺)。

3

一般而言,您要做的是將OpenCL用於通用GPU任務。然而,如果你堅持假裝OpenGL不是渲染API ......

Framebuffer Objects使渲染到多個輸出變得相對容易。這當然意味着你必須構建你的處理過程,使得渲染的內容與你想要的相匹配。您可以渲染到32位浮點「圖像」,因此您可以獲得足夠的精度。最大的困難是我所說的:弄清楚如何構建你的任務來匹配渲染。

使用變換反饋比較容易一些。這是將頂點(或幾何)着色器處理的輸出寫入buffer object的功能。這仍然需要將您的任務構建爲像渲染一樣的東西,但更容易,因爲頂點着色器具有嚴格的一個頂點到一個頂點的映射。對於每個輸入頂點,都只有一個輸出。如果您繪製GL_POINTS,則使用屬性傳遞更改的數據並不困難。

使用shader_image_load_store更容易也更困難。這實際上是「隨時隨地」對任意圖像進行讀/寫的能力。我將最後一部分放在引號中,因爲有很多關於數據競爭條件的深奧規則:從另一個着色器調用等寫入的值中讀取數據。這些都是不是微不足道的處理。您可以嘗試通過在同一着色器中不寫入相同圖像位置來構造代碼以避免它們。但在很多情況下,如果你可以這樣做,你可以渲染幀緩衝區。

最終,在一般情況下回答這個問題幾乎是不可能的,不知道你想要實際做什麼正確。你如何通過渲染API來處理GPGPU很大程度上取決於你想要計算的內容。

相關問題