文章目录
MiniEngine介绍
MiniEngine是Microsoft的一个dx12的核心实现,项目地址:https://github.com/Microsoft/DirectX-Graphics-Samples
可以在MiniEngine的基础上直接开发游戏,MiniEngine实现了很多常用功能:
项目目的
对于魔力高清单机版来说,选一个简单的引擎是很有必要的。
初步计划的是tiled map地图、3d角色。后期再把地图物件换成3d。
简单调研了几个商业引擎,感觉总有各种各样的不满意。学习成本非常高,所以准备自己实现一套很简单的引擎,只做当前项目需要的功能。
在实现引擎之前,需要打好基础,也就是学习d3d12的龙书。
龙书中的代码结构不太喜欢,这时候看微软的dx12例子,发现了MiniEngine引擎,觉得非常棒。
但学习MiniEngine也比较麻烦,文件非常多。于是准备做拆解。
通过龙书学习,每次只使用MiniEngine种最少的文件来实现当前章节功能,添加中文注释。
相信随着龙书的学习,可以慢慢地把MiniEngine的功能回复回来。也就可以做到吃透MiniEngine代码。
本次学习的项目地址:https://github.com/mversace/DirectX12-MiniEngine-Dragon
前期准备
- 本项目采用的是最新的visual studio 2019
- 下载微软官方的MiniEngine源码:https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/MiniEngine
- 下载d3d12龙书的源码:https://github.com/d3dcoder/d3d12book
龙书第四章的实现过程
这一章节主要讲的是dx12的初始化。
根据教材本次项目分为如下步骤:
- 创建ID3D12Device接口实例
- 创建ID3D12Fence对象,并查询描述符大小
- 检测4x MSAA的支持(这一步骤没有必要性)
- 创建命令队列、命令列表分配器和主命令列表
- 创建交换链
- 创建描述符堆
- 调整后台缓冲区大小,创建渲染目标视图
- 创建深度/模板缓冲区以及视图
- 设置视口、裁剪矩形
第一次拆解工程,讲的会比较详细,之后的博客对于拆解过程就简单略过。
实际上在此之前,需要先创建一个win32窗口,并做好消息循环。这是很基础的东西,不深入讨论,简单介绍下:
0. 创建win32窗口
先看下MiniEngine的实现,该项目的启动工程在ModelViewer种的ModelViewer_VS15.sln
打开之后在开始找入口函数:
很容易发现是采用一个宏定义包起来的
CREATE_APPLICATION( ModelViewer )
在GameCore.h中
#define CREATE_APPLICATION( app_class ) \
MAIN_FUNCTION() \
{ \
IGameApp* app = new app_class(); \
GameCore::RunApplication( *app, L#app_class ); \
delete app; \
return 0; \
}
我不喜欢这种宏定义的方式