opengl - 使用像素缓冲区对象从 GPU 异步读取数据

标签 opengl buffer-objects

如果您想与应用程序的其余部分同步读取数据,那么从 GPU 获取数据似乎是一项非常缓慢的任务。一种可能性是在像素缓冲区对象的帮助下异步读取。不幸的是,我看不到这是如何完成的。

首先,我创建一个像素缓冲区对象:

glGenBuffers(1, &pbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBufferData(GL_PIXEL_PACK_BUFFER, pbo_size, 0, GL_DYNAMIC_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

然后我想从帧缓冲区对象中读取像素:

glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glReadPixels(0, 0, w, h, GL_RGBA, GL_FLOAT, 0);
GLfloat *ptr = glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, pbo_size, GL_MAP_READ_BIT);
memcpy(pixels, ptr, pbo_size);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

但这怎么是异步的呢? glReadPixels 或 glMapBufferRange 是否会阻塞应用程序直到 GPU“准备好”?

最佳答案

glReadPixels 调用应该开始复制到 cpu 可见缓冲区。 (无论何时提交给 GPU。您可以使用 glFlush 强制提交)。您正在异步开始读取。

glMapBufferRange 将强制 glReadPixels 调用完成(如果不是)(因为您现在正在访问 CPU 上的指针,所以没有办法解决)。

所以...不要连续执行 2 个操作,而是要晚得多。

关于opengl - 使用像素缓冲区对象从 GPU 异步读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34008077/

相关文章:

java - LWJGL 错误 - 无法找到 GL 函数 glVertexArrayVertexAttribDivisorEXT 的地址

opengl - GLEW 有什么作用,我为什么需要它?

OpenCL 缓冲区创建

opengl - 未明确指定绑定(bind)点索引的多个 UBO

opengl - 如何对点云的边界进行分割?

c++ - VAO 在 macOS 上呈现良好,但在 Linux 上呈现 INVALID_OPERATION

windows - Linux 和 Windows XP 上的 OpenGL 性能差异