2016-12-07 117 views
4

我真的需要從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_EXTGL_RGBA並生成正確的緩衝區時(我通過將這些緩衝區上載到紋理並渲染它們,並且它們看起來正確)來檢查它時,它工作得很好。

我試過設置glPixelStorei(GL_PACK_ALIGNMENT, 1);但這沒有什麼區別。

我在iOS10和iPhone 6.我在做ES2.0,但現在嘗試切換到ES3.0,希望它能幫助我解決問題。它沒。

我真的很感謝以任何方式獲取RGB8緩衝區的幫助, 謝謝。

+0

我會建議,而不是FBO與渲染緩衝區使用FBO與顏色紋理附件(和深度附件,如果您需要深度緩衝區),然後使用glGetTextureImage從它讀取數據。 glGetTextureImage接受GL_RGB格式,而glReadPixels不接受。 –

+0

@VB_overflow'glGetTextureImage'在OpenGL ES 3.0上不可用=( – grisevg

+0

我的壞,對不起。在這種情況下,我會建議使用一個像[這裏]描述的PBO(https://vec.io/posts/faster-alternatives-使用這種方法,你可以得到一個RGB到RGBA像素數據的ptr,所以不用像在這個例子中做一個memcpy一樣,你可以做一個只複製3個字節的循環( RGB),跳過一個(A)並重復......這不會像memcpy一樣快,但可能非常接近,再加上一些雙倍或三倍緩衝,最終可以讓你有一個不錯的執行速度 –

回答

1

根據OpenGL 3.0規範,GL_RGB對於格式不是有效值。

https://www.khronos.org/opengles/sdk/docs/man3/html/glReadPixels.xhtml

你可能想要麼將其轉換爲RGB檢索GL_RGBA格式化緩衝區,或調整算法來補償RGBA後。

+0

那麼,在GPU上無法做到這一點? – grisevg

+0

我不確定你的算法是如何工作的,但是如果你打算完全使用GLSL在GPU上完成它,你可以做兩遍。在第一遍中,您可以將場景渲染爲紋理,並在第二遍中運行算法。輸出可以在屏幕上使用glReadPixels讀取值,也可以寫入統一變量並在運行後從着色器讀取。 – Stephen

+0

我正在談論獲取GL_RGB8緩衝區......也許如果我切換到金屬將有一種方法。在iOS上,像GL_RED這樣的奇特事物工作得很好,但GL_RGB不會......但我猜我的用例是非常獨特的。我認爲我只需要破解神經網絡來接受RGBA並跳過alpha,但它會變得非常醜陋和笨拙 – grisevg