系統升級手記:從OGRE1.2到1.4

如果原來系統就是基於OGRE做的話,升級就按照ogre官方網站上升級Porting notes修正改過後的函數及函數接口;師兄給的這個MotionSynthesis系統,是一個基於MFC,用到了OGRE的一些API,加上原來沒有讀過源代碼,所在改起來還花了些功夫。下來是整理出來的步驟,其實解決問題的思路和過程纔是一種財富:
1、下載了OGRE1.4的SDK以及OgreDependencies_VC71SP1_Eihort_20070127,如果是Source,在Debug和release下編譯也是一樣的。首先將MotionSynthesis系統下用到OGRE中的.dll、.lib、.h文件用相應的1.4版本代替。刪掉在1.4中沒有的文件。
 
2、MotionSynthesis系統還用到了OgreDependencies,將Dependencies中include文件代替系統中原來的include。(如果你的系統還需要zlib1.dll,CEGUIWindowsLook.dll等的話,就說明你的OgreDependencies不是1.4的)
 
3、將系統工程的include修改到...1.4/OgreMain/inclue路徑,linker路徑修改到Dependencies/lib/debug以及OgreMain/lib/debug,當然最好在release時配置一下。(此時非常“欣喜”的看到終於有編譯錯誤了)
 
4、編譯的錯誤是找不到setDebugText與getDebugText,在Porting Notes(http://www.ogre3d.org/wiki/index.php/EihortNotes#Porting_notes)中可以知道,RenderTarget的setDebugText,getDebugText已經不存在了。所以在系統的SimplerFrameListener.h/.cpp中用一個mDebugText的變量記錄下來,它是一個string類型,在工程中所有setDebugText和getDebugText的地方,都用mDebugText作相應的代替,可以參考ExampleFrameListener的寫法。
 
5、現在編譯通過了,鏈接又出了問題,是說找不到Zlib1.dll文件,因爲工程中沒有用到dll,且有可能其它dll導入了Zlib1.dll的函數,不過因爲Zlib1.dll已經在1.4只不再用了,很快就發現原來是第一步替換的時候忘記了OgreMain_d.dll 與OgreMain.dll(release下)。
 
6、鏈接通過,運行時拋出了異常“unhandled exception at 0x7c812a5b in MotionSynthesis.exe:Microsoft C++ exception:ogre::InternalErrorException @0x0013ea58”如此,實在是默驢技窮了,師兄和哥哥都建議用try catch去捕獲異常,MessageBox Show看看是什麼問題,可是在下實在是愚鈍,弄不清楚在什麼地方加這段代碼,調試一下知道是在MotionSynthesis.cpp的構造函數中出錯了,最後就用了很土的方法,查看日誌
(#ifdef DEBUG
    m_OgreRoot = new Ogre::Root("plugins_d.cfg", "ogre.cfg", "MotionSynthesis.log");
#else
    m_OgreRoot = new Ogre::Root("plugins.cfg", "ogre.cfg", "MotionSynthesis.log");
#endif
因爲有這一段話在)在MotionSynthesis.log中顯示的是10:32:05: OGRE EXCEPTION(7:InternalErrorException): Could not load dynamic library ./RenderSystem_Direct3D9.  System Error: 找不到指定的模塊。  in DynLib::load at d:/ogredev/eihort/ogremain/src/ogredynlib.cpp (line 80)
哦,知道了,原來是加載RenderSystem_Direct3D9.dll時出錯了,可是前面不是已經更新過這個了嗎,仔細查了才明白,1.4時將所有以plugin形式加載的dll,對Debug和Release版本名字做了改變,以前都是*.dll,如RenderSystem_Direct3D9.dll,Debug和Release都是一樣,1.4中Debug則在後面加了_d,RenderSystem_Direct3D9_d.dll,因爲在我們系統中,Debug和Release加載dll都在同一個路徑,如果不以名字來區分的話,就會出錯。(詳情參看      《Pro Ogre 3D Programming》的五章),知道問題就好辦了。RenderSystem_Direct3D9的插件加載是在Plugins_d.cfg中說明的,則須要在Plugins_d.cfg中將所有的插件名後都加_d就OK了,如:Plugin=RenderSystem_Direct3D9_d Plugin=Plugin_OctreeSceneManager_d
Plugin=Plugin_CgProgramManager_d 等。
 
7、哇,終於看到久違的窗口了,天是那麼的藍,不過,還是有點問題,以前的地圖材質信息沒有了,分析,應該是我直接將OgreSDK的media覆蓋了原來系統的media,而有可能師兄改變了media中一些材質,還好保存了一份原來的工程。後來師兄說是
Example.material添加了地圖材質信息。通過工程的CreatScene()中的 ent->setMaterialName("Examples/Platform");則知道用的是Platform這種帖圖。則按樣在Example.material增加了一個Platform.jpg的texture_unit。
大功告成了!!!!!!
 
其實這個系統只是一個很小的系統,規模再大的話還要改更多的地方。雖然很簡單的事,可是這種分析解決問題的思路,結果還真的讓人小有成就感:)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章