背景

因為個人對渲染比較感興趣,但於遊戲開發領域真的是個 new ass... 所以想以 DirectX 為突破口進行學習,頭腦一熱就在GitHub上開了個小項目SimpleEngine,這個項目是以DirectX Tutorials為基礎的,但還沒有包含 DirectX Tutorials 的所有內容,暫時大約是到 Tutorial 15 的樣子(最近空閑時間比較少,後面還沒來得及看 o(╥﹏╥)o )。

預計的打算是,一邊看Tutorials一邊自己寫,等自己對DX有了一定基礎後,再去接觸各種渲染演算法,看到好玩的就加進來這個樣子 ヾ(?`Д′?)?彡

DirectX Tutorials 框架本身的寫法比較偏向 C 的風格,也算是正好給我學習並練習 C++ 的機會吧,代碼寫得比較狗屎,請各位見諒 Orz

正文

DirectX Tutorials 在 Tutorial 8 中實現了一個 OBJ 導入工具,可以將 OBJ 格式轉化為一個簡單的 txt 文件,然後在引擎中載入這個 txt 文件從而獲取模型數據。

但這個工具幾乎只能用於教程所給的那個 cube.obj 資源 (╯°Д°)╯ 實際工程中用到的 OBJ 模型,格式規則遠比教程中多得多。。。

雖然模型載入這個事吧,跟渲染演算法關係不大,但我還是想專門花一段時間把這個東西擼出來,畢竟小姐姐模型賽高 ( ̄▽ ̄)/


Assimp

首先要解決模型載入的問題,因為網上能找到的模型資源,往往格式千變萬化,所以我想支持多種模型格式,自己根據格式規則一個一個擼肯定是不現實的,瞄來瞄去終於被我找到一個 Assimp 庫,藉助它我們可以使用一個 ReadFile 介面來載入大量模型格式,簡直贊。

導入庫的過程沒有什麼好說的,從 GitHub 下載源碼,然後 CMake 生成項目文件,Assimp 項目默認是生成 DLL 的,因為我比較喜歡靜態編譯(省得一個 DLL 文件挪來挪去),所以在 CMake 中 Configure 時設置了 BUILD_SHARED_LIBS 為 false,generate 項目文件成功後,打開 VS 編譯,得到 .lib 文件然後導入我自己的項目。

期間碰到唯一一個問題是,從 Assimp 項目自身源碼生成 ZLIB 時各種 BUG。。。 所以最後是直接拉了 Zlib 的源碼自己導入的。

rapidxml

因為我還是想沿用之前的做法,即將各種亂七八糟的模型格式導入工作從引擎中獨立出來,也就是先從 OBJ 之類的特殊 model format 導出一個引擎自用的模型中間格式,然後引擎這邊只需導入一個固定的模型格式即可,所以有個問題就是:我還是用 txt 文件格式嗎?

其實這裡也沒什麼好糾結的,txt 文件的問題一個是導出來的模型格式可讀性差,另一個是不易擴展,所以我想把它換成通用的 XML 格式,於是我導入了大名鼎鼎的 rapidxml 庫(請叫我 API Caller 小能手 Orz)

就此,我的 3D 模型導入工作就變成了寫一個 ModelImporter 工具,將 Assimp 解析到的模型數據導出成 XML 文件,然後在引擎中讀取這個 XML 文件來重新獲取模型數據。

其中,XML 文件的組織結構差不多就是跟著 Assimp 本身的數據結構走的,比較清楚明了。


至此,3D 模型導入的內容就講完了,然後是引擎自身的渲染流程需要進行一定修改。

原本的引擎比較簡單,ModelClass 名義上管理了場景中的模型數據,但其實一直只是渲染了個 cube 而已(就存了一個 Mesh 數據),而 ShaderClass 則是具體的著色器,兩者同級地放在 GraphicsClass 中,等到渲染時,先將 ModelClass 里的頂點緩存和索引緩存送到渲染管線,然後使用上面的 Shader 渲染。

而現在導入一個複雜的模型時,一個 Model 往往包含多個 Mesh,每個 Mesh 各有一套 Material,因此對類的組織結構做了一定修改。

上個圖

現在的渲染還是 DirectX Tutorials 一套,問題很多,各位看官無視就好(>ω?* )?

擼了兩天終於把模型導入這一塊搞完了,一本滿足╮( ̄▽ ̄)╭


推薦閱讀:
查看原文 >>
相关文章