1.imgui适合界面开发吗 imgui是辅n辅什么
2.DX12渲染器开发(11):ImGui使用简介
3.githubä¾èµimgui
4.IMGUI介绍 译文
5.开源图形用户界面库 –Dear ImGui Bundle简介
6.Directx11/12添加imgui踩坑记
imgui适合界面开发吗 imgui是什么
适合。ImGUI又称为Dear ImGui,助界助器它是面源码与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,辅n辅可以将ImGUI的助界助器源码直接加到项目中使用,也可以编译成dll。面源码旗形整理画线源码ImGUI使用DX或者OpenGL进行界面渲染,辅n辅对于画面质量要求较高。助界助器
DX渲染器开发():ImGui使用简介
还鸽9篇~~
完成DX程序后,面源码若需调整参数,辅n辅如模糊次数等,助界助器需关闭程序再调整,面源码之后重新运行。辅n辅
对于使用过引擎的助界助器人来说,这过程显得繁琐。面源码在引擎中,我们可以直接将参数暴露到面板上,运行时调节参数,实时获得反馈,快速调试效果。
在DX中,要实现类似效果,需要使用ImGui。简而言之,ImGui是一套现成的代码,将其包含到项目中后,编写少量初始化代码即可使用。ng前端源码
此处先进行入门学习,因为当前没有创建渲染器,程序框架下封装起来不太美观。因此,先简单使用一下ImGui。
为了使程序更清晰,直接使用初始化文章中的代码,并加入ImGui效果。
所需文件位于上方git链接中,具体内容包括:
关于Backends文件夹,不是全部都要,只需以下四个:
本文对应的项目中已包含这些内容。
获取到这些文件后,将其拖到项目中,这一步很重要,仅包含在项目中是不够的,会引发错误,如下:
拖入后,我们开始操作:
这是初始化创建的前置工作,需要一个SRV堆,注意不能与之前的SRV堆放在一起,需要独立一个。若要强制放在一起也不是不行,但需注意绑定的句柄偏移。
注意此处涉及的内容,使用了device接口,跨境系统源码因此需要放在Device创建之后。
在while循环开头添加以下代码:
这堆代码的上三句不用管,只需添加即可,重点是中间的两句,表示展示demo窗口,之后想要展示什么变量来调整,都在这里修改。
在drawcall之后添加以下两行代码,imgui类似于后处理效果,在drawcall后添加,并绑定其描述符堆。
在while循环末尾添加以下代码:
最后在窗口处理函数WndProc中添加以下一句:
需要声明:
此时就可以运行了。我在初始化项目中加入了大多数三角形都有的按住鼠标拖动效果,但在当前的imgui中,会导致拖动imgui窗口时立方体也跟着动。
原因是鼠标信息被两个人捕获处理了。
解决办法是参考一个大佬,具体见参考链接。在此处添加上述两句,同时因为窗口创建会调用这个,我们需要在窗口创建之前创建imgui上下文。
将原来的两句移至上方即可。
同时,可以将imgui的展示窗口替换为:
换成设置clearColor为特定颜色的操作。
大功告成。
更多应用等我们把渲染器做好后再加入,BD邦源码方便以后在渲染器中实现算法调试效果。
最后,代码链接:
githubä¾èµimgui
ImGUIæ¯ä¸ä¸ªè¶ 级轻é级çC++å¼æºè·¨å¹³å°å¾å½¢çé¢æ¡æ¶ï¼ImGUI主è¦ç¨äºæ¸¸æè¡ä¸ï¼ææçæ§ä»¶é½éè¦æç»å®ç°ï¼å®æ¯ä¸å¹³å°æ å ³çC++è½»é级跨平å°å¾å½¢çé¢åºã
IMGUI介绍 译文
IMGUI(即时模式图形用户界面)是一个简化用户界面编程的范例。在传统用户界面系统中,复杂的同步状态和大量特定于应用程序的实现使得UI编程变得困难。IMGUI通过要求应用程序实时显式传递可视化和交互所需的所有状态,消除状态同步的复杂性,使得UI创建和实现更简单。
在IMGUI中,用户界面只保留为方便系统支持的每种小部件所需的功能所需的最小状态量。Widget不再是对象,而是采用过程方法调用的形式,用户界面本身从有状态的对象集合变成了方法调用的实时序列。这种实现方式的基础是实时应用程序循环的概念,应用以帧为基础处理逻辑和绘制。
使用IMGUI,概念发生了变化,Widget从对象转变为方法调用。这种方法简化了客户端应用程序处理用户界面实现的方式,减少了与缓存相关bug的可能性,也消除了工具箱将小部件作为对象公开给客户端应用程序的需求。这使得实际的特定于应用程序的客户端代码变得更少,更简单。
将用户界面移植到IMGUI后,整个前端的变化和迭代变得更加容易。例如,奔腾源码指标从涉及小部件实例化、布局、回调等的复杂过程转变为通过“if(doButton())do something…”的形式添加或删除几行代码。布局仍然直接编码到应用程序中,但通过移动代码,布局问题得到解决。
IMGUI的主要好处和原因是,实际的特定于应用程序的客户端代码变得更少,更简单。对于小型应用程序来说,这可能没有什么好处,但是对于非常复杂的用户界面,IMGUI能够提供更加简单和灵活的实现方式,使得实现和维护变得更容易。
为了鼓励接受IMGUI,需要实现一个参考工具包和至少一个使用它的应用程序。这些应用程序必须强调这是一个范式的转变,而不仅仅是一个漂亮的把戏。在Windows7上,新的DirectXAPI Direct2D和DirectWrite可能是高分辨率/高性能IMGUI应用程序的一个很好的解决方案。
一个参考工具包需要“看起来不错”,这意味着小部件看起来“现代”,让艺术家参与其中可能是个好主意。布局问题需要解决,因为对于许多应用程序,要求程序员处理每个“小部件”的布局可能是不可行的。
在IMGUI中,Gui类中的widget方法封装了widget相关的存在、显示和交互的逻辑。从客户端的角度来看,小部件可以说是以方法调用的形式“存在”;小部件从对象变为方法调用。这种方法的主要好处之一是完全集中控制调用代码,用户界面的各个方面都在同一个地方。
在IMGUI中,编辑框和按钮的实现突出了其重要细节,即它们并不完全是无状态的,但是只需保留足够的状态,一次只需处理单个交互。这使得IMGUI能够在没有widget对象的情况下摆脱困境。
当谈到小部件的实际显示时,需要考虑一些不同的方法,这取决于应用程序需求的几个方面。在实时应用程序的上下文中,需要注意的一个方面是用户交互总是响应于在前一帧上绘制的内容。这意味着在实时情况下( fps或更高),这通常对用户来说并不明显,但是,如果您不想/不能以交互速率显示GUI,您需要采取一定的预防措施。
IMGUI提供了一个强大而灵活的框架,用于实现用户界面,简化了UI编程的过程。通过采用即时模式,它简化了状态管理,减少了代码复杂性,使得实现复杂用户界面变得更容易。
开源图形用户界面库 –Dear ImGui Bundle简介
Dear ImGui Bundle是一个综合框架,它整合了ImGui以及多个强大工具库,旨在为Python和C++开发者提供更便捷的图形用户界面开发工具。此框架适用于开发Windows、macOS、Linux、iOS、Android和emscripten(Web应用程序)。
集成特色功能包括:
文本编辑器语法高亮功能
日志控件
Cool Bar工具栏控件
多种旋钮风格控件
文件操作对话框
纹理检查器工具
图像调试器和查看器
Markdown渲染控件
节点编辑器控件
三维gizmo控件
图表组件
Dear ImGui Bundle的开源代码可在GitHub上获取:
github.com/pthom/imgui_bundle
详细文档位于:
pthom.github.io/imgui_bundle
该框架自年月发布0.5版后,持续发展和更新,最新版本为年1月发布的1.3.0版。
Directx/添加imgui踩坑记
尝试在DX/中集成ImGui,经过一番摸索后终于搞定,现将遇到的坑点整理如下:
在DX上添加ImGui,首先需要下载ImGui源码,确保包含必要的头文件。在D3DApp.h中添加相应的附加include和头文件。之后,让ImGui能够处理窗口消息,参考官方样例添加代码,确保在初始化ImGui后调用。将ImGui的初始化代码放置在D3DCreateDevice执行之后,避免因找不到Device而引发错误。在GameApp.cpp的DrawScene方法中绘制ImGui界面,完成基本集成。
运行后可能会遇到未解析的外部符号、错误代码等问题,解决方法是确保ImGui文件与项目一起被编译,将ImGui文件添加到项目中即可。
对于将ImGui代码放入GameApp.cpp或D3DApp.cpp中的差异,虽然两者均能正常运行,但将代码放入D3DApp.cpp中时可能会出现闪烁现象,具体原因尚不明了,期待高手解答。
在成功搞定DX后,DX的集成变得相对简单。初始代码基于DX龙书第6章绘制盒子的示例进行调整。步骤与DX类似,关键在于确保ImGui与设备上下文的正确交互,以及对mSrvHeap的恰当处理。
整体集成工作花费时间不多,关键在于理解ImGui与底层渲染框架的交互机制。所有涉及的代码修改和优化结果已整理至特定仓库中,方便后续参考。
此外,推荐观看某油管up主关于ImGui原理及在DX中集成的视频教程,该视频已翻译并上传至B站,对深入理解ImGui的使用和原理提供了宝贵指导。
游戏编程扯淡精粹ImGui实现
在游戏编程中,ImGui的实现设计注重实践和效率。虽然pyimgui功能有限,但其C++版本相对成熟,可供参考。ImGui开源社区活跃,拥有丰富的扩展和工具,如Gizmos控件和二进制编辑器,还有性能分析工具Profiler。
尽管代码量在不断增长,从最初的1万行到最新版的2.1万行,加上魔改的stb库的3.6万行,代码结构清晰,分为几个模块:配置管理(config)、核心接口(ImGui,负责公共接口和运行时实现)、以及基于stb的控件实现部分。
C++中,ImGui接口以函数为主,分为与渲染引擎后端的集成和UI逻辑编写。接口类似C API风格,与Lua类似,只是将ImGuiState作为全局变量,便于在任何位置调用。然而,由于返回值的处理问题,将编辑后的结果作为指针传递给脚本编译可能会遇到挑战。
ImGui的架构主要关注引擎后端的集成和UI逻辑的处理。接入过程相对简单,主要涉及引擎输入、ImGui处理和渲染引擎之间的数据传递。ImGui维护自己的IO状态,处理输入事件并计算绘制需求。后端只需渲染由ImGui生成的顶点列表和三角形,设置基本的MVP矩阵。
控件实现以按钮为例,通过检测鼠标点击和位置来触发逻辑,同时计算绘制数据。ImGui通过每个控件的包围盒(aabb)进行位置计算,虽然进行了简单的剔除优化,但仍需注意大部分时间下的全量绘制。
最后,ImGui的实现参考了年的《即时图形用户界面》一书,提供了深入理解其工作原理的参考来源。
imguiåmfcåºå«
å建å¾å½¢ç¨æ·çé¢ä¸åã
1ãImGuiæ¯ä¸ç§åºäºç«å³æ¨¡å¼çGUIæ¡æ¶ï¼è®¾è®¡ç念æ¯ç®åãè½»é级åæäºéæã
2ãMFCæ¯å¾®è½¯çä¸å¥é¢å对象çGUIæ¡æ¶ï¼åºäºæ¶æ¯é©±å¨ç模åï¼éè¿å¤ççªå£æ¶æ¯æ¥ååºç¨æ·è¾å ¥åæä½ã