OpenGL帧缓冲区非常慢
OpenGL Framebuffer is very slow
我目前正在用c++和OpenGL编程一个2D杂耍游戏。为了获得窗口,我使用SFML,但这不应该是相关的,因为我直接用OpenGL绘制所有的四边形。现在的问题是,当我使用帧缓冲对象在其上绘制一些光纹理,然后将其用作场景上的遮罩时,帧率会下降。通常情况下,游戏以60帧/秒的速度达到极限,但对于fbo,其速度约为40帧/秒,有时甚至为30帧/秒。效果看起来不错的想法:D我以前从未使用过帧缓冲区,这是:Framebuffer FBO渲染到纹理非常慢,在Android上使用OpenGL ES 2.0,为什么?似乎没有帮助。所以我的问题是:我做错了什么?或者有没有一种更简单的方法可以达到同样的效果?我在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
}
编辑:在//渲染灯光处,通过glBegin(GL_QUADS)等将三种灯光纹理(圆形、放射状、黑色到白色)渲染到fbo。当然以后我想用更多的灯。我需要刷新每一帧的fbo,因为灯光在移动并相互重叠。
渲染灯光:
for(std::vector<LightSource*>::iterator it = lights.begin(); it != lights.end(); it++) {
(*it)->draw();
}
其中lights是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通常为true。
您使用的是哪种GPU
我现在看到的唯一一件事是,您使用的是纹理格式"GL_RGBA",而不是"GL_BGRA",这被认为是许多GPU上最快的格式。所以,如果你的GPU很旧,那可能就是问题所在。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- OpenGL大的3D纹理(>2GB)非常慢
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- 将 mmap 内存用于开销非常低的循环缓冲区
- 如何使用 flex 和 bison 解析非常大的缓冲区
- OpenGL帧缓冲区非常慢