2008-12-15 33 views
2

我正在將某個場景渲染到屏幕外幀緩衝區(FBO),然後使用glReadPixels()讀取渲染圖像以在CPU上進行處理。處理涉及一些非常簡單的掃描例程和數據提取。新手來GPU編程:學什麼?

分析後,我意識到我的應用程序所做的大部分工作都花費在glReadPixels()以上 - 超過50%的時間。所以很自然的一步就是將處理移動到GPU上,這樣數據就不必複製。

所以我的問題是 - 什麼是將這樣的事情編程到GPU的最佳方式?
GLSL?
CUDA?
還有什麼我目前不知道的?
主要要求是它可以訪問渲染的屏幕外幀緩衝區(或紋理數據,因爲它可以渲染到紋理),並能夠輸出一些信息給CPU,比如按照順序每幀1-2Kb。

回答

1

有許多指針開始使用在其他問題GPU編程的,但如果你有一個使用OpenGL的已經構建的應用程序,那麼很可能你的問題真的是「哪一個互操作與OpenGL「?

畢竟,您的整個觀點是避免使用glReadPixels()從GPU讀取FBO到CPU的開銷。例如,如果您必須將其讀回來,然後將數據複製到CUDA緩衝區,然後使用CUDA API將其傳回到GPU,則沒有多大意義。

所以你需要一個GPGPU包,它將把你的OpenGL FBO對象直接作爲輸入,而不需要任何額外的複製。

這可能會排除除GLSL以外的所有內容。

我不是100%確定CUDA是否有任何直接在OpenGL緩衝區對象上操作的方法,但我不認爲它具有該功能。

我相信ATI的Stream SDK不會那樣做。 (雖然它可以與DirectX互操作)。

我懷疑計算着色器的DirectX 11「技術預覽」是否也具有該功能。

編輯:後續行動:它看起來像CUDA,至少最近的版本,有一些支持OpenGL互操作性。如果是這樣,那可能是你最好的選擇。