我真的需要从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一样快,但可能非常接近,再加上一些双倍或三倍缓冲,最终可以让你有一个不错的执行速度 –