Pro.OGRE.3D.Programming学习笔记之第四章 开始使用OGRE (二)

本文介绍了如何开始使用OGRE 3D渲染引擎,强调了手动初始化过程,包括加载插件、选择渲染系统,并详细讲解了不同类型的场景管理器。此外,还提到了相机、视口、帧监听器的基本操作,以及如何创建多视口和管理渲染循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最简单让OGRE去渲染场景的方法就是调用ROOT的startRendering函数

root->starterndering();注意调用这个开始渲染的函数,是在

mRoot = new Root();

setupResources();

bool carryOn = configure();

if (!carryOn) return false;

chooseSceneManager();

createCamera();

createViewports();

TextureManager::getSingleton().setDefaultNumMipmaps(5);

createResourceListener();

loadResources();

createScene();

createFrameListener();等创建场景成功后再调用的。

这个会引起OGRE永不停止的渲染场景。退出可能是因为关闭了窗口或者注册的frame listener返回了false。结束渲染循环的可以调用Root::getsingleton().queueEndRendering(),一般还是用frame listener返回false。在root的startrendering中有这样的语句

        while( !mQueuedEnd )

        {

            //Allow platform to pump/create/etc messages/events once per frame

            mPlatformManager->messagePump(mAutoWindow);

            if (!renderOneFrame())

                break;

        }

 

QueuEndRendering通过设置mQueuedEnd = true 来实现,结束帧监听器的。FrameListener是唯一一个启用startRendering后可以调用自己代码的地方,创建新的frameListener后,记得要root->addFrameListener(listenername);注册一下。实际上这里是root 中有个FrameListener的Set,利用set 的insert 函数加入到帧监听器队列中去。

 

OGRE手动初始化:

初始化OGRE最早应该是加载插件,Root提供了手动的函数

Void loadPlugin(const String& pluginName);

Void unloadPlugin(const String& pluginName);插件的加载是缺省扩展名的。

 

为了避免debug/realease时名字的冲突,debug时的文件会加上“_d”,在文件名后,如Ogremain_d.dll

须要用#if defined 来允许有条件的编译

#if defined

         Root->loadPlugin(“Plugin_ParticleFX_d.dll”);

#else

         Root->loadPlugin(“plugin_ParticleFX.dll”);

#endif

OGRE会自动的卸载插件。

OGRE有以下几种插件:

Plugin_OctreeSceneManager:基于八叉树的场景图与管理器。包括地形场景管理器,派生出优化后的八叉树场景管理器处理高度地形场景。

Plugin_BSPSceneManager:提供Quake3级地图文件的BSP场景管理器,越来越变的抽象了。

Plugin_CgProgramManager:用Cg进行GPU程序开发时,些插件提供装载,语义分析,编译等,它的发展落后于曲线技术,变得比较少用了。OGRE能使用HLSL和GLSL程序。

Plugin_ParticleFX:提供一些效应器和发射器。

RenderSystem_GL:提供OpengGL API在所有平台上的入口。

 

//insert the code

场景管理器有五种:

ST_GENERIC:最小的场景管理,没有对任何特别场景内容或结构做优化。对较小的复杂场景非常有效。

ST_INTERIOR:对内部的空间和潜在高密度场景有做很好的优化。

ST_EXTERIOR_CLOSE:适用于户外,近景观察。单一的地图网格或高度区。

ST_EXTERIOR_FAR:现在OGRE已不再使用,用ST_EXTERIOR_CLOSE或者ST_EXTEROR_REAL_FAR代替了。

ST_EXTERIOR_REAL_FAR:适合于paged landscape与paged scene construction。

如果用BSPSceneManager载入Quake3地图,则要用到ST_INTEROR场景。若想创建基于高度的地图场景,可以用TerrainSceneManager(TSM)插件,则用ST_EXTEROR_CLOSE。ST_GENERIC没有特别的插件须要。但是如果是装载了OctreeSceneManager,自动是使用ST_GENERIC。

 

Camera可以被attach到场景节点上,也可以独立的存在。有三种呈现方式,wireframe,solid,points。Camera可以加到一个场景节点上,以便跟着一个物体的运动SetAutoTracking,camera的moverelative是在本身的局部位置中移动的。

 

Viewport可以用多个,有Z轴上的高度。例如可以有一个视口中Z轴顺利为1,覆盖整个窗口,黑色背景;一个小的视口在其上,蓝色背景,以下代码:

Viewport *vpTop,*vpBotton;

VpBottom = window->addViewport(camera,0);

VpTop = window->addViewport(camera,1,0.37f,0.37f,0.25,0.25);

VpTop->setBackgroundColour(ColourValue(0.0f,0.0f,0.0f));

OGRE默认自动的清除每帧的深度和颜色缓存,也可以独立的管理,用viewport的setClearEveryFrame();

vpTop->setClearEveryFrame(true,FBT_COLOUR);

vpTop->setClearEveryFrame(false);

在多视口情况下,overlay缺省在每个视口中渲染。可以关掉。Skybox, Shadow也是如此。
vpTop->setOverlaysEnabled(false);
vpTop->setSkiesEnabled(false);
vpTop->setShadowsEnabled(true);

 

手动建立一个OGRE程序:

         Root *root = new Root("","");

         root->loadPlugin("RenderSystem_Direct3D9");

         root->loadPlugin("RenderSystem_OpenGL");

 

         RenderSystemList* rlist = root->getAvailableRenderers();

         RenderSystemList::iterator it = rlist->begin();

         RenderSystem *rSys=0;

         while(it!=rlist->end())

         {

              rSys = *(it++);

              if(rSys->getName().find("OpenGL"))

              {

                   root->setRenderSystem(rSys);

                   break;

              }

         }

 

         if(root->getRenderSystem()==NULL)

         {

              delete root;

              return -1;

         }

        

         root->initialise(false);//false means no renderwindow here

         RenderWindow *window = rSys->createRenderWindow("my manual window",800,600,false,0);//root has createRenderSystem

         //but at last it's use the rendersystem's createRenderWindow

 

         RenderWindow *window2 = rSys->createRenderWindow("my second window",800,600,false,0);

 

         SceneManager *sceneMgr = root->createSceneManager(ST_GENERIC);

         // create a single camera, and a viewport that takes up the whole window (default behavior)

         Camera *camera = sceneMgr->createCamera("MainCam");

         Viewport *vp = window->addViewport(camera);

         vp->setDimensions(0.0f, 0.0f, 1.0f, 1.0f);

         camera->setAspectRatio((float)vp->getActualWidth() / (float) vp->getActualHeight());

         camera->setFarClipDistance(1000.0f);

         camera->setNearClipDistance(5.0f);

         camera->setPosition(10,20,100);

 

 

后记:小窝都开始长草,今天来除一下,真是要持久的写博客也不容易呀。这段时间都在看OGRE,渐入其门,不过速度有些慢,看E文文献,可不是看电影,后来就失去耐心了,所以心得难免有虎头蛇尾之嫌,随便写写,随便看看....

后记2:2007年4月4号,参加校园攀岩比赛,成功,获可口可乐一瓶:)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值