OpenGL ES 3.0在Android中提升glReadPixels的性能

4

我找到了一些加速OpenGL ES 3.0中glReadPixels的方法,但我不确定它是否有效。

  1. glReadPixels()的第五个参数指定为GL_BGRA,以避免不必要的交换。
  2. 使用PBO这里所述。

为了验证,我升级到了最新的Android SDK和ADT,并尝试使用OpenGL ES 3.0。然而,我无法找到我期望的GL_BGRA定义,也不知道如何使用glMapBuffer()。我错过了什么吗?

总结一下,

  • 有没有比使用glReadPixels()更快的访问帧缓冲区的方法?
  • 如何在Android上使用OpenGL ES 3.0的GL_BGRA和PBO?

如果有人知道,请指出来。一些代码片段会更好。提前感谢。


我尝试使用glMapBufferRange()代替glMapBuffer()。代码如下:GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, size, GLES30.GL_MAP_READ_BIT);但是,使用GLES20.glGetError()检测到返回了GL_INVALID_ENUM,有没有人知道怎么解决?谢谢。 - Justin
你为什么还在使用GLES20.glGetError,而不使用GLES30.glGetError呢? - Arttu Peltonen
我尝试使用GLES30.glGetError,它的结果是GL_INVALID_ENUM,与GLES20中定义的glGetError相同。 - Justin
在某些设备上,我发现GL_RGB和GL_RGBA之间的性能差异很大。我还没有尝试过BGRA,但我不确定有多少设备使用它作为本机格式。(如果我没记错的话,Mali设备会使用它。) - fadden
glReadPixels平均需要多少时间?另外,请提及您的纹理分辨率和设备规格,谢谢。 - bad_keypoints
1个回答

1
  1. 不一定。我不确定使用BGRA格式是否会提高性能,但值得一试。在ES 2.0中,GL_BGRA仅可通过扩展EXT_read_format_bgra获得,因此您需要使用枚举GL_BGRA_EXT,并且显然OpenGL ES 3.0也是如此。

  2. 是的,在OpenGL ES 3.0上,glMapBufferRange是正确的方法。根据 spec man page,glMapBufferRange不应生成GL_INVALID_ENUM错误,因此我认为这里可能出了其他问题。请确保错误不是由早期调用引起的。


  1. GLES20.GL_BGRA_EXT 无法解析或不是一个字段。(在GLES20.class、GLES30.class中未定义GL_BGRA_EXT)。它需要包含其他内容吗?
  2. 我也看了手册,所以感到很奇怪。也许你是对的,还有其他问题。我会尝试找出来。谢谢你的提示。
- Justin
谢谢您指出这一点。GL_BGRA来自于许多Windows示例之一。我在Android上切换为GL_RGBA了。 - c z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接