我真的需要從GPU獲得每通道RGB 8個字節的緩衝區。 我需要它傳遞給訓練的卷積神經網絡,它只接受那種格式的數據。 我無法在CPU上進行轉換,因爲我CPU限制很大,而且速度很慢。在iOS上從OpenGL ES 3.0讀取RGB8緩衝區?
我現在有FBO附加有渲染,這是與定義: glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8_OES, bufferWidth, bufferHeight);
沒有錯誤,當我結合,定義和渲染到緩衝器。
但是,當我使用 glReadPixels(0, 0, bufferWidth, bufferHeight, GL_RGB, GL_UNSIGNED_BYTE, rgbBufferRawName);
它給出了一個無效的枚舉錯誤(0x0500)。當我通過GL_RED_EXT
或GL_RGBA
並生成正確的緩衝區時(我通過將這些緩衝區上載到紋理並渲染它們,並且它們看起來正確)來檢查它時,它工作得很好。
我試過設置glPixelStorei(GL_PACK_ALIGNMENT, 1);
但這沒有什麼區別。
我在iOS10和iPhone 6.我在做ES2.0,但現在嘗試切換到ES3.0,希望它能幫助我解決問題。它沒。
我真的很感謝以任何方式獲取RGB8緩衝區的幫助, 謝謝。
我會建議,而不是FBO與渲染緩衝區使用FBO與顏色紋理附件(和深度附件,如果您需要深度緩衝區),然後使用glGetTextureImage從它讀取數據。 glGetTextureImage接受GL_RGB格式,而glReadPixels不接受。 –
@VB_overflow'glGetTextureImage'在OpenGL ES 3.0上不可用=( – grisevg
我的壞,對不起。在這種情況下,我會建議使用一個像[這裏]描述的PBO(https://vec.io/posts/faster-alternatives-使用這種方法,你可以得到一個RGB到RGBA像素數據的ptr,所以不用像在這個例子中做一個memcpy一樣,你可以做一個只複製3個字節的循環( RGB),跳過一個(A)並重復......這不會像memcpy一樣快,但可能非常接近,再加上一些雙倍或三倍緩衝,最終可以讓你有一個不錯的執行速度 –