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

链接:第一章
第一章中已经创建完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;
    }   

好的,到此渲染系统、渲染窗口都有了,下面的就是加载资源、解析资源。最后创建场景了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思依_xuni

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值