最简单让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号,参加校园攀岩比赛,成功,获可口可乐一瓶:)