gpt4 book ai didi

opengl - glReadPixels 第二次读取失败

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:21 27 4
gpt4 key购买 nike

下面的代码工作正常

const char *title = "glReadOutput";
Mat out1, out2;

out1.create(screenHeight,screenWidth, CV_8UC3);
out2.create(screenHeight,screenWidth, CV_8UC3);

RenderObject();
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)out1.data);
//flip(out1, out1, 0);
imshow(title, out1);
waitKey(5000);

RenderObject();
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)out2.data);
//flip(image, out2, 0);
imshow(title, out2);
waitKey(5000);

但是,当我将 glReadPixels 传输到函数时,它在第一次调用时工作正常,但在第二次调用时失败/没有读取任何内容:(

RenderObject();
displayImage(out1);

RenderObject();
displayImage(out2);
.
.

void displayImage(Mat& image) {

//glReadBuffer(GL_FRONT);
//glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)image.data);

//flip(image, image, 0);
//glPopClientAttrib();

const char *title = "glReadPixels";
imshow(title, image);
waitKey(5000);
destroyWindow(title);
//image.release();
}

几点:线程也是一样的。只有一个缓冲区。与帧缓冲区对象 (FBO) 以及过剩窗口的行为相同。我也试过 glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS),你可以看到代码被注释了。我还调用了 glClear(GL_COLOR_BUFFER_BIT);在 RenderObject() 上。

你能帮我看看哪里可能出错吗?

编辑:Christian .. 谢谢!你是对的。但是为什么会这样。 image.data 上没有带缓冲区的链接吗?读完之后?或者是……显示窗口接管了 gl 缓冲区的所有权,而我们销毁它时出现了错误?

最佳答案

我想您的第一个示例工作正常,因为您两次都在 imshow 中显示了 out1。否则,在您销毁窗口的函数中,然后在下一个函数调用中再次使用它,有问题吗?

编辑: 显示窗口不会取得图像的所有权(当然也不会取得您的 GL 帧缓冲区的所有权,为什么以及如何取得),但会破坏 CV 窗口(使用 destroyWindow) 然后再次使用这个窗口(在下一个函数调用的 imshow 中)肯定不是一个好主意。我认为 imshow 不会在每次调用时都创建一个新窗口,它使用您使用 namedWindow 创建的窗口,并且在第二个函数调用中该窗口不存在不再,因为你用 destroyWindow 销毁了它。

关于opengl - glReadPixels 第二次读取失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6379157/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com