【編譯 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;
八、
九、
參考: