我们继续上一篇统合我们之前的工作,并对项目结构和代码树进行整理。
我们首先将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 国际许可协议进行许可。