[ocornut/imgui]ImGui 设置 glfw 窗口位置时出错

2024-05-09 501 views
7

我在这一行收到错误: 图像

这是我的代码:

IMGUI_CHECKVERSION();
        ImGui::CreateContext();
        ImGuiIO& io = ImGui::GetIO(); (void)io;
        io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
        io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
        io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;

        ImGui::StyleColorsDark();

        ImGui_ImplGlfw_InitForOpenGL((GLFWwindow*)window.get(), true);
        ImGui_ImplOpenGL3_Init("#version 410");

        window->Vsync(true);

        float lastTime = glfwGetTime();

        while (window->ShouldClose()) {
            Andromeda::Renderer::ClearCol(1, 0, 0, 1);

            ImGui_ImplOpenGL3_NewFrame();
            ImGui_ImplGlfw_NewFrame();
            ImGui::NewFrame();

            float delta = glfwGetTime() - lastTime;
            lastTime = glfwGetTime();

            {
                ImGui::Begin("Hello World!");
                ImGui::Text("beans");
                ImGui::End();
            }

            ImGui::Render();
            int display_w, display_h;
            glfwGetFramebufferSize((GLFWwindow*)window.get(), &display_w, &display_h);
            glViewport(0, 0, display_w, display_h);
            ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

            if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) {
                GLFWwindow* backupWindow = glfwGetCurrentContext();
                ImGui::UpdatePlatformWindows();
                ImGui::RenderPlatformWindowsDefault();
                glfwMakeContextCurrent(backupWindow);
            }

            sandbox->Update(delta);

            window->Poll();
        }

        ImGui_ImplOpenGL3_Shutdown();
        ImGui_ImplGlfw_Shutdown();
        ImGui::DestroyContext();

我将它构建到一个库中,如果它可以做任何事情来使它崩溃。

回答

9

您需要指定哪个错误并填写确切的问题模板,以便我们知道您正在使用哪个操作系统。

7

我正在 Windows 上运行,我在对接分支上,我刚刚收到一个错误,提示“异常抛出......”。我使用的是 v1.88(目前最新)

3

@AnnoyingB 堆栈跟踪和完整的异常消息在这里会很有帮助。我们不能仅仅推测您的程序出了什么问题,特别是当提供的代码片段不是独立的时。

2

图像

7

查看您的屏幕截图,似乎调用glfwCreateWindow失败,因为vd->Window为空。

我没有看到它在这里失败的明显原因。

如果您的引擎是多线程的,请确保您没有从与调用的线程不同的线程访问主窗口的 OpenGL 上下文ImGui::UpdatePlatformWindows

您应该配置GLFW 错误回调来获取错误消息。 (请参阅example_glfw_opengl3的用法示例。)

8

图像

5

这似乎与https://github.com/ocornut/imgui/issues/5687相同,不幸的是它没有真正的解决方案。

官方的例子有这个问题吗example_glfw_opengl3

环顾互联网,听起来您可能只需要更新 GPU 驱动程序。


此外,控制台的屏幕截图也使人们更难搜索。为了便于搜索,复制+粘贴错误:

WGL:无法创建 OpenGL 上下文

4

图像 它是最新的:\

8

它在示例中有效

9

这是我的 glfw 初始化代码:

        const GLFWvidmode* mode = nullptr;
        GLFWmonitor* monitor = nullptr;

        if (!glfwInit()) {
            const char* description; 
            glfwGetError(&description);
            printf(description);
            return false;
        }

        if (props->fullscreen) {
            mode = glfwGetVideoMode(monitor);
            monitor = glfwGetPrimaryMonitor();

            glfwWindowHint(GLFW_RED_BITS, mode->redBits);
            glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
            glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
        }

        if (props->api == 0) {
            glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
            glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
            glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

            Andromeda::Logger::Print("OpenGL 4.1", LogType::Info);
        }

        if (props->api == 1) {
            glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
            glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
            glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

            Andromeda::Logger::Print("OpenGL 3.3", LogType::Info);
        }

        glfwWindowHint(GLFW_DECORATED, props->decorated);

        window = glfwCreateWindow(mode ? mode->width : props->sizeX, mode ? mode->height : props->sizeY, props->title.data(), monitor ? monitor : nullptr, nullptr);
        if (!window) {
            const char* description;
            glfwGetError(&description);
            Andromeda::Logger::Print(description, LogType::Critical);
            return false;
        }

        // For ImGui
        glfwMakeContextCurrent(window);

        Andromeda::Logger::Print("Window made", LogType::Info);

        return true;
7

我复制了示例的一些代码,但它仍然不起作用:\

8

我修好了它。我将“Window”类存储为女巫 glfw 不喜欢的独特 ptr。我只需要把它变成一个普通变量。