gpt4 book ai didi

c++ - OpenGL 帧缓冲区非常慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:06 25 4
gpt4 key购买 nike

我目前正在使用 C++ 和 OpenGL 编写 2D 横向卷轴游戏。为了获得我正在使用 SFML 的窗口,但这不应该是相关的,因为我直接使用 OpenGL 绘制所有四边形。现在的问题是,当我使用帧缓冲区对象在其上绘制一些光纹理,然后将其用作场景上的 mask 时,帧速率下降。通常游戏在 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 lights 处,三个光纹理(圆形、径向、黑到白)通过 glBegin(GL_QUADS) 等渲染到 ​​fbo。当然,后来我想使用更多的灯。我需要每帧刷新 fbo,因为灯光在移动并相互重叠。

渲染灯光:

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

其中 lights 是 LightsSources 的 vector 。光源::绘制():

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 通常为真。

最佳答案

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

关于c++ - OpenGL 帧缓冲区非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14878897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com