2014-10-26 90 views
0

我試圖從OpenGL視圖捕捉iOS上截圖,使用glReadPixels作爲原始分辨率的一半。 glReadPixels在視網膜屏幕上顯得很慢,所以我想以某種方式強制讀取每秒像素和每隔一行,導致非視網膜屏幕截圖(1/4分辨率)。glReadPixels指定分辨率

我嘗試設置這些:

glPixelStorei(GL_PACK_SKIP_PIXELS, 2); 
glPixelStorei(GL_PACK_SKIP_ROWS, 2); 

調用glReadPixels之前,但它似乎並沒有被完全改變任何東西。相反,它只渲染原始圖像的1/4,因爲我傳遞給glReadPixels的寬度和高度是視圖的非視網膜大小。另外,如果您知道捕獲OpenGL截圖的更多高性能方法,請隨時分享它。

+0

也許設定降低水庫越早通過指定降低水庫渲染目標(通過觀察口) – 2014-10-26 18:04:33

+0

謝謝,有兩個問題,這種方法: - 我想要的比賽實況圖像是全視網膜分辨率,只有截圖成爲1x水庫。 (出於所描述的性能原因) - 我正在使用SpriteKit,因此除了視圖本身以外,我沒有顯式訪問渲染目標的分辨率。我會看到我可以用視圖做什麼,但... – Maciej 2014-10-26 18:07:09

+0

你使用的是什麼OpenGL版本?看起來像ES 3.0,因爲'GL_PACK_SKIP_PIXELS'在ES 2.0中不可用? – 2014-10-26 18:46:57

回答

0

我不認爲有一個非常直接的方式來做你想找的東西。正如你已經發現的,GL_PACK_SKIP_ROWSGL_PACK_SKIP_PIXELS沒有你想要的功能。它們只控制開始時跳過多少行/像素,而不是每行/像素之後。我相信他們無論如何都控制着在目標內存中的跳躍,而不是在你正在閱讀的framebuffer中。

部分解決方案的一個簡單方法是每行調用一個單獨的glReadPixels()調用,然後您可以爲每第二行調用一次。您仍然需要複製這些行中的每個第二個像素,但至少它會將您讀取的數據量減半。它的確將內存的增加量減少到接近四分之一,因爲你只能以全分辨率存儲一行。當然,你有更多的電話撥打glReadPixels(),所以很難預測這是否會更快。

更好的方法是生成一個可以直接讀取的半分辨率幀。要做到這一點,你可以:

  • 如果你的工具包允許它,重新渲染幀的分辨率的一半。您可以使用FBO作爲渲染目標,具有窗口大小的一半。
  • 複製框架,同時在縮小過程中縮小框架。再次,創建一個大小爲一半的渲染目標的FBO,並使用glBlitFramebuffer()將默認幀緩衝區複製到此FBO。

您也可以考慮通過使用像素包緩衝區使得讀回異步(見GL_PACK_BUFFER參數glBindBuffer())。這很可能不會使操作更快,但它允許您在等待glReadPixels()結果到達時繼續向GPU提供命令。它可以幫助你截取屏幕截圖,同時減少對遊戲的干擾。

+0

這很有幫助,試試。 – Maciej 2014-10-27 10:10:53