系统升级手记:从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。
大功告成了!!!!!!
 
其实这个系统只是一个很小的系统,规模再大的话还要改更多的地方。虽然很简单的事,可是这种分析解决问题的思路,结果还真的让人小有成就感:)
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章