Следующий код работает нормально
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 ().
Не могли бы вы мне помочь, где может быть ошибка?
РЕДАКТИРОВАТЬ: Кристиан .. спасибо! Вы правы. Но почему это происходит? На image.data нет ссылки с буфером, верно? после окончания чтения? Или это ... окно дисплея, которое перешло во владение буфером gl и что-то не так, пока мы его уничтожали?