glReadPixels меняет данные буфера?

У меня возникла странная проблема, когда вызов glReadPixels изменяет данные считываемых пикселей. Я читаю две текстуры RGBA в буфере кадра, которые используются для кодирования положения и скорости частиц.

Во время отладки я использую glReadPixels для вывода данных некоторых пикселей, и я заметил, что моя система частиц ведет себя по-разному, когда я их считываю.

Код нарушения таков:

glBindFramebuffer( GL_READ_FRAMEBUFFER, fbo);
glReadBuffer( GL_COLOR_ATTACHMENT0 );
GLfloat *pixels = new GLfloat[ width * height * 4];
glReadPixels( 0, 0, width, height , GL_RGBA, GL_FLOAT, pixels);
std::cout << "Position:     " << pixels[0] << "  " << pixels[1] << "  " << pixels[2] << "  " << pixels[3] << std::endl;
glReadBuffer( GL_COLOR_ATTACHMENT1 );
glReadPixels( 0, 0, width, height, GL_RGBA, GL_FLOAT, pixels);
std::cout << "Velocity:     " << pixels[0] << "  " << pixels[1] << "  " << pixels[2] << "  " << pixels[3] << std::endl;
delete pixels;
glBindFramebuffer( GL_READ_FRAMEBUFFER, 0 );

Я читаю из кадрового буфера fbo, который ранее был связан и визуализировался как GL_DRAW_FRAMEBUFFER (хотя он был несвязан до достижения этого кода).

Чтение большего или меньшего количества пикселей также оказывает большее или меньшее влияние на результаты системы частиц.

Что я здесь делаю неправильно?


person Claytorpedo    schedule 11.04.2016    source источник


Ответы (1)


Оказалось, что проблема была не непосредственно в опубликованном коде. Это был просто симптом.

Это было связано с тем, как я вычислял время, прошедшее между кадрами. Поскольку я рассчитал прошедшее время в цикле после чтения пикселей, я получил бы большое начальное значение времени при вычислении первого кадра, потому что чтение пикселей дорого. Получение начального большого значения оказывает большое влияние на мои результаты. Это также имеет смысл, почему чтение большего количества пикселей отбрасывает больше вещей (потому что это занимает больше времени).

Вычисление времени, прошедшего до этой точки в коде, решает проблему. Аналогичным образом этой проблемы можно было бы избежать, если бы не считывались значения пикселей в первом кадре.

person Claytorpedo    schedule 11.04.2016