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。

Dear ImGui 1.77   Dear ImGui is a bloat-free graphical user interface library for C++. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies).   Dear ImGui is designed to enable fast iterations and to empower programmers to create content creation tools and visualization / debug tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and lacks certain features normally found in more high-level libraries.   Dear ImGui is particularly suited to integration in games engine (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on consoles platforms where operating system features are non-standard. 开源地址GitHub 使用ImGui的用户 Ubisoft (刺客信条的开发商) 暴雪 微软 亚马逊 索尼 任天堂 谷歌 英伟达 n+1................... ImGui不单单是适合游戏UI设计,使用ImGui开发的工具其实非常多,建模,大数据展示平台,天文展示平台,地理展示平台,城市公交车调度平台等等等,可能是易语言 用户不爱去正规企业搞开发的原因吧。所以私企定制化需求了解得少。 假设你去了中铁,现在叫你要开发一款 “钻机实时监测”程序 那么什么WEB UI ,Win32 基础控件,GDI+控件是压根行不通的,因为钻机很多都是进口的,随便一台也是几百上千万,工作成本非常昂贵,不然开一条隧道几个亿呢~ 所以它每0.1秒的工作成本也非常高,由于它太精密,所以就导致需要1秒内实时显示成千上万组数据,这个时候ImGui就能排得上用场。 本模块实际上是使用C++封装为DLL给E调用,封装了整个ImGui大概有90%左右的基础函数, 函数和用法基本和官方Demo一致。所以是英文的函数,所以你就算基本上照着官方的Demo写E代码也可以。不喜勿用! 如果你需要“ImGui纯E源码” 那你可以自行翻译ImGuiC++代码到E,在你熟悉E和C++的情况下,大概需要你半年左右的时间。 吐槽一下 因为群里一直有人催我发,我已经说了没封装完,但是还是催。其实很烦的,因为我又不欠你的,我要上班养家糊口的。这些只能用我业余时间搞搞,进度自然慢。所以我就干脆发出来来吧,大概完成度为80%左右,不影响正常使用,函数备注什么的就自己去官方查吧。 根据之前的情况来看,易语言用户群体至少80%以上是白嫖怪,所以拿人手短,不要那么理直气壮,我不爽,大家也别愉快的玩耍,明白????再根据之前ETStudio  来看,很多人都不知道,易语言配色是什么,甚至很多人不知道原来易语言还有一个“设置”功能??还有一大部分人也不看说明 ,有问题只知道弹窗,在? 你这个有XX问题啊,在?这里怎么写? 在?能给我远程一下么? 我是崩溃的,所以有任何问题,请现在自行去GIT,百度,谷歌,维基等等查询。另外 本模块自带了一个列子,虽然比较乱,但是它是一个非常完善的基础使用列子,请认真自行阅读并理解!部分机器可能需要DX运行环境https://www.microsoft.com/zh-cn/download/details.aspx?id=35 除了封装ImGui之外,还会封装一些“有趣”的插件,比如已经完全封装完毕的ImPlot(图表)插件。模块内的是Dx11,其实也可以是DX10 DX 9 OPENGL之类的,以后有时间在慢慢搞了。 附上图吧 请勿将本模块用在一切非法用途,违者自负!!!!!!! G2U函数在WI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值