從零開始手敲次世代遊戲引擎(二十一)
我們繼續上一篇統合我們之前的工作,並對項目結構和代碼樹進行整理。
我們首先將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.AZUREADSOURCEREPOSGAMEENGINEFROMSCRATCHn│ .gitignoren│ .gitmodulesn│ CMakeLists.txtn│ LICENSEn│ README.mdn│n├─Assetn│ └─Shadersn│ cbuffer2.hn│ copy.psn│ copy.vsn│ illum.hsn│ simple.hlsln│ vsoutput2.hsn│n├─Externaln│ │ glad_generate.batn│ │n│ └─GLn│ ├─includen│ │ ├─gladn│ │ │ glad.hn│ │ │ glad_glx.hn│ │ │ glad_wgl.hn│ │ │n│ │ └─KHRn│ │ khrplatform.hn│ │n│ └─srcn│ glad.cn│ glad_glx.cn│ glad_wgl.cn│n├─Frameworkn│ │ CMakeLists.txtn│ │n│ ├─Commonn│ │ Allocator.cppn│ │ Allocator.hppn│ │ BaseApplication.cppn│ │ BaseApplication.hppn│ │ CMakeLists.txtn│ │ GfxConfiguration.hn│ │ GraphicsManager.cppn│ │ GraphicsManager.hppn│ │ main.cppn│ │ MemoryManager.cppn│ │ MemoryManager.hppn│ │ vectormath.hn│ │n│ └─Interfacen│ IApplication.hppn│ Interface.hppn│ IRuntimeModule.hppn│n├─Platformn│ │ CMakeLists.txtn│ │n│ ├─Emptyn│ │ CMakeLists.txtn│ │ EmptyApplication.cppn│ │n│ ├─Linuxn│ │ helloengine_opengl.cppn│ │ helloengine_xcb.cn│ │n│ └─Windowsn│ cbuffer.hn│ cbuffer2.hn│ CMakeLists.txtn│ color.psn│ color.vsn│ copy.psn│ copy.vsn│ D3d12Application.cppn│ d3dx12.hn│ helloengine_d2d.cppn│ helloengine_d3d.cppn│ helloengine_d3d12.cppn│ helloengine_opengl.cppn│ helloengine_win.cn│ illum.hsn│ Mesh.hn│ OpenGLApplication.cppn│ OpenGLApplication.hppn│ simple.hlsln│ vsoutput.hsn│ vsoutput2.hsn│ WindowsApplication.cppn│ WindowsApplication.hppn│n└─RHIn │ CMakeLists.txtn │n ├─D3dn │ CMakeLists.txtn │ D3d12GraphicsManager.cppn │ D3d12GraphicsManager.hppn │n ├─Emptyn │ CMakeLists.txtn │n └─OpenGLn CMakeLists.txtn OpenGLGraphicsManager.cppn OpenGLGraphicsManager.hppn
本作品採用知識共享署名 4.0 國際許可協議進行許可。
推薦閱讀:
※GameJam48小時遊戲SEDs開發總結
※幀同步技術目標總結
※腦洞之奧丁晶石與北歐神話的聯繫(二)
TAG:游戏开发 |