2016-12-07 164 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