Текстура OpenGL приводит к тому, что окна ImGUI постоянно не в фокусе

Я следую учебным пособиям TheCherno по OpenGL (хотя я пошел дальше и изменил несколько вещей). Я нахожусь на MacOS Mojave и имею OpenGL 2.1. Однако, когда я добрался до ImGui, уроки стали вести себя странно.

Поскольку у меня есть более старая версия OpenGL, я использую glfw_opengl2_impl из ImGui и пример кода по адресу https://github.com/ocornut/imgui/blob/master/examples/example_glfw_opengl2/main.cpp работает, но я должны включать несколько других файлов cpp в дополнение к файлам.h (видно в верхней части моего кода).

Когда я попробовал это с моим собственным кодом, я обнаружил, что перед вызовом мне пришлось отсоединить шейдеры, буферы вершин / индексные буферы и массивы вершин. ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); Когда-то это работало как задумано, но после закрытия и перезапуска программы окна перестали фокусироваться, и текст отображается в виде прямоугольников. Как это

Мой код:

#include "imgui.h"
#include "imgui_impl_opengl2.h"
#include "imgui_impl_glfw.h"

#include "imgui.cpp"
#include "imgui_impl_glfw.cpp"
#include "imgui_impl_opengl2.cpp"
#include "imgui_draw.cpp"
#include "imgui_widgets.cpp"
#include "imgui_demo.cpp"
 // other includes

// Init GLEW, GLFW, etc

// Removing this chunk of code fixes the problem
localBuf = stbi_load(path.c_str(), &width, &height, &bits, 4); 
glGenTextures(1, &id);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, id);
setRenderHints({{GL_TEXTURE_MIN_FILTER, GL_NEAREST}, {GL_TEXTURE_MAG_FILTER, GL_NEAREST}});
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, localBuf);
if (localBuf) {
    stbi_image_free(localBuf);
}
glGenerateMipmap(GL_TEXTURE_2D);



IMGUI_CHECKVERSION();
ImGui::CreateContext();

ImGuiIO& io = ImGui::GetIO(); (void)io;

ImGui::StyleColorsClassic();

ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL2_Init();

while (!glfwWindowShouldClose(win)) {
        // some logic for the camera ...

        ImGui_ImplOpenGL2_NewFrame();
        ImGui_ImplGlfw_NewFrame();
        ImGui::NewFrame();

        {
            ImGui::Begin("Hello, world!");
            ImGui::ColorEdit3("Tint: ", (float *) &tint);
            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate,
                        ImGui::GetIO().Framerate);
            ImGui::Text("Count: %iu", counter);
            ImGui::End();
        }


        ImGui::Render();

        glClearColor(0.25f, 0.25f, 1, 1);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, nullptr);

        glBindVertexArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        glUseProgram(0);

        ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData());

        glUseProgram(shader);
        glBindVertexArray(vao);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
}

ImGui_ImplOpenGL2_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();

// terminate glfw.

Редактировать: я только что обнаружил, что полное удаление всех текстур решает проблему. Открепление текстур перед ничьей ничего не дает.

Редактировать 2: очевидно, наличие нескольких текстур является проблемой?!! Хорошо иметь одну текстуру, но иметь несколько причин этой проблемы. Опять же, освобождение ничего не делает.

1 ответ

Решение

Понял! Почему-то использование нескольких текстурных слотов расстраивает ImGui. Я только использовал один слот, и все работает как задумано!

Другие вопросы по тегам