相关疑难解决方法(0)

从OpenGL中的默认帧缓冲区读取像素数据:FBO与PBO的性能

我的目标是读取默认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)

c++ opengl

1
推荐指数
1
解决办法
923
查看次数

标签 统计

c++ ×1

opengl ×1