1

我正在尝试通过在 Android 4.3 上使用带有 opengl es 3.0 的 PBO 来进行快速像素读取。我的设备分辨率是 1280 * 720。

在调用 glReadPixels() 并获取像素数据后,我将数据编码为 JPEG 文件。

问题是,原始的opengl图像是1280 * 720,但jpeg就像,像素[0~720,0~720]矩形是90度旋转的opengl图像,[721~1280,0~720]是黑色(黑色似乎是垃圾数据)。

以下是我使用 pbo 和 glReadPixels() 的代码。

PS:经过一些研究,我发现

  1. 不使用pbo,直接调用glReadPixels(0, 0, 1280, 720, GL_RGBA, GL_UNSIGNED_BYTE, buffer_ptr); ,像素是正确的。jpeg文件没问题。

  2. 如果我在代码中将所有 720 更改为 1280,我可以获得整个 opengl 图像,右侧填充黑色。

你能帮忙指出问题吗?任何建议将不胜感激~非常感谢!

glGenBuffers(1, &pbo_id);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo_id);
glBufferData(GL_PIXEL_PACK_BUFFER, 1280 * 720 * 3, 0, GL_DYNAMIC_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

…… // 使用 OpenGL ES 3.0 绘制一些东西

……</p>

  glReadBuffer(GL_BACK);
  glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo_id);
  glReadPixels(0, 0, 1280, 720, GL_RGB, GL_UNSIGNED_BYTE, 0);
  buffer_ptr = (GLubyte *)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 1280 * 720 * 3, GL_MAP_READ_BIT);
  glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
  glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

…… // 编码为 jpeg

4

0 回答 0