glReadPixels更改缓冲区数据?

时间:2016-04-11 01:39:36

标签: c++ opengl sdl-2 opengl-4

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

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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

原来问题不是直接与发布的代码。这只是一种症状。

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

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