1.Unity IMGUI TreeView简单探索(一)
2.Piccolo引擎源码笔记-反射系统
3.用Python和OpenGL探索数据可视化(基础篇)- 细说纹理环绕
4.UE5使用Slate进行UI开发与编辑器拓展(一):Slate简介
5.用Python和OpenGL探索数据可视化(基础篇)- OpenGL简介及演化
6.Directx11/12添加imgui踩坑记
Unity IMGUI TreeView简单探索(一)
因为感觉可能即将要用上了,绘绘制因为我想做个魔兽地图编辑器触发编辑器的制源那种树状的编辑器,但并不是教程完全照搬,就是绘绘制参考一下树的结构。
因为那个对话框我没找到有啥接口,制源能让它挡住整个界面的教程程序源码在论文中怎么放置输入,除非它关闭,绘绘制我又不想在EditorWindow里自己另外实现一个嵌套窗口,制源嗯,教程所以做点妥协。绘绘制参数也在树结构里好了。制源
这篇文章就简单记录一下简单探索的教程得到的内容,在寻找解决问题的绘绘制路上努力,以及最后自我麻痹的制源过程吧。
首先需要继承TreeView这个类才能进行开始,教程那个TreeViewState直接new就行。
搞定之后调用一遍Reload。然后你在Window的OnGUI那边提供Rect参数并调用它的绘制方法就好啦!
在那之前你的类必须实现BuildRoot方法,在你搞定之后调用一下SetupParentsAndChildrenFromDepths这个方法,它的作用是根据depth关系去设定节点(TreeViewItem)之间的父子关系。
与之对应的还有SetupDepthsFromParentsAndChildren,根据depth设定父子关系,具体情况具体使用了。
另外,不管是Reload还是打开关闭折叠,都会去调用BuildRows。区别就是前者连BuildRoot也会调用BuildRows是根据Root去生成一个List给TreeView使用用作画面渲染,每当结构发生改变的时候,都得重新构造一遍。
所以当你Add或者Remove等导致树结构发生改变的时候,直接调用Reload,不要有心理负担。
我去看过源码,直接调用TreeViewItem的AddChild方法在显示方面上是会有出问题的,你还得去处理层级问题,以及调用它的SetExpanded false然后true。因为你不调用的话,他就不会刷新结构,你新加的节点他就会看不见。至少我觉得挺离谱的,说不定我误解了他的设计也说不定。关键的东西全给private或internal了,也没看到接口放出来(如果有大佬知道的请柬现成源码话可以告诉我一下呀,反射就免了!)
你可能在想,我可以直接调用BuildRows呀!没用的,TreeView内部的那个controller还是dataSource根本就没同步到,在下一帧就会报错。
无论你怎么改通过GetRows拿到的列表的结构也没屁用。还是老老实实像官方一样直接粗暴的Reload。(如果有更好的方法谁愿意这么干呢?)
说实话我只是不想因为层级变动就直接重新生成整个结构,或者你直接将list缓存起来,判断一下啥也不做也行,但我强迫症犯了。
我浪费了很多时间去寻找解决方案,最后还是放弃了。最后打算参考官方的那个TreeViewWithTreeModel的做法。
反正本来就是为了给某些结构做可视化显示嘛…就用这些理由麻痹自己钻牛角尖的心吧。
基本上一些基础的使用光是看文档或者官方示例就能明白要怎么用了,所以我有点懒得写…
诸如改名操作,拖拽操作,双击项,右键项(Context,一般拿来弹个ContextMenu用)
增(TreeViewItem.AddChild)删(TreeViewItem.children.Remove)查(TreeView.FindItem FindRows)改啊啥的…
简单随便看两眼,有需要再去查文档,没必要全部硬塞进去。有空就看看官方怎么做的好了,先有点本事了能用得起来,以后再追求那些。
官网的阅读案例顺序比较推荐从
Simple Tree Window
Transform Hierarchy
Custom Row Heights
Multi Columns
看起
先看他们的window看个大概,再有啥想知道的不懂的看view的实现。
以上我说到的那些,诸如“下一帧”的这些全是我主观看法,没去验证,酌情阅读吧。
如果有什么更好的方法也希望有大佬能够指出来,感激不尽。
(百度了大半年搜的文章全部都避开了RemoveChild和AddChild来写,很棒~)
(另外预览怎么把我的排版全干掉了……?罢了)
Piccolo引擎源码笔记-反射系统
反思系统在游戏引擎中的应用与实现
在游戏开发中,反射系统提供了一种强大的机制,允许程序在运行时获取和修改对象的属性和行为。它在引擎中主要实现两点:一是展示游戏对象的组件及其属性;二是通过键盘编辑改变值,直接作用于游戏,无需重新编译。这一机制有助于开发者进行无缝的叮叮摩卡 源码组件管理与调试。
在实现中,游戏引擎通过自动生成的反射文件来描述游戏对象的组件信息。以Transform组件为例,该文件详细记录了位置、缩放、旋转等信息及其对应字段名。这些信息组织为类函数、字段函数、方法函数和数组函数的元组,方便进行封装和调用。
实现过程涉及多个模块的协同工作,包括序列化、资源加载与ImGui等。序列化模块通过模板函数实现对各种数据类型的读取,而资源加载模块负责管理关卡中对象的加载过程。在加载过程中,通过反射系统读取组件信息,并通过映射函数将其与对应的类函数关联。这使得组件的序列化和反序列化过程得以实现。
在编辑器部分,通过Tick驱动的机制,引擎实时更新游戏状态。编辑器通过获取当前选中对象及其组件信息,利用反射系统直接操作组件的属性,实现字段的实时修改与应用。这种机制避免了繁琐的重新编译过程,极大地提高了开发效率。
在处理编辑器中的字段修改时,通过反射系统提供的功能,开发者可以直接在编辑器中通过键盘输入修改字段值。这一过程不涉及事件机制的调用,而是通过直接修改对象的字段实现。通过将字段值传递给ImGui::InputFloat()函数,实现字段值的实时更新与显示。这一实现方式简化了编辑器的使用流程,提高了开发效率。
总的来说,游戏引擎中的反射系统通过封装组件信息、实现组件属性的动态获取与修改,为开发者提供了一种高效、灵活的组件管理机制。结合序列化、资源加载与编辑器等模块,步态识别 源码形成了一个完整的动态调整与管理游戏对象与组件的框架。通过反思系统,开发者可以更专注于游戏逻辑与创意的实现,而将组件管理与调试等任务交由引擎自动处理,从而提升开发效率与游戏质量。
用Python和OpenGL探索数据可视化(基础篇)- 细说纹理环绕
本系列文章将指导如何使用Python与OpenGL 4.5进行数据可视化开发。首先,请参考《准备工作(一)Windows下检测显卡和OpenGL信息》以确认您的电脑支持OpenGL 4.5版本。接着,《准备工作(二)配置Windows下VS Code + Python + OpenGL开发环境》将帮助您设置开发环境。
在《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》一文后,您已学习如何在物体的“面”上贴上复杂色彩,通过《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加OpenGL二维纹理对象》形成了单独的OpenGL二维纹理类ImageTexture2D。本节我们探讨如何利用ImageTexture2D详细解释纹理环绕的概念。
在“画图”工具中打开D:\pydev\pygl\textures\cratetex.png,并将其另存为cratetex_text.png。在原有基础上添加“GL”文字。在VS Code中创建texture_wrap_app.py文件,输入特定代码并运行。
改变垂直环绕方式为GL_CLAMP_TO_EDGE,分别调整水平环绕方式,您将看到不同的输出效果。接着,将垂直环绕更改为GL_REPEAT,再次调整水平环绕,观察结果变化。类似地,当垂直环绕为GL_MIRRORED_REPEAT时,改变水平环绕会得到新的输出。最后,保持垂直环绕为GL_CLAMP_TO_BORDER,改变水平环绕,您将看到更多样化的输出。
通过对比这些截图,结合ImageTexture2D类的setWrapMode方法的使用,您可以更深入地理解纹理环绕的机制。例如,当纹理坐标不在0到1之间时,OpenGL会重复绘制纹理。
在代码第-行,定义了矩形的程度源码时代顶点属性,需要注意纹理坐标的范围。在《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》一文中提到,纹理坐标的范围是0到1,但这里的坐标范围超出这一范围,导致重复绘制纹理。结合setWrapMode方法,当使用GL_REPEAT、GL_MIRRORED_REPEAT、GL_CLAMP_TO_EDGE或GL_CLAMP_TO_BORDER时,OpenGL会根据不同的设置重复、镜像重复或使用边缘或指定边界颜色绘制纹理。
代码第、行定义了类属性wrap_s_mode和wrap_t_mode,用于保存纹理环绕的具体设置值。第行设置了边界颜色为蓝色,第、行定义了ImGui窗口的宽度和高度。第行设置纹理过滤参数。第-行使用ImGui的单选按钮为wrap_s_mode和wrap_t_mode设置不同的环绕数值。第行调用setWrapMode方法更新纹理环绕参数,影响绘制结果。最后,第-行展示了设置纹理对象tex的边界颜色的效果。
本文系列源代码已上传至gitee.com/eagletang/pygl...(链接省略)。相关文章包括但不限于《用Python和OpenGL探索数据可视化(基础篇)- 你好,窗口!》、《用Python和OpenGL探索数据可视化(基础篇)- 重构代码“你好,小不点!”》等,为您的学习提供全面指导。
UE5使用Slate进行UI开发与编辑器拓展(一):Slate简介
深入了解UE的Slate框架,其设计哲学旨在解决现有UI框架的局限性,旨在为开发人员提供更为灵活、高效、且无需学习额外语言的解决方案。Slate旨在实现简化UI开发与编辑器拓展的目标,其设计基于MVC架构,允许开发者直接通过Widget(视图)与Model(模型)的绑定来更新View(视图),从而减少对传统的Controller(控制器)的依赖。这一设计允许Widget在自身功能中同时扮演View和Control的角色,提高了开发效率。
Slate的另一个关键优势在于它不需要程序员学习额外的语言,而是直接使用C++进行编程,这在一定程度上对编程习惯而言是一种便利。对于不倾向于学习描述UI的脚本语言的开发者而言,这是一项显著的优势。
对比IMGUI(ImGui),一个广受开发者喜爱的可视化调试UI框架,Slate提供了更为全面的支持,不仅适合作为游戏中的UI框架,也能够为编辑器提供支持,满足不同场景的需求。IMGUI以其简洁的界面、强大的功能和易用性著称,特别适合于快速原型制作和开发团队的协作,但其在视觉表现和游戏性能方面的局限性使其难以满足所有场景的需求。Slate在性能上具有优势,特别是在底层框架中,这一点对于游戏开发尤为重要。
在准备Slate的学习环境时,需要下载源码版的UE引擎,并创建一个特定的项目,例如命名为"SlateLearning"的程序。通过全局替换文件名和内容,以及运行相关生成脚本,可以设置好开发环境。使用集成开发环境(IDE)如Rider或Visual Studio打开项目文件,即可开始在干净且高效的工作环境中学习和使用Slate。
至此,Slate的学习环境已准备完毕,接下来可以着手深入探索Slate的特性和功能,开启UE UI开发与编辑器拓展的学习之旅。
用Python和OpenGL探索数据可视化(基础篇)- OpenGL简介及演化
在年三十,祝福各位知友在甲辰龙年身体健康、万事如意!
OpenGL,即开放图形库,是应用于图形硬件的API。它由数百个子程序和函数构成,旨在帮助程序员指定着色器程序、对象及操作,以生成高质量图形图像,特别是三维对象的彩色图像。
OpenGL成为行业标准,因其独立于窗口系统和操作系统,使软件开发者在各种设备上(如手机、平板、台式机、笔记本、工作站及超级计算机)能够开发高性能、视觉效果引人注目的二维、三维图形软件。这些应用覆盖了如CAD、CAE、科学可视化、内容创作、能源、娱乐、游戏开发、制造、医疗和虚拟现实等多个领域。
Khronos Group自年起负责OpenGL API规范的制定,截至年2月,官方已发布个版本。对于OpenGL的详细发展历史,可访问Khronos Group的官方网站。OpenGL使用的渲染管线和核心对象自4.3版本后基本稳定,如图所示。
考虑到计算机图形硬件的迅速发展,Khronos Group从年起开始开发新一代OpenGL,即Vulkan。Vulkan是一种比OpenGL更接近硬件的低级API,可直接控制GPU,从而在各种硬件上实现更高效的渲染和更好的性能。
掌握OpenGL中的渲染管线、着色器及GLSL对学习和应用Vulkan仍然有所帮助。
如需查阅更多详细信息,可参考以下链接:
registry.khronos.org/Op...
khronos.org/opengl/
khronos.org/opengl/wiki...
本系列文章的源代码已上传至Gitee。
以下为文章系列摘要:
1. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,窗口!》
2. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,OpenGL!》
3. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,ImGui!》
4. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,小不点!》
5. 《用Python和OpenGL探索数据可视化(基础篇)- 重构代码“你好,小不点!”》
6. 《用Python和OpenGL探索数据可视化(基础篇)- “你好,线段!”》
7. 《用Python和OpenGL探索数据可视化(基础篇)- 重构代码组织OpenGL核心对象包pygl》
8. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,三角形!》
9. 《用Python和OpenGL探索数据可视化(基础篇)- 改进OpenGL程序Program类》
. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,矩形!》
. 《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加索引缓存对象EBO》
. 《用Python和OpenGL探索数据可视化(基础篇)- 你好,纹理!》
. 《用Python和OpenGL探索数据可视化(基础篇)- 完善pygl增加OpenGL二维纹理对象》
. 《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理环绕》
. 《用Python和OpenGL探索数据可视化(基础篇)- 细说纹理过滤》
. 《用Python和OpenGL探索数据可视化(基础篇)- 处理键盘和鼠标事件》
. 《用Python和OpenGL探索数据可视化(三维篇)- 你好,坐标轴》
. 《用Python和OpenGL探索数据可视化(三维篇)- 用立方体体验模型矩阵》
. 《用Python和OpenGL探索数据可视化(三维篇)- 创建三维坐标轴类和立方体类》
. 《用Python和OpenGL探索数据可视化(三维篇)- 与照相机“共舞”》
. 《用Python和OpenGL探索数据可视化(三维篇)- 创建照相机类》
. 《用Python和OpenGL探索数据可视化(三维篇)- 四元数和轨迹球照相机》
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的使用和原理提供了宝贵指导。
OpenGL学习之旅(6)---imgui库使用
在OpenGL学习之旅的第六部分,我们将探索如何将imgui库集成到我们的项目中,为OpenGL程序增添交互性。首先,我们从GitHub上克隆imgui库的源码,并确保将其编译成动态库以便于链接至可执行程序。在CMakeLists.txt文件中,我们需添加编译imgui库中源文件的路径,同时确保链接到glfw库和opengl库。
在我们的main函数中,包含imgui头文件后,我们进行初始化。随后,在渲染循环中创建imgui窗口帧,并显示默认窗口。在渲染部分,我们需要更新imgui窗口,以实现动态交互。最后,在程序结束时释放imgui资源。
通过imgui窗口,我们可以动态调试3D空间变换。首先定义用于动态调试的变量,如旋转轴和旋转角度,以及平移向量,用于调整透视投影变换中的视场角。在渲染循环中,将这些变量添加至imgui窗口中,以便用户能够实时观察3D变换效果。运行程序后,用户能够通过调节参数,如帧率,动态观察3D空间变换。
本文总结了使用imgui进行动态调试参数的流程,并提供了main.cpp与CMakeLists.txt的完整源码。
[Piccolo图形悦读笔记]卷8:通过render doc阅读主相机pass
在王希老师的GAMES现代游戏引擎入门课程学习中,我通过阅读Piccolo引擎的源码来深入理解,尽管我在C++和图形学方面尚属新手,若有不足之处,还望大家不吝赐教。
首先,通过Visual Studio构建引擎,找到并运行exe文件。接着,通过RenderDoc启动,可以截取并分析帧,事件浏览器展示了绘制流程,包括vkcmd指令和自定义标签,如"Directional Light Shadow"和"Forward Light Shadow",这些都是由引擎中的vulkan debug函数设置的。
为了验证修改,我在代码中将绘制方法从默认的deferred改为forward,通过添加特定标签并在RenderDoc中再次截取,确认了设置效果。接着,切换到Texture Viewer查看不同阶段的输出,如平行光阴影pass和点光源阴影pass,尽管原始工程未包含点光源,但引擎对所有mesh进行了处理。
主相机pass中,物体逐个绘制并混合到管线的color attachment,展现了forward render的特性,即避免无效绘制。天空盒和billboard粒子的添加,以及Tone Map和Color Grading(使用lut调色)等后期处理,进一步提升了画面效果。Imgui用于绘制编辑器界面,而Combine UI则整合了最终结果。
值得注意的是,虽然代码中包含FXAA子pass,但在RenderDoc中并未显示,可能是因为未开启。总的来说,初次使用RenderDoc分析Piccolo引擎的forward渲染过程,我深感其功能强大,它能监控资源、管线状态和shader,对图形学习大有裨益,值得进一步研究。