您的位置:首页 > 其它

ogre 引擎 框架追踪 第二章 初始化

2016-11-24 18:49 405 查看
链接:第一章

第一章中已经创建完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