我们继续上一篇统合我们之前的工作,并对项目结构和代码树进行整理。
我们首先将D3D12的代码和OpenGL的代码整合进来。我在整合的过程当中,主要遇到以下几个问题:
- 无论显卡是否支持,D3D12需要win10/windows server 2016的支持。在之前的windows版本上通过安装win10 SDK可以实现代码的编译,但是无法运行。
- d3dx12.h不支持clang编译。主要是在类型转换符重载方面出现问题。具体的原因目前我还没有搞得很明白。当前知道的解决方法有两个:
- 用cl编译;
- 弃用d3dx12.h。
作为专业造轮子,我这里选择了后者。(注意d3dx12.h并不是d3d12库的一部分)
- Platform目录下的项目按平台分类,Linux平台的代码在Windows下是不能编译的,反之亦然。因此我们需要在CMakeLists.txt当中作平台的检测,进行条件编译。
在整合的同时,我对代码树进行了整理。
– 新建Asset目录,用于存放shader、贴图、模型、场景、动画、音频等游戏资源文件。
– 新建External目录,用于存放项目依赖的第三方库或者源码。
– 将原本在windows目录下的math.h重命名为vectormath.h,防止和标准头文件重名,并移动到了common目录下,因为其是跨平台的。同时扔掉DirectXMath,我们将自己写数学库。
– 新建RHI目录,并在其下分别建立d3d目录和opengl目录,用于存放图形API的接口。这些接口是平台无关的(虽然d3d只支持windows),所以把它们从platform目录里挪了出来。
– 为了实现图形API的平台无关性,我们需要将纯粹的图形API与平台相关的图形API分开。与平台无关的部分放在RHI之下,而创建context等平台特有的部分依然留在platform之下。比如platform/windows下的d3d12application和openglapplication。
– RHI下创建Empty,表示空(无)图形API。这是用来验证我们的代码(除了特定的RHI模块之外)与任何图形API都没有绑定关系,可以在空API的情况下完成编译。也就是图形API无关性。(平台无关性通过platform目录下的empty确保)
– 在External下面导入glad。这是一个OpenGL Loader(加载器)的自动生成脚本。可以根据最新的OpenGL规格文件(xml,脚本会自动从互联网下载)自动生成OpenGL的函数签名(申明)以及运行时加载并绑定这些API的C/C++源码。通过执行glad_generate.bat就可以生或者更新GL目录当中的文件。注意需要python2.7(在本系列开头编译clang的时候已经安装)
– 将pipeline初始化代码暂时去掉。因为接下来我们要开始准备场景管理与渲染资源管理模块了。之前的支线我们是在代码里写死的模型和shader,这些都去掉。自然pipeline暂时也没办法初始化了。等待我们完成场景管理与渲染资源管理模块之后,再补上这一部分。
本篇基本上是整合之前的支线代码,就不重复贴代码了。
整理之后最终目录的结构如下。对应的代码位于GitHub的article_21的branch当中:
C:USERSTIM.AZUREADSOURCEREPOSGAMEENGINEFROMSCRATCH │ .gitignore │ .gitmodules │ CMakeLists.txt │ LICENSE │ README.md │ ├─Asset │ └─Shaders │ cbuffer2.h │ copy.ps │ copy.vs │ illum.hs │ simple.hlsl │ vsoutput2.hs │ ├─External │ │ glad_generate.bat │ │ │ └─GL │ ├─include │ │ ├─glad │ │ │ glad.h │ │ │ glad_glx.h │ │ │ glad_wgl.h │ │ │ │ │ └─KHR │ │ khrplatform.h │ │ │ └─src │ glad.c │ glad_glx.c │ glad_wgl.c │ ├─Framework │ │ CMakeLists.txt │ │ │ ├─Common │ │ Allocator.cpp │ │ Allocator.hpp │ │ BaseApplication.cpp │ │ BaseApplication.hpp │ │ CMakeLists.txt │ │ GfxConfiguration.h │ │ GraphicsManager.cpp │ │ GraphicsManager.hpp │ │ main.cpp │ │ MemoryManager.cpp │ │ MemoryManager.hpp │ │ vectormath.h │ │ │ └─Interface │ IApplication.hpp │ Interface.hpp │ IRuntimeModule.hpp │ ├─Platform │ │ CMakeLists.txt │ │ │ ├─Empty │ │ CMakeLists.txt │ │ EmptyApplication.cpp │ │ │ ├─Linux │ │ helloengine_opengl.cpp │ │ helloengine_xcb.c │ │ │ └─Windows │ cbuffer.h │ cbuffer2.h │ CMakeLists.txt │ color.ps │ color.vs │ copy.ps │ copy.vs │ D3d12Application.cpp │ d3dx12.h │ helloengine_d2d.cpp │ helloengine_d3d.cpp │ helloengine_d3d12.cpp │ helloengine_opengl.cpp │ helloengine_win.c │ illum.hs │ Mesh.h │ OpenGLApplication.cpp │ OpenGLApplication.hpp │ simple.hlsl │ vsoutput.hs │ vsoutput2.hs │ WindowsApplication.cpp │ WindowsApplication.hpp │ └─RHI │ CMakeLists.txt │ ├─D3d │ CMakeLists.txt │ D3d12GraphicsManager.cpp │ D3d12GraphicsManager.hpp │ ├─Empty │ CMakeLists.txt │ └─OpenGL CMakeLists.txt OpenGLGraphicsManager.cpp OpenGLGraphicsManager.hpp
本作品采用知识共享署名 4.0 国际许可协议进行许可。