【问题标题】:glReadPixels changing the buffer data?glReadPixels 改变缓冲区数据?
【发布时间】:2016-04-11 01:39:36
【问题描述】:

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

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

我在这里做错了什么?

【问题讨论】:

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


    【解决方案1】:

    原来问题不在于发布的代码直接。这只是一个症状。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2020-05-05
      • 2023-03-07
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多