首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL帧缓冲区非常慢

OpenGL帧缓冲区非常慢
EN

Stack Overflow用户
提问于 2013-02-15 00:01:32
回答 1查看 2.3K关注 0票数 2

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

代码语言:javascript
复制
    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
    }

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

渲染灯光:

代码语言:javascript
复制
for(std::vector<LightSource*>::iterator it = lights.begin(); it != lights.end(); it++) {
    (*it)->draw();
}

代码语言:javascript
复制
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通常为true。

EN

回答 1

Stack Overflow用户

发布于 2013-02-22 00:07:42

您使用的是哪种GPU?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14878897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档