Визуализация видового экрана в текстуру приводит к наложению видового экрана? - PullRequest
1 голос
/ 05 ноября 2019

Я создаю 2D-движок и хочу реализовать закрепление, поэтому мне нужно создать видовой экран и отобразить экран в виде текстуры.

Чтобы отобразить видовой экран, я сохраняю буфер кадра в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 больше на код.

Проблема возникает, когда я получаю этот странный артефакт во время перемещения квада, который я не знаю, как вызвать, нажмите по этой ссылке , чтобы увидеть gif ошибки.

Кажется, текстура некорректно очищает данные ...?

1 Ответ

0 голосов
/ 05 ноября 2019

Вы должны очистить буфер кадров, прежде чем рендерить объекты в буфер кадров:

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

glClear(GL_COLOR_BUFFER_BIT);
DrawRoomObjects();
...