如果您想与您的应用程序同步读取数据,从 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 “准备好”?