2012-12-28 58 views
0

我正在研究OpenGL + GLSL的GPGPU編程。一個問題是如果你有一個需要很長時間才能完成的着色器,那麼取消它是不可能的。如何取消阻塞的OpenGL調用

設置好所有東西之後,我發出最後的glReadPixels調用,其中的所有像素都被渲染到幀緩衝區。根據着色器的不同,這可能需要很長時間,甚至幾秒鐘。有沒有辦法取消(從另一個線程)的調用,甚至查詢進度?如果在着色器中設置了無限循環,會發生什麼情況?

+0

正確的答案是阻止OpenGL阻塞調用是不可能的(這實際上是一個問題,因爲有些人擁有長時間計算的着色器)來自用戶空間。基本上,操作系統給OpenGL「一段時間」。如果openGL不能及時結束工作,那麼操作系統就會終止這個過程。但是,無論如何,您已經接受了如此好運的答案:D – GameDeveloper

+0

看到我的回覆,我基本上已經放棄了。 :-) –

回答

3

而不是glReadPixels你可以使用不阻塞的PixelBufferObjects。 glReadPixels將等待(在你的主線程中)結果,但是PBO將繼續...在代碼後面的某處你可以檢查PBO中的數據是否可用。

http://www.songho.ca/opengl/gl_pbo.html

http://www.opengl.org/wiki/Pixel_Buffer_Object

,如果你需要一些更高級的計算,那麼你可能需要使用OpenCL的,會給你更多的靈活性。

+0

+1爲PBO.It也被稱爲「異步轉移」對我來說,它提高了紋理下載高達80%。 –

+0

看起來像一個PBO與柵欄組合將會訣竅...但我需要這個工作在OpenGL ES 2.0以及iPad上(這也是爲什麼我不使用OpenCL)。但無論如何,一個很好的答案,謝謝! –

0

如果在着色器中設置了無限循環,會發生什麼情況?

我想你會得到視頻驅動程序的崩潰。

+0

因爲「我認爲」並不意味着什麼。我只是在一張較舊的ATI卡上試過,如果它在每個像素的基礎上運行時間過長,驅動程序在這裏終止着色器,而沒有任何錯誤報告。可能這是供應商特定的。 –

+0

我嘗試了更多,並且驅動程序確實在Windows Vista上兩秒鐘後崩潰,因爲Windows強制它。由於「我認爲」,我仍然保持低調:你沒有提供一個很好的解釋爲什麼崩潰會發生。 –

+0

這種情況在文檔中沒有描述。我遇到非常慢着色器崩潰時的經驗(我認爲它與http://nvidia.custhelp.com/app/answers/detail/a_id/3007,http://msdn.microsoft.com/en -us /窗/硬件/ gg487368.aspx)。如果我的着色器從紋理讀取很多數據(大約1000次讀取操作),我也崩潰了。我想寫一個關於「我認爲」的問題的評論,但我不能發表評論。 – Unick