OpenGL 纹理导致 ImGUI 窗口永久失焦

Posted

技术标签:

【中文标题】OpenGL 纹理导致 ImGUI 窗口永久失焦【英文标题】:OpenGL Texture cause ImGUI windows to be permanently out of focus 【发布时间】:2019-08-08 16:40:52 【问题描述】:

我正在关注 TheCherno 的 OpenGL 教程(不过我已经继续并修改了一些内容)。我在 MacOS mojave 上并且有 OpenGL 2.1。然而,当我进入教程的 ImGui 部分时,事情开始变得很奇怪。

由于我有旧版本的 OpenGL,我使用的是 ImGui 的 glfw_opengl2_impl,https://github.com/ocornut/imgui/blob/master/examples/example_glfw_opengl2/main.cpp 的示例代码有效,但除了 .h 文件之外,我还必须包含一些其他 cpp 文件(见在我的代码顶部)。

当我用自己的代码尝试此操作时,我发现我必须在调用 ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); 之前取消绑定着色器、顶点缓冲区/索引缓冲区和顶点数组这实际上按预期工作了一次,但在关闭并重新启动程序,窗口拒绝聚焦,文本显示为矩形。像 this.

我的代码:

#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 感到不安。我只使用了一个插槽,一切都按预期工作!

【讨论】:

imgui_impl_openglX.cpp 不应“被 [...] 使用多个纹理槽弄乱”。问题可能出在其他地方。

以上是关于OpenGL 纹理导致 ImGUI 窗口永久失焦的主要内容,如果未能解决你的问题,请参考以下文章

如何在 imgui 窗口中使用 opengl glfw3 渲染?

如何从 OpenGL 中的帧缓冲区纹理中采样像素?

使用glfw,opengl时ImGui的问题

如何在 GLFW 窗口中限制我的每秒帧数? (使用亲爱的 ImGui)

在opengl矩形上使用着色器会导致它消失[关闭]

我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题