将视口渲染为纹理会产生重叠视口吗?

问题描述 投票:1回答:1

我正在创建2D引擎,并且想要实现停靠,所以我需要创建一个视口并将屏幕渲染为纹理。

为了渲染视口,我将帧缓冲区保存到一个FrameBufferObject中,然后像往常一样绘制,我之前使用了这项技术,并且没有问题,这里是绘制代码:

    glBindFramebuffer(GL_FRAMEBUFFER, fbo_msaa_id);
    glViewport(0, 0, width, height);

    DrawRoomObjects();

    glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_msaa_id);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
    glBlitFramebuffer(0, 0, width, height,  // src rect
        0, 0, width, height,  // dst rect
        GL_COLOR_BUFFER_BIT, // buffer mask
        GL_LINEAR); // scale filter

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0, 0, App->moduleWindow->screen_surface->w, App->moduleWindow->screen_surface->h);

我已确保DrawRoomsObjects()功能正常运行,并且FBO已正确初始化。

这里是渲染使用ImGui库创建的纹理的代码:

glEnable(GL_TEXTURE_2D);


if (ImGui::Begin("Game Viewport", &visible, ImGuiWindowFlags_MenuBar)) {
        ImGui::Image(viewportTexture->GetTextureID());
}

[在此块之前,我进行了一些计算以使图像适合停靠点,在代码中不再使用viewportTexture

问题出在移动四边形时出现这个奇怪的伪像,我不知道如何调用,单击this link查看该错误的gif图像。

似乎纹理无法正确清除数据...?

c++ opengl framebuffer render-to-texture
1个回答
0
投票

在将对象渲染到帧缓冲区之前,您必须清除帧缓冲区:

glBindFramebuffer(GL_FRAMEBUFFER, fbo_msaa_id);
glViewport(0, 0, width, height);

glClear(GL_COLOR_BUFFER_BIT);
DrawRoomObjects();
© www.soinside.com 2019 - 2024. All rights reserved.