我正在尝试编写可以将帧缓冲从一张卡卸载到另一张卡的代码,我想知道是否有可能有效地使用压缩,因为在我的情况下内存似乎是瓶颈。
目前,我使用简单的回读&显示例程:
回读:
glWaitsync(..);
glReadPixels(.., GL_BGRA, GL_UNISGNED_BYTE, NULL);
GLvoid *data = glMapBuffer(GL_PIXEL_PACK_BUFFER_EXT, GL_READ_ONLY);
显示:
glGenBuffers(2, pbos);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_EXT, pbos[curr_ctx ^ 1]);
glBufferData(GL_PIXEL_UNPACK_BUFFER_EXT, width*height*4, NULL,GL_STREAM_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_EXT, pbos[curr_ctx]);
glBufferData(GL_PIXEL_UNPACK_BUFFER_EXT, width*height*4, NULL,GL_STREAM_DRAW);
...
glBufferSubData(GL_PIXEL_UNPACK_BUFFER_EXT, 0, width*height*4, data);
glDrawPixels(width, height, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_EXT, pbos[cur_ctx ^= 1]);
...
glXSwapBuffers(...);
还有一些通过互斥锁和其他杂项代码进行同步,但这是当前代码的主体。
不幸的是,内存带宽似乎是最大的问题(在显示卡方面,这是一种有能力的USB采集卡)。
有没有办法通过OpenGL压缩(S3TC)优化这个? 最好,我想压缩渲染卡,复制到RAM,然后向下游发送到捕获(显示)卡。
我相信我已经看到有些人通过将帧缓冲复制到纹理,要求GL压缩它来做到这一点,但坦率地说我是GL编程的新手。所以我想我会问这里。