glReadPixels 更改缓冲区数据?

glReadPixels changing the buffer data?

我遇到了一个奇怪的问题,即调用 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(尽管在到达此代码之前它是未绑定的)。

读取更多或更少的像素数对粒子系统的结果也有或大或小的影响。

我做错了什么?

原来问题不是直接与发布的代码有关。那只是一个症状。

这与我如何计算帧之间经过的时间有关。由于我在循环 after 读取像素后计算了经过的时间,因此在计算第一帧时我最终会得到一个很大的初始时间值,因为读取像素的成本很高。获得较大的初始值对我的结果有很大影响。这也解释了为什么读取更多像素会导致更多问题(因为它需要更长的时间)。

计算代码中此点之前经过的时间可以解决问题。同样可以通过不读取第一帧的像素值来避免该问题。