0


ImGui渲染流程及常用控件总结

1. ImGui渲染线程

前面说到,ImGui Example中需要重点关注的两个文件之一是main.cpp,这是整个渲染循环所在,接下来以example_glfw_opengl3的main.cpp为例,介绍一下imgui的渲染流程。
一些注意点:

  • 需要包含头文件#include<GLFW/glfw3.h>;
  • int glfwinit(void)/void glfw Terminate(void)用于glfw库的初始化和终止;如果运行之后卡死可能是忘记终止glfw;如果在调用Terminate后再用glfw库函数则需要重新进行初始化;
  • 初始化失败会返回GLFW_FALSE,返回前会自动调用glfw_Terminate;
  • 初始化成功则需要手动调用(只能在主线程上调用);
  • glfwSetErrorCallback是为数不多的可以在glfw库初始化之前调用的函数,写在第一行;
  • glfwWindowHint为下一次CreateWindow的调用设置Hint,即对该函数创建的上下文进行相应配置;
  • glfwCreateWindow用于创建窗口,可以指定窗口的尺寸以及类型;
  • glfwMakeContextCurrent用于创建上下文,每个线程在同一时间只能拥有一个当前上下文;
  • glfwSwapInterval用于设置监视器最低刷新数;
  • ImGui::Begin()和ImGui::End()需成对出现,同理,ImGui::BeginTable() &ImGui::EndTable()等。

此处附上main.cpp源码:

// 回调函数
static void glfw_error_callback(int error, const char* description)
{
    fprintf(stderr, "Glfw Error %d: %s\n", error, description);
}
int main(int, char**)
{
    // 设置回调
    glfwSetErrorCallback(glfw_error_callback);
    if (!glfwInit())
        return 1;
    // 确定OpenGL版本信息
    const char* glsl_version = "#version 130";
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
     // 创建窗口
    GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL);
    if (window == NULL)
        return 1;
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1); 

    // 设置上下文
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO(); (void)io;
    //设置界面风格
    ImGui::StyleColorsDark();
    // 初始化渲染平台
    ImGui_ImplGlfw_InitForOpenGL(window, true);
    ImGui_ImplOpenGL3_Init(glsl_version);
    //主循环
    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
    while (!glfwWindowShouldClose(window))
    {
        glfwPollEvents();
        //开始一个ImGui框架
        ImGui_ImplOpenGL3_NewFrame();
        ImGui_ImplGlfw_NewFrame();
        ImGui::NewFrame();
        //输入UI命令
        static float f = 0.0f;
        ImGui::Begin("Hello, world!");  
        ImGui::Text("This is some useful text.");          
        ImGui::SliderFloat("float", &f, 0.0f, 1.0f);          
        ImGui::ColorEdit3("clear color", (float*)&clear_color);           
        ImGui::End();
        }
         // 渲染
        ImGui::Render();
        int display_w, display_h;
        //获得窗口帧缓存
        glfwGetFramebufferSize(window, &display_w, &display_h);
        //设置绘图区域
        glViewport(0, 0, display_w, display_h);
        //设置清除颜色
        glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
        //将窗口清除为当前颜色
        glClear(GL_COLOR_BUFFER_BIT);
        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
        //交换缓冲区
        glfwSwapBuffers(window);
        }
    //销毁
    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplGlfw_Shutdown();
    ImGui::DestroyContext();
    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;

此处附上实现的UI界面图:

请添加图片描述

2. 常用控件

控件名用途Popup弹窗Menu菜单MainMenuBar主菜单框Popup弹窗Text文本TextDisabled不可编辑文本,浅色底TextColored带颜色的文本BulletText前面带个●的文本SameLine使同一行Separator画一条横线分割RadioButton带一个可点击圆圈的选择项ArrowButton带左右方向的按钮Combo带下拉的选择框AlignTextToFramePadding文本与控件框对齐CheckBox带方框的选择框
又累了,控件还蛮多的,自己可以对照着demowindow点一点试试,基本原理都不是很难。。。。下一篇更新如何在自己的OpenGL程序中搭建一个简单的UI。

标签: c++ 图形渲染 ui

本文转载自: https://blog.csdn.net/rasine_liu/article/details/127624805
版权归原作者 rasine_liu 所有, 如有侵权,请联系我们删除。

“ImGui渲染流程及常用控件总结”的评论:

还没有评论