OGRE

编译 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的功能总结为两个方面:

  1. 管理Camera, SceneNode, Entity, Light等场景中的对象,做为Factory提供create方法如createEntity(), createLight()(也负责释放它们);
  2. 管理场景图形,包括维护场景树的可用性,计算节点的Transform信息,隐藏面剔除(Culling)。

  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;

 

 

八、

九、

参考:

一、http://www.javashuo.com/article/p-wgmvtatn-kc.html

相关文章
相关标签/搜索