我的目标是读取默认OpenGL帧缓冲区的内容并将像素数据存储在a中cv::Mat.显然有两种不同的方法可以实现这一目标:
1)同步:使用FBO和 glRealPixels
cv::Mat a = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3);
glReadPixels(0, 0, 1920, 1080, GL_BGR, GL_UNSIGNED_BYTE, a.data);
Run Code Online (Sandbox Code Playgroud)
2)异步:使用PBO和 glReadPixels
cv::Mat b = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo_userImage);
glReadPixels(0, 0, 1920, 1080, GL_BGR, GL_UNSIGNED_BYTE, 0);
unsigned char* ptr = static_cast<unsigned char*>(glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY));
std::copy(ptr, ptr + 1920 * 1080 * 3 * sizeof(unsigned char), b.data);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
根据我在此主题上收集的所有信息,异步版本2)应该更快.但是,比较两个版本的经过时间会产生差异通常是最小的,有时版本1)事件优于PBO变体.
对于性能检查,我插入了以下代码(基于此答案):
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
....
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::microseconds>(end …Run Code Online (Sandbox Code Playgroud)