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

为了渲染视口(viewport),我将帧缓冲区保存到 FrameBufferObject 并照常绘制,我以前使用过这种技术并且它没有问题,这里是 Draw 代码:

    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。

似乎纹理没有正确清理数据......?

最佳答案

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

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

glClear(GL_COLOR_BUFFER_BIT);
DrawRoomObjects();

关于c++ - 将视口(viewport)渲染到纹理会产生重叠视口(viewport)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58718692/

10-13 03:26