【问题标题】:OpenGL Framebuffer is very slowOpenGL帧缓冲区非常慢
【发布时间】:2013-01-30 11:53:03
【问题描述】:

我目前正在使用 c++ 和 OpenGL 编写一个 2D 横向滚动游戏。为了获得我正在使用 SFML 的窗口,但这不应该是相关的,因为我直接使用 OpenGL 绘制了所有四边形。 现在的问题是,当我使用 Framebufferobject 在其上绘制一些光纹理,然后将其用作场景上的遮罩时,帧速率会下降。通常游戏会以 60 fps 的速度达到极限,但使用 fbo 时,它的速度约为 40 fps,有时甚至是 30。 效果看起来不错:D 我以前从未使用过帧缓冲区,这是: Framebuffer FBO render to texture is very slow, using OpenGL ES 2.0 on Android, why? 似乎没有帮助。 所以我的问题是:我做错了什么?或者有没有更简单的方法来达到同样的效果? 我在 Ubuntu 12.04 上运行它。 我的代码:

    void init() {
      GLuint fbo, mask; //framebufferobject and texture
      glewInit();
      glGenTextures(1, &mask);
      glBindTexture(GL_TEXTURE_2D, mask);
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1024, 600, 0, GL_RGBA, GL_UNSIGNED_BYTE,
      0);
      glGenFramebuffers(1, &fbo);
      glBindFramebuffer(GL_FRAMEBUFFER, fbo);
      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mask,
      0);
      glClearColor(darkness, darkness, darkness, 1);
      if (glCheckFramebufferStatus(GL_FRAMEBUFFER) !=
      GL_FRAMEBUFFER_COMPLETE)CMain::game.usefbo = false;
      glBindFramebuffer(GL_FRAMEBUFFER, 0);
    }

    void render() {
      //render usual stuff, then
      glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
      glClear(GL_COLOR_BUFFER_BIT);
      glPushAttrib(GL_VIEWPORT_BIT);
      glViewport(0, 0, 1024, 600);
      glBlendFunc(GL_SRC_COLOR, GL_ONE);
      //render lights
      glPopAttrib();
      glBindFramebuffer(GL_FRAMEBUFFER, 0);
      glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
      //render fbo over the screen:
      glBindTexture(GL_TEXTURE_2D, mask);
      glTranslatef(0, 0, 9);
      glBegin(GL_QUADS);
        glTexCoord2f(0, 0);     glVertex2i(0, 0);
        glTexCoord2f(0, 1);     glVertex2i(0, 600);
        glTexCoord2f(1, 1);     glVertex2i(1024, 600);
        glTexCoord2f(1, 0);     glVertex2i(1024, 0);
      glEnd();
      glLoadIdentity();
      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
      //display
    }

编辑: 在 //render 灯光处,三个光纹理(圆形、放射状、黑白)通过 glBegin(GL_QUADS) 等渲染到 ​​fbo。 稍后我当然想使用更多的灯。 我需要每帧刷新 fbo,因为灯光正在移动并相互重叠。

渲染灯光:

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

其中光是 LightsSources 的向量。 光源::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();
      }
  }
}

visible() 和activated 通常为真。

【问题讨论】:

  • 老实说,当您使用 FFP 时,谈论“快”和“慢”没有任何意义。你应该先解决这个问题。
  • 对不起,不知道你的意思。请解释一下。
  • 这里没有什么是潜在的问题。我假设 //render lights 是您对 FBO 进行一些渲染的地方。里面发生了什么?
  • 是的,这是真的。我编辑了
  • 请发布渲染灯中的内容。

标签: c++ opengl


【解决方案1】:

您使用的是哪种 GPU?
我现在唯一看到的是您使用的是纹理格式“GL_RGBA”而不是“GL_BGRA”,后者被认为是许多 GPU 上最快的格式。因此,如果您的 GPU 很旧,那可能就是问题所在。

【讨论】:

  • 我移植到着色器并试图不再使用 FFP。它的性能要高得多。因此不再需要使用帧缓冲区。自从我发布以来,我进行了很多研究,现在看看我如何在任何地方使用固定功能。可能很多。不过,感谢您的回复。
  • 我明白了...很好,您不再使用固定功能^^它们有时会让人头疼...
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 2012-02-08
  • 2013-12-19
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多