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

Posted

技术标签:

【中文标题】将视口渲染到纹理会产生重叠视口吗?【英文标题】:Rendering viewport to texture produces overlaps viewports? 【发布时间】:2019-11-05 20:08:22 【问题描述】:

我正在创建一个 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。

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

【问题讨论】:

【参考方案1】:

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

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

glClear(GL_COLOR_BUFFER_BIT);
DrawRoomObjects();

【讨论】:

显然,这是问题所在!我在没有注意到的情况下删除了该行。非常感谢!!

以上是关于将视口渲染到纹理会产生重叠视口吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以为每个渲染目标指定一个视口吗?

在页脚上重叠的滚动固定侧边栏

C ++ SDL2:如何将矩形渲染到多个视口中

如何使用正交项目将 3d 渲染图像(透视项目)绘制回另一个视口。同时使用多个视口和 OpenGL [关闭]

IBM Worklight - iOS 7 状态栏与应用程序的 HTML 重叠

SDL 改变视口的渲染大小,独立于窗口