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(尽管它在到达此代码之前是未绑定的)。

读取较大或较小数量的像素也会对粒子系统的结果产生较大或较小的影响。

我在这里做错了什么?

事实证明,发布的代码不是直接问题。这只是一个症状。

这与我如何计算帧间经过的时间有关。由于我在读取像素后计算了循环中经过的时间,因此在计算第一帧时,我会得到一个很大的初始时间值,因为读取像素非常昂贵。获得一个初始的大值对我的结果有很大的影响。这也解释了为什么读取更多的像素会让事情变得更糟(因为它需要更长的时间)。

在代码中计算在此点之前的运行时间解决了这个问题。类似地,可以通过不读取第一帧上的像素值来避免该问题。

相关内容

  • 没有找到相关文章