从零开始手敲次世代游戏引擎(二十一)

我们继续上一篇统合我们之前的工作,并对项目结构和代码树进行整理。
我们首先将D3D12的代码和OpenGL的代码整合进来。我在整合的过程当中,主要遇到以下几个问题:

  1. 无论显卡是否支持,D3D12需要win10/windows server 2016的支持。在之前的windows版本上通过安装win10 SDK可以实现代码的编译,但是无法运行。
  2. d3dx12.h不支持clang编译。主要是在类型转换符重载方面出现问题。具体的原因目前我还没有搞得很明白。当前知道的解决方法有两个:
  1. 用cl编译;
  2. 弃用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 国际许可协议进行许可。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 登出 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 登出 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 登出 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 登出 /  更改 )

Connecting to %s

%d 博主赞过: