使用glfw,opengl时ImGui的问题

Posted

技术标签:

【中文标题】使用glfw,opengl时ImGui的问题【英文标题】:problem with ImGui when using glfw, opengl 【发布时间】:2021-05-01 11:49:20 【问题描述】:

我正在尝试将它添加到 glfw 窗口中,但它给了我这个错误

这是删除错误的那一行

ImGui_ImplOpenGL3_Init(GL_renderer);

这是我的 imgui 文件夹

这是main.cpp(除了imgui文件夹外没有其他文件)

#include "imgui/imgui.h"

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include "imgui/imgui_impl_glfw.h"
#include "imgui/imgui_impl_opengl3.h"
#include <stdio.h>

int main() 
    GLFWwindow* window;

    if (!glfwInit()) 
        return -1;
    

    window = glfwCreateWindow(850, 500, "test window", NULL, NULL);




    // Setup Dear ImGui context
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO(); (void)io;

    // Setup Dear ImGui style
    ImGui::StyleColorsDark();
    //ImGui::StyleColorsClassic();

    // Setup Platform/Renderer backends
    ImGui_ImplGlfw_InitForOpenGL(window, true);

    char* GL_renderer = (char*)glGetString(GL_RENDERER);
    ImGui_ImplOpenGL3_Init(GL_renderer);




    if (!window) 
        return -1;
        glfwTerminate();
    

    while (!glfwWindowShouldClose(window)) 
        glClear(GL_COLOR_BUFFER_BIT);

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

        ImGui::Begin("hello world window");


        glfwPollEvents();
    

    glfwTerminate();

请帮忙,我已经尝试修复此错误 6 小时了

【问题讨论】:

【参考方案1】:

它给了我一个空指针错误,我猜是因为它是错误的变量类型或其他东西。

无论如何,在 glfw opengl 3 的示例文件中,在主函数的开头使用了这样的方法,在该函数中初始化窗口以获取 opengl 渲染版本,也就是导致错误的函数的参数

// Decide GL+GLSL versions
#if defined(IMGUI_IMPL_OPENGL_ES2)
    // GL ES 2.0 + GLSL 100
    const char* glsl_version = "#version 100";
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
    glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
#elif defined(__APPLE__)
    // GL 3.2 + GLSL 150
    const char* glsl_version = "#version 150";
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // Required on Mac
#else
    // GL 3.0 + GLSL 130
    const char* glsl_version = "#version 130";
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
    //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // 3.0+ only
#endif

【讨论】:

【参考方案2】:

最后应该有一个ImGui::End(),就像在每个提供的示例中一样。

ImGui::Begin("hello world window");
...
ImGui::End();

编辑您是否也编译了实现文件? https://github.com/ocornut/imgui/blob/master/imgui_draw.cpp

【讨论】:

以上是关于使用glfw,opengl时ImGui的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 gcc 11.2 在 linux 上编译 imgui、glfw、opengl 失败

带有glfw的opengl没有与imgui c ++链接[重复]

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

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

Simple2D-15(音乐播放器)使用 glfw 库

我如何在 CMAKE 中链接 GLFW 和 Dear ImGUI