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

相關文章
相關標籤/搜索