【编译 OGRE C#】html
一、官网下载 OGRE 源码。设计模式
二、打开CMake,指定好OGRE目录,以及生成目标目录。ide
三、将 CMake/Modules 目录下的 FindSwig.cmake 中的 find_program(swig NAMES ) 加上本地 PATH。如:函数
注意 swig 版本选择。在 ogre/components/csharp/CMakeList.txt 文件的第一行,指定了但愿的版本,当前是 3.0.8,若是使用了更新的版本,可能致使错误。ui
四、依次点击 configure、generate、open project 便可生成并打开工程。spa
五、libOgre 便是 C# binding 工程,编译此项目。结果是编译错误,将 CSharp_new_Node_DebugRenderable 函数注释掉便可。设计
六、成功生成 libOgre.dll。3d
【OGRE】调试
一、Ogre::Rootrest
在调用OGRE任何功能以前,首先要实例化一个Root类,该Root实例将直接或间接指向全部其余类的实例。一个OGRE程序有且只有一个Root对象,所以Root类使用Singleton设计模式(单例模式,继承自Singleton<Root>)。
Root (const String &pluginFileName="plugins"OGRE_BUILD_SUFFIX".cfg", const String &configFileName="ogre.cfg", const String &logFileName="Ogre.log")
mRoot = new Ogre::Root("plugins.cfg","ogre.cfg","Ogre.log");
logFileName文件是OGRE程序的日志文件,在OGRE程序能够插入写日志的代码,日志文件方便对OGRE程序的调试。向日志文件写入信息的代码的一个例子以下:
Ogre::LogManager::getSingleton().logMessage(">>Rendering");
二、设定 RenderSystem,初始化
RenderSystem类对渲染系统(底层的OpenGL或Direct3D)进行抽象,它至关因而执行渲染的设备。给 Root 添加一个RenderSystem实例的最简单方式是调用Ogre::Root:: showConfigDialog方法,运行时系统将弹出以下对话框,让用户选择要使用的图形驱动,以及相应的参数:
if(!mRoot->showConfigDialog()) return false;
咱们在这个对话框所作的设置被记录在ogre.cfg文件中(见上面第2节)。也能够不用对话框,而在程序中设置,也就是说在程序中设置咱们在对话框所选的项:
Ogre::RenderSystem *rs = mRoot->getRenderSystemByName("OpenGL Rendering Subsystem"); mRoot->setRenderSystem(rs); rs->setConfigOption("Full Screen", "No"); rs->setConfigOption("Video Mode", "800x600 @ 32-bit colour");
“启动代码”使用的是后者,代码在第24-27行。
若是不想每次都弹出对话框选择渲染系统,能够用以下代码:
if( !(mRoot->restoreConfig() || mRoot->showConfigDialog()) ) return false;
RenderSystem对象建立后须要初始化,Ogre::Root::initialise(bool, const String, const String)方法就是初始化root的RenderSystem的,若是第一个bool参数为true,将自动建立窗口
mRoot->initialise(false);
三、建立 RenderWindow
RenderWindow是对窗口的抽象,该窗口用来显示渲染结果(对于离线渲染或渲染到纹理则不须要窗口)。建立窗口最简单的方法是在调用Ogre::Root::initialise方法时传入true做为第一个参数:
mWindow = mRoot->initialise(true, "Win Ogre");
也可使用手动建立RenderWindow的方法:
int hWnd = 0; Ogre::NameValuePairList misc; misc["externalWindowHandle"] = Ogre::StringConverter::toString((int)hWnd); mWindow = mRoot->createRenderWindow("Win Ogre", 800, 600, false, &misc);
四、SceneManager类管理OGRE的场景图形(Scene Graph),《Ogre 3D 1.7 Beginner's Guide》的Chapter 6中将SceneManager的功能总结为两个方面:
SceneManager不是Singleton,能够从Root建立一个(或多个)SceneManager,“启动代码”的第41行建立了一个普通类型的SceneManager:
mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);
五、Camera
Camera是场景到窗口输出的媒介,负责将3D场景映射到2D窗口,这个映射涉及到另外一个类Viewport,Viewport将Camera对场景的“拍摄”结果“贴”到窗口的所有可绘制区域的一个矩形部分。一个Root能够有多个SceneManager,一个SceneManager中也能够有多个Camera,但每一个Camera都须要一个Viewport对应到窗口的一个矩形区域。
mCamera = mSceneMgr->createCamera("PlayerCam"); mCamera->setNearClipDistance(5);
// Create one viewport, entire window Ogre::Viewport* vp = mWindow->addViewport(mCamera); vp->setBackgroundColour(Ogre::ColourValue(0,0,0)); // Alter the camera aspect ratio to match the viewport mCamera->setAspectRatio( Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
六、加载资源
1)用ResourceGroupManager::addResourceLocation方法添加资源文件所在目录;
2)用ResourceGroupManager::declareResource方法声明(declare)资源,可选的;
3)用ResourceGroupManager::initialiseResourceGroup或ResourceGroupManager::initialiseAllResourceGroups方法初始化所添加目录中的资源文件脚本;
4)默认下,资源文件的数据直到该资源使用时才被加载,如一个纹理的图片并非在纹理定义时加载,而是在纹理被首次使用时加载至内存,也能够手动调用ResourceGroupManager::loadResourceGroup加载。
Ogre::ConfigFile cf; cf.load("resources.cfg"); Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while( seci.hasMoreElements() ){ secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for( i=settings->begin(); i!=settings->end(); ++i ){ typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton(). addResourceLocation(archName, typeName, secName); } }
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
七、渲染循环
调用Root::startRendering方法进入渲染循环,渲染结束释放Root:
Ogre::LogManager::getSingleton().logMessage(">>Rendering"); mRoot->startRendering(); // 释放资源,目前只需释放Root delete mRoot;
八、
九、
参考: