2016-08-15 36 views
-2

我需要繪製數百個半透明圓圈作爲我的OpenCL管道的一部分。對於簡單渲染:OpenCL比OpenGL快嗎?

目前,我使用OpenGL(含alpha混合),同步(便攜)使用clFinish和glfinish在我的OpenCL隊列。

在OpenCL中執行此渲染任務會更快嗎? (假設管道的其餘部分已經在OpenCL中,並且如果沒有OpenCL兼容的GPU可用,則可以在CPU上運行)。

很容易與圓的情況下,簡單的測試函數代替光柵。混合函數需要從每個片段的目標紋理讀取一次。所以一個天真的OpenCL實現在理論上似乎更快。但是,也許OpenGL可以並行呈現不重疊的三角形(這在OpenCL中很難實現)?

+0

」*假設管道的其餘部分已經在OpenCL *中「你在說什麼管道的其餘部分? –

+0

我的應用程序中的處理管道。我用OpenCL計算一些圖像,然後需要渲染這些圓圈,然後再用OpenCL重新處理。 –

+0

如果您可以簡單地調用光柵化或光線投射。我不知道許多誰會認爲實現這些東西構成簡單的渲染給定一個專門的API,爲您做替代。 –

回答

3

基於OpenCL的處理速度會更快,但是只有,因爲您不必處理CL/GL互操作性,所以可能性很高。所有必須執行glFinish/clFinish這一事實是一個瓶頸。

這與固定功能與着色器硬件無關。這是關於擺脫同步。

現在,這並不意味着沒有錯誤使用OpenCL來渲染這些東西的方法。

不要想要做的就是用一個計算操作將顏色寫入內存,然後從另一個計算操作中讀取,混合並將它們寫回到內存。那種方式就是瘋狂。

什麼你應該做的,而不是被有效地建立內部基於區塊的渲染器。每個工作組將代表一些像素數(實驗以確定性能的最佳計數)。每個調用都在一個像素上運行。他們將使用它們的像素位置,進行數學運算以確定像素是否在圓內(以及它在圓內的數量),然後將其與內部調用的局部變量混合。所以每個調用都會處理所有圈的全部,只在最後寫出它們像素的數據值。現在

,如果你要聰明一點,你可以做撲殺,使每個工作組被授予只保證自己的特定區域內至少影響到一些像素的圓圈。這實際上是一個預處理過程,你甚至可以在CPU上這樣做,因爲它可能並不昂貴。 「