ogre 引擎 框架追踪 第二章 初始化
2016-11-24 18:49
405 查看
链接:第一章
第一章中已经创建完root,ogre渲染所需的管理器基本创建,动态库已经加载。
管理器有了,渲染系统有了,下面就是往管理器中塞东西,选择渲染系统,并且创建窗口并渲染了。
看似简单的一句话,里面进行了啥不可告人的勾当呢?继续往下跟。
其中我们需要看一下oneTimePostWindowInit,里面有很重要的东西哦。
好吧,终于root的初始化完成了,其实root的初始化可以简单的理解为渲染系统(dx或gl)的初始化,如果之前用过dx或gl的应该很熟悉。
就这句话管用createRenderWindow,下面我们跟一跟这个就行了。
底层dx的调用中核心代码:
好的,到此渲染系统、渲染窗口都有了,下面的就是加载资源、解析资源。最后创建场景了。
第一章中已经创建完root,ogre渲染所需的管理器基本创建,动态库已经加载。
管理器有了,渲染系统有了,下面就是往管理器中塞东西,选择渲染系统,并且创建窗口并渲染了。
1、选择渲染系统并设置
系统已经加载了渲染系统(dx、gl),现在就是选择一个系统并设置,个人喜好的设置dx//系统已经加载了渲染系统(dx、gl),现在就是选择一个系统并设置,个人喜好的设置dx #if MyRenderSystem_DX Ogre::RenderSystem *rs = mRoot->getRenderSystemByName("Direct3D9 Rendering Subsystem"); #else Ogre::RenderSystem *rs = mRoot->getRenderSystemByName("OpenGL Rendering Subsystem"); #endif //下面的代码是设置渲染系统的。 rs->setConfigOption("Full Screen", "No"); rs->setConfigOption("Video Mode", "1440 x 900 @ 32-bit colour"); #if MyRenderSystem_DX //dx渲染系统跟gl系统不同,有些设置不同,设置的时候要注意。 rs->setConfigOption("Multi device memory hint","Use minimum system memory"); rs->setConfigOption("Resource Creation Policy","Create on all devices"); rs->setConfigOption("Use Multihead","Auto"); rs->setConfigOption("VSync","Yes"); rs->setConfigOption("VSync Interval","1"); #endif mRoot->setRenderSystem(rs);
2、root的初始化
root初始化很简单,调用就一句话//bool参数是设置是否自动创建窗口的,在这儿我就自己创建窗口,设置false mRoot->initialise(false);
看似简单的一句话,里面进行了啥不可告人的勾当呢?继续往下跟。
RenderWindow* Root::initialise(bool autoCreateWindow, const String& windowTitle, const String& customCapabilitiesConfig) { //先判断是否已经选择了渲染系统,所以必须先选择渲染系统 if (!mActiveRenderer) OGRE_EXCEPT(Exception::ERR_INVALID_STATE, "Cannot initialise - no render " "system has been selected.", "Root::initialise"); //这个 “控制器的管理器”也是单例的,新建完就用单例方式调用了,ogre里主要用在了“动态材质”,纹理动画那部分。 if (!mControllerManager) mControllerManager = OGRE_NEW ControllerManager(); // .rendercaps manager,这个管理器在新建root时已经创建,管理渲染系统信息的 RenderSystemCapabilitiesManager& rscManager = RenderSystemCapabilitiesManager::getSingleton(); ///不细说了,设置渲染系统信息的 // caller wants to load custom RenderSystemCapabilities form a config file if(customCapabilitiesConfig != StringUtil::BLANK) { ConfigFile cfg; cfg.load(customCapabilitiesConfig, "\t:=", false); // Capabilities Database setting must be in the same format as // resources.cfg in Ogre examples. ConfigFile::SettingsIterator iter = cfg.getSettingsIterator("Capabilities Database"); while(iter.hasMoreElements()) { String archType = iter.peekNextKey(); String filename = iter.getNext(); rscManager.parseCapabilitiesFromArchive(filename, archType, true); } String capsName = cfg.getSetting("Custom Capabilities"); // The custom capabilities have been parsed, let's retrieve them RenderSystemCapabilities* rsc = rscManager.loadParsedCapabilities(capsName); if(rsc == 0) { OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, String("Cannot load a RenderSystemCapability named ") + capsName, "Root::initialise"); } // Tell RenderSystem to use the comon rsc useCustomRenderSystemCapabilities(rsc); } //输出下平台信息 PlatformInformation::log(LogManager::getSingleton().getDefaultLog()); //又是一个简单的调用,这个对象是dx和gl渲染系统类的基类,调用了dx系统的初始化,里面进行了渲染驱动获取、驱动设置、设备管理器(显卡管理器)、纹理管理器、硬件缓存管理器(存放顶点等的硬件缓存的管理器)、gpu编程管理器、hlsl编程工厂。因为没有我这里的bool值为false,返回的窗口值是null。 mAutoWindow = mActiveRenderer->_initialise(autoCreateWindow, windowTitle); //自动创建的窗口进行初始化并显示的 if (autoCreateWindow && !mFirstTimePostWindowInit) { oneTimePostWindowInit(); mAutoWindow->_setPrimary(); } // Initialise timer mTimer->reset(); // Init pools,凸面体初始化(字面意思),用的不多暂时不追究了 ConvexBody::_initialisePool(); mIsInitialised = true; return mAutoWindow; }
其中我们需要看一下oneTimePostWindowInit,里面有很重要的东西哦。
//后台资源管理队列初始化 mResourceBackgroundQueue->initialise(); //工作队列初始化 mWorkQueue->startup(); // Initialise material manager材质管理器的初始化,里面创建了点默认材质和策略 mMaterialManager->initialise(); // Init particle systems manager,粒子系统的初始化,ogre粒子基于白板的,所以创建并添加了白板工厂 mParticleManager->_initialise(); // Init mesh manager,模型管理器初始化,建了三个简单模型的模板:平面、球、方体,所以ogre之所以能直接创建这几个体,就是因为天下没有平白无故掉下来的馅饼。 MeshManager::getSingleton()._initialise(); // Init plugins - after window creation so rsys resources available //这里面各个动态dll初始化的,但是dx、gl的这两个里面没有做啥,要是现在再做点啥就太晚了。 initialisePlugins();
好吧,终于root的初始化完成了,其实root的初始化可以简单的理解为渲染系统(dx或gl)的初始化,如果之前用过dx或gl的应该很熟悉。
3、渲染窗口的创建
前面没有用渲染系统自己创建的窗口,就自己创建吧。俺是基于view创建的窗口,参考的也是网上的方法。Ogre::NameValuePairList misc; misc["externalWindowHandle"] = Ogre::StringConverter::toString((int)m_hWnd);//这句很重要,就是把窗口句柄传进去。 misc["left"]="0"; misc["top"]="0"; misc["FSAA"]="2"; misc["Full Screen"]="Yes"; #if MyRenderSystem_DX { misc["FSAA"] = "0"; misc["FSAAHint"] = ""; misc["colourDepth"] = "32"; misc["gamma"] ="false"; misc["monitorIndex"] ="0"; misc["useNVPerfHUD"] ="false"; misc["vsync"] = "true"; misc["vsyncInterval"] = "1"; } #endif bool isFullScreen=false; CRect rect; GetClientRect(&rect); mWindow = mRoot->createRenderWindow(RenderWindowName, rect.Width(), rect.Height(), isFullScreen, &misc);
就这句话管用createRenderWindow,下面我们跟一跟这个就行了。
if (!mActiveRenderer) { OGRE_EXCEPT(Exception::ERR_INVALID_STATE, "Cannot create window - no render " "system has been selected.", "Root::createRenderWindow"); } //核心代码,调用底层渲染系统去创建窗口 RenderWindow* ret; ret = mActiveRenderer->_createRenderWindow(name, width, height, fullScreen, miscParams); //很熟悉吧,其实跟渲染系统自己创建的一样 if(!mFirstTimePostWindowInit) { oneTimePostWindowInit(); ret->_setPrimary(); }
底层dx的调用中核心代码:
RenderWindow* D3D9RenderSystem::_createRenderWindow(const String &name, unsigned int width, unsigned int height, bool fullScreen, const NameValuePairList *miscParams) { String msg; // Make sure we don't already have a render target of the // same name as the one supplied if( mRenderTargets.find( name ) != mRenderTargets.end() ) { } D3D9RenderWindow* renderWindow = OGRE_NEW D3D9RenderWindow(mhInstance); //其实这句就是在底层根据给定的窗口句柄,绑定,创建并设置窗口,最最底层是这样的“mHWnd = CreateWindowEx(dwStyleEx, "OgreD3D9Wnd", title.c_str(), getWindowStyle(fullScreen),mLeft, mTop, winWidth, winHeight, parentHWnd, 0, hInst, this);”熟悉了吧 renderWindow->create(name, width, height, fullScreen, miscParams); mResourceManager->lockDeviceAccess(); try { //绑定并激活窗口 mDeviceManager->linkRenderWindow(renderWindow); } catch (const Ogre::RenderingAPIException&) { // after catching the exception, clean up mResourceManager->unlockDeviceAccess(); renderWindow->destroy(); // re-throw throw; } mResourceManager->unlockDeviceAccess(); mRenderWindows.push_back(renderWindow); updateRenderSystemCapabilities(renderWindow); attachRenderTarget( *renderWindow ); return renderWindow; }
好的,到此渲染系统、渲染窗口都有了,下面的就是加载资源、解析资源。最后创建场景了。
相关文章推荐
- ogre 引擎 框架追踪 第四章 资源加载之资源组初始化
- ogre 引擎 框架追踪 第六章 渲染流程
- ogre 引擎 框架追踪 第五章 资源加载之实加载
- ogre 引擎 框架追踪 第一章 root的创建
- ogre 引擎 框架追踪 第三章 资源加载之虚加载
- ogre 引擎 框架追踪 第七章 渲染流程之compositor
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 基于OGRE所实现的高层游戏引擎框架(1)
- 基于OGRE所实现的高层游戏引擎框架(2)
- 基于OGRE所实现的高层游戏引擎框架(3)
- kinect骨架追踪及手势识别(基于ogre引擎)
- Yii2框架源码追踪阅读(一)--从入口脚本index.php到类加载器的初始化
- ASP.NET快速开发框架之工作流引擎
- 基于 Jboss Drools 规则引擎开发框架
- 前段框架,如jQuery的某些控件datepicker,我想自己进行重新初始化,怎么办?
- 最近在学习一个框架,集成的模板引擎!
- [导入]CLR引擎初始化分析