OpenGL帧缓冲区非常慢 我现在正在用C++和OpenGL编写一个2D侧边游戏。为了获得窗口,我使用了SFML,但这与我直接用OpenGL绘制所有四边形无关。 现在的问题是,当我使用Framebufferobject在其上绘制一些灯光纹理,然后将其用作场景上的遮罩时,帧速率会下降。通常情况下,游戏达到60 fps的极限,但对于fbo来说,大约40 fps,有时甚至30 fps。 这个效果看起来不错,我想:D 我以前从未使用过帧缓冲区,以下是: 似乎没用。 所以我的问题是:我做错了什么?还是有更简单的方法达到同样的效果? 我在Ubuntu 12.04上运行它。 我的代码:

OpenGL帧缓冲区非常慢 我现在正在用C++和OpenGL编写一个2D侧边游戏。为了获得窗口,我使用了SFML,但这与我直接用OpenGL绘制所有四边形无关。 现在的问题是,当我使用Framebufferobject在其上绘制一些灯光纹理,然后将其用作场景上的遮罩时,帧速率会下降。通常情况下,游戏达到60 fps的极限,但对于fbo来说,大约40 fps,有时甚至30 fps。 这个效果看起来不错,我想:D 我以前从未使用过帧缓冲区,以下是: 似乎没用。 所以我的问题是:我做错了什么?还是有更简单的方法达到同样的效果? 我在Ubuntu 12.04上运行它。 我的代码:,c++,opengl,C++,Opengl,编辑: 在//渲染灯光处,三种灯光纹理(圆形、径向、黑色到白色)通过glBegin(GL_四边形)等渲染到fbo。 以后我当然想用更多的灯。 我需要每帧刷新fbo,因为灯光正在移动并相互重叠 渲染灯光: for(std::vector<LightSource*>::iterator it = lights.begin(); it != lights.end(); it++) { (*it)->draw(); } visible()和activated通常是正确的。您使

编辑: 在//渲染灯光处,三种灯光纹理(圆形、径向、黑色到白色)通过glBegin(GL_四边形)等渲染到fbo。 以后我当然想用更多的灯。 我需要每帧刷新fbo,因为灯光正在移动并相互重叠

渲染灯光:

for(std::vector<LightSource*>::iterator it = lights.begin(); it != lights.end(); it++) {
    (*it)->draw();
}

visible()和activated通常是正确的。

您使用的是哪种GPU?

我现在看到的唯一一件事是,您使用的是纹理格式“GL_RGBA”而不是“GL_BGRA”,这被认为是许多GPU上最快的格式。因此,如果您的GPU非常旧,这可能就是问题所在。

老实说,在使用FFP时,谈论“快”和“慢”没有任何意义。你应该先把它修好。对不起,我不知道你的意思。请你自己解释一下。这里没有任何东西会成为潜在的问题。我假设//渲染灯光是对FBO进行渲染的地方。那里发生了什么事?是的,没错。我编辑了“渲染灯光”中的内容。我移植到着色器并尝试不再使用FFP。它的性能要好得多。因此,不再需要使用帧缓冲区。自从我发帖以来,我做了很多研究,现在我看到了我是如何在任何地方使用固定函数的。可能会有很多。不过,谢谢你的回复。我明白了。。。很好,你不再使用固定函数了^^^它们有时会让人头疼。。。
for(std::vector<LightSource*>::iterator it = lights.begin(); it != lights.end(); it++) {
    (*it)->draw();
}
void LightsSource::draw() {
  if (visible()) {
      if (activated) {
          glTranslatef(this->x, this->y, 0);
          glBindTexture(GL_TEXTURE_2D, this->texture);
          glBegin(GL_QUADS);
              glTexCoord2f(0, 0);     glVertex2i(0, 0);
              glTexCoord2f(0, 1);     glVertex2i(0, height);
              glTexCoord2f(1, 1);     glVertex2i(width, height);
              glTexCoord2f(1, 0);     glVertex2i(width, 0);
          glEnd();
          glLoadIdentity();
      }
  }
}