OGRE框架初探之實現對D3D的封裝

2021-05-26 02:41:24 字數 2163 閱讀 9162

因為專案的需要,這兩天看了部分ogre的原始碼,主要是框架部分,略有體會,寫下來僅作為記錄,語句或有雜亂,如不慎被各位牛人看到,調笑之餘歡迎各種指點。

世上有兩種圖形引擎,一是直接與硬體打交道,如d3d和opengl;一是在前者的基礎上,以更高效的圖形開發為目的,通過封裝更多底層細節,所形成的圖形引擎,如unreal、source。

底層圖形語言d3d和opengl,實現了對硬體細節層面的封裝,提供了統一程式設計介面,讓程式設計師從各種底層硬體介面中解脫出來,專注於相對高層的**層面。

高層圖形語言把這個思想更進一步,通過對d3d和opengl的更多細節封裝,隱藏了與圖形加速卡直接互動的介面,提供了場景管理等各種管理模組,以及運用多種設計模式,達到使遊戲開發高效率,高重用性,低錯誤率等等好處。

ogre作為同時支援d3d與opengl的開源引擎,其底層部分就需要對這兩者進行封裝。為了便於理解。可以暫時將ogre分成兩個層面:底層圖形語言無關的功能層面和底層圖形語言相關的實現層面。(鑑於已看的**不多,姑且暫時這麼分吧,可能某些部分不能單純這麼劃分,就先不管了:)。

功能層面上,ogre通過manager,實現對log,controller,scene,dynlib,archive,material,mesh,particle_system,skeleton,resource,shadow_texture,render_system,等功能的管理。這些模組都生成相應的manager例項,放於root class中,在工程其他地方中可以通過呼叫root的getxx方法,或者classname::getsingleton()的方法,獲得該類的單例。因為每個manager類都是多重繼承自它的基類和乙個singleton模板類,用這種方法保證了各manager類例項的唯一性。功能層面的各個manager用於管理scene(主要是node的管理,scene_manager的子類bspscenemanager和octreescenemanager,分別提供了不同了的場景組織方法),resource(material,mesh,particle,skeleton,shadow_texture等),和輔助模組(log,dynlib等),另外root中儲存rendersystem的例項,提供了經過封裝的底層語言(d3d,gl)的介面。

實現層面,也就是rendersystem,是乙個虛基類,用大量純虛函式定義了所需實現的底層相關介面,d3d9rendersystem和glrendersystem繼承自rendersystem,分別用d3d和gl實現相應介面。呼叫rendersystem的介面時,通過多型呼叫子類介面實現。

接下來談下實現層面部分——模組rendersystem_direct3d9,gl的就不寫了,總體上差不多。模組rendersystem_direct3d9中,ogre用d3d9device封裝d3d的device;用d3d9driver封裝d3dcaps9;用d3d9gpuprogram——繼承自gpuprogram,以實現對low-level program的封裝和管理;用d3d9hlslprogram——繼承自highlevelgpuprogram,提供對d3d9 high-level shader language (hlsl)的支援。在這基礎上,更上乙個層面是d3d9devicemanager等各種manager去做管理。另外,用d3d9hardwareindexbuffer——繼承自hardwareindexbuffer,d3d9hardwarevertexbuffer——繼承自hardwarevertexbuffer,分別實現對indexbuffer,vertexbuffer的封裝,他們類內部都有乙個hardwarebuffermanagerbase的指標,呼叫指標類管理自身,而這個類,在本模組中,有乙個派生類d3d9hardwarebuffermanagerbase,因此該指標實際上初始化為d3d9hardwarebuffermanagerbase指標。另有d3d9hardwarepixelbuffer——繼承自hardwarepixelbuffer,實現對pixelbuffer的封裝,然後用繼承自rendertexture的子類d3d9rendertexture對其做進一步封裝,然後用d3d9texturemanager作為其管理類。這樣模組rendersystem_direct3d9的架構就差不多清楚了。主介面類d3d9rendersystem作為與外部互動的總介面,其內部儲存著上述所有manager的指標,實現總體上的排程和管理。

對d3d的封裝實際上就是模組rendersystem_direct3d9這個實現層面,略略的看完,也略略的記錄完,僅是對整體框架有乙個把握。其他的對ogre的**,等有了發現在寫:)

D3D基本框架 即D3D標頭檔案分類

了dxut的結構 後,發現微軟程式設計師的編碼風格太深奧了。各種巨集定義 預編譯跳得頭暈,由於對於window api的不精通,導致寫出符合dxut風格的框架以現在的水平來看是不可能的。既然沒有弄通dxut,我也暫時不想套用了,那麼還是先自己用自己的框架來寫把。框架如下 雖然沒學會dxut,但是微軟...

Ogre3D 實現角色換裝

乙個角色由多個模型組成,這些模型掛在同乙個主節點上,由同乙個骨骼動畫控制著。換裝就是剔除或新增一些模型,如果只是刪增模型,那樣只可以實現一起平移和旋轉。因為裝備,如衣服都是要和身體一起發生形變的。所以,模型之間要統一這些發生形變的方式,那就是骨骼。分類 1.屬於掛接物體,不屬於換裝範疇,建立乙個節點...

如何實現D3D全屏與視窗的轉換

有很多遊戲會提供這樣的功能,比如足球經理,生化危機,魔獸世界等,這樣做最大的便利,是讓你可以在玩遊戲的同時做其他事情 i guess 1 首先要做的事情是為d3dpresentation parameters設定好與此有關的引數,簡單的說就是,我們必須要讓device明確知道當前的top視窗是哪個,...