大家好,我是吉祥,研究生毕业于浙江大学CAD&CG实验室,目前在国内从事游戏引擎和实时渲染相关领域的研究和开发。在2020年6月,我曾经发布过一款名为Luna Engine v0.6的简易渲染开发框架(Luna Engine v0.6 发布 - 知乎 (zhihu.com))。作为Luna的早期尝试版本,Luna Engine v0.6得到了大家的广泛关注和支持,也有不少的朋友通过知乎、Bilibili、QQ等方式一直在关注该项目的最新进展。在此我向这些一直关注我的朋友表示衷心的感谢。在过去的三年里,我一直在筹备一个真正具有实用性,能够帮助大家完成一些实际工作的跨平台实时渲染框架。在筹备的过程中,我将Luna Engine v0.6的核心代码进行了大规模的重写,以便其更加完善和易用,同时保证了其能够在多个平台具有一致的表现。在对Luna代码进行重构的同时,我认识到Luna框架实际上并不满足作为一个游戏引擎的条件,以目前的功能和体量来说,其更像是一个可以用于进行实时渲染应用程序开发的开发框架,因此在决定开发新版本Luna的时候,我采用了全新的名字——LunaSDK,并沿用了旧版Luna的版本号,将其命名为LunaSDK v0.8。
目前我仍然在完成LunaSDK v0.8的最后一些开发工作,正式的版本发布预计会在2023年底至2024年初进行。虽然距离LunaSDK v0.8的正式发布还有一段时间,但是我决定先将目前的仓库公开,大家可以从GitHub直接下载体验最新版本的LunaSDK:
LunaSDK v0.8包含了许多的新功能和现有功能的改进,以下将挑选LunaSDK v0.8的一些核心功能进行进一步的介绍。
新的开源许可证
LunaSDK启用了新的开源许可证:zlib/libpng许可证。该许可证允许用户自由使用、复制、修改和分发LunaSDK,仅限制了用户不能声称自己制作了LunaSDK,以及不能因为使用LunaSDK导致的各种损失而起诉作者。我们将坚持LunaSDK开源免费的定位,承诺zlib/libpng许可证授权方式将长期有效,您可放心使用LunaSDK做任何您想做的事情,而无需担心日后被收取额外的费用或被强制要求停止使用。
跨平台支持
虽然Luna的定位为跨平台渲染框架,但在上一个版本发布之时,其实际上仅支持Windows平台,且在API设计上有诸多不合理之处,使得其无法被移植到其它平台上。新版的LunaSDK v0.8是第一个真正实现跨平台的LunaSDK版本,我们重新设计了大部分系统和图形API,使得其在发布之时便支持Windows和macOS两个平台,以及Direct3D 12、Vulkan 1.0+和Metal 2.0+三大主流图形API。在未来数月中,我们还将继续进行LunaSDK的跨平台开发,有望在2023年底实现LunaSDK的iOS和Android平台支持。
重新编写的运行时
LunaSDK重写了老Luna的大部分运行时代码,极大地简化了使用LunaSDK进行C++编程的难度。LunaSDK的新版运行时功能包括重新设计的非侵入式装箱对象模型,完善的类型动态反射系统和序列化系统,基于动态反射的接口查询系统,重新编写的容器库、算法库、数学库,对网络API相关功能的跨平台封装和支持等。利用LunaSDK的新版运行时,用户在编写C++代码的时候可以具有与C#、Swift等高级语言类似的编程体验,无需手动管理内存,实现运行时类型识别、错误处理等。
基于xmake的构建系统
旧版本的Luna使用CMake作为构建系统。由于CMake并不自带包管理系统,且脚本语言语法复杂,随着Luna模块和依赖的第三方库越来越多,使用CMake的维护成本日益增长。因此,LunaSDK将使用xmake代替CMake作为框架的构建系统。相比CMake,xmake使用lua语言编写构建脚本,在保证了语法简单清晰的同时也提供了足够的灵活性,并且xmake自带的包管理系统也可以非常方便的引入和使用各种第三方库,且支持跨平台的编译和使用,包括在持续集成流水线环境中使用。
新的示例和测试项目
我们为LunaSDK编写了数个测试项目,这些测试项目用于验证LunaSDK在不同平台和API上的特性一致性,您也可以通过查看这些测试项目的代码来学习LunaSDK的API用法。这些测试项目包括:
RHITest1_FillBackBuffer:展示了使用LunaSDK清屏的结果。
RHITest2_Triangle:展示了使用LunaSDK绘制一个三角形的结果。
RHITest3_Texture:展示了使用LunaSDK加载和绘制纹理的结果。
RHITest4_Box:展示了使用LunaSDK绘制一个旋转的,具有纹理的方盒子的结果。
ImGuiTest:展示了使用LunaSDK配合Dear ImGui进行GUI绘制的结果。
FontArrangeTest:展示了使用LunaSDK的矢量绘制功能进行字体绘制的结果。
除了以上测试之外,我们还实现了一个简易的PBR渲染器(Studio项目),以集成测试和展示LunaSDK提供的大部分功能。
对应的工程文件可以在此处下载:
LunaSDK-Studio-Sample-Project-1.0.0.zip
相比旧版Luna附带的Studio,新版Studio的修改主要包括:
- 完成的基于物理渲染,包括直接光和基于环境贴图的间接光渲染。
- 离线mipmap生成和环境贴图mip生成。
- 支持编辑器中删除资产。
- 支持资产的拖放(drag-drop)设置操作。
需要注意的是,Studio本身仅作为引擎API功能的集成测试和展示使用,因此我们并没有在其中添加过多的渲染特性,在之后也不会花过多精力为其添加更多功能,因此您不应将其作为完善的编辑器或渲染器看待。
文档站
没有文档的代码库绝无意义。在发布LunaSDK之时,我们的文档站也同步上线:
目前文档站的文档已经涵盖入门教程、核心功能和RHI模块文档,我们将会在后续开发中逐渐补全其余模块的文档,并搭建基于doxygen的文档自动构建管线,从而实现API文档的全覆盖和实时同步。同时,LunaSDK的文档站也完全开源,并使用GitHub Pages进行托管:
未来展望&项目交流
从2018年5月写下第一行代码开始至今,Luna项目已经走过了五个年头。在这五年的开发历程中,Luna的框架经历了数十次重写和大规模重构,从最初的个人学习项目(2018),变成了个人研究用引擎(2020),最后变成了一个可以供大家共同来使用和完善的开源项目。在未来,我打算将LunaSDK打造成一个可以用于构建自主游戏引擎和实时渲染应用程序的通用框架,其将做好跨平台、图形API、运行时资源管理、序列化和反射、图形界面绘制等基础功能,而将游戏逻辑、脚本、物理模拟、场景管理等需要针对引擎和程序高度定制的系统留给上层开发者发挥的空间。
目前,LunaSDK v0.8的开发工作仍在收尾阶段,因此部分API可能会有小幅度的修改,且部分功能可能会有未发现的bug。如果在使用LunaSDK的过程中发现任何问题,欢迎在GitHub的项目页面通过提交Issue的方式提交问题反馈。同时,如果对LunaSDK有自己的想法,也可以在GitHub项目页面的讨论版块进行留言。同时,我们也准备了Luna项目专用的QQ群,非常欢迎大家加群,获取项目的最新进展,并为Luna项目的未来发展出谋划策:
以上。