这个问题的解决方法是使用Pixel Buffer Object(PBO)的方式,可以优化复制像素的性能。这里提供一个参考的代码示例:
GLuint pbo;
glGenBuffers(1, &pbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBufferData(GL_PIXEL_PACK_BUFFER, size, NULL, GL_STREAM_READ);
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, 0);
GLubyte ptr = (GLubyte)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
// 如需使用ptr中的数据,请在此处理
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
// 将ptr中的数据复制到纹理或者其他需要的地方
glBindTexture(...);
glTexSubImage2D(..., ptr);
// 清空PBO
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBufferData(GL_PIXEL_PACK_BUFFER, size, NULL, GL_STREAM_READ);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
通过这个示例,可以将glReadPixels读取的像素数据存储在PBO中,然后将其复制到需要的地方,而这个过程中出现的GPU-CPU数据交互将会减少。