从OGRE纹理到CEGUI纹理 —— 使用RTT实现

来源:互联网 发布:淘宝网孕婴用品 编辑:程序博客网 时间:2024/06/10 05:45

这里转别人的一篇噢。改天更新Gamebryo到RTT纹理的方法

  最近重拾LUA,觉得这个语言太美了。怎一个“简单”了得。不过我现在还太探索它和CEGUI的配合使用问题。虽然LUA的语法半年前就基本掌握了(那是因为LUA最简单的就是语法了~~XD),可现在还得琢磨如何让它和CEGUI及我的程序进行数据共享。好让我的LUA脚本里的回调函数可以直接操作APP里的数据(不知道这样做安全性如何?不过,若不这样,LUA的功能就不能扩大,只停留在非交互模式)。


刚开始玩OGRE的时候,就觉得在一个窗口里预览3D角色很有趣。到了现在才开始做,因为游戏牵涉的方面太广了(如果我还在坚持OGL,估计现在还在苦苦挣扎中,多亏了这只可爱的“食人魔”~~)。好了,闲话少说,进入正题。


其实,搞定这个很简单。首先,使用分场景管理器(当然,你也可以选择到一处人迹罕至的地方,架个摄像机来取景~或许这样效率更高,可我觉得这样不彻底,如果全天空都在使用某种特效,该如何处理,麻烦~)。然后,就是RTT(渲染到纹理)了。OGRE来实现RTT很方便,直接手动一个Texture,获取buffer里面的RenderTarget,用你选好的Camera给他加个Viewport,就OK了。

view plaincopy to clipboardprint?
TexturePtr tex = TextureManager::getSingleton().createManual("rtt2_tex",     
    ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,TEX_TYPE_2D,200,200,0,PF_R8G8B8,TU_RENDERTARGET);     
RenderTarget *rt = tex->getBuffer()->getRenderTarget();     
Viewport *vp = rt->addViewport(m_pAnotherSceneMgr->getCamera("main_camera"));     
vp->setBackgroundColour(ColourValue(0,0,0));     
vp->setOverlaysEnabled(false);     
vp->setClearEveryFrame(true);   
TexturePtr tex = TextureManager::getSingleton().createManual("rtt2_tex",  
    ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,TEX_TYPE_2D,200,200,0,PF_R8G8B8,TU_RENDERTARGET);  
RenderTarget *rt = tex->getBuffer()->getRenderTarget();  
Viewport *vp = rt->addViewport(m_pAnotherSceneMgr->getCamera("main_camera"));  
vp->setBackgroundColour(ColourValue(0,0,0));  
vp->setOverlaysEnabled(false);  
vp->setClearEveryFrame(true); 

 

然后,就是把OGRE的纹理转到CEGUI上去。思路是这样的,OGRE与CEGUI的桥梁是CEGUIOgreRenderer(CEGUI提供,此处不考虑OgreGUIRenderer)。通过OgreRenderer,可以创建一个CEGUI里的纹理,参数就是一个OGRE中的纹理。这太简单了吧。


下面就可以通过这个CEGUI里的纹理来创建我们的Imageset了,同理,你可以很轻松的通过ImagesetManager提供的create方法来完成这项任务。参数有两个,一个名称,一个CEGUI纹理。这样一来,我们就可以在这个Imageset中定义图像了,使用Imageset的defineImage方法。参数吗,自己去找API帮助~~^_^。


view plaincopy to clipboardprint?
CEGUI::Texture &ctex = static_cast<CEGUI::OgreRenderer*>     
    (CEGUI::System::getSingleton().getRenderer())->createTexture(tex);     
CEGUI::Imageset &imgset = CEGUI::ImagesetManager::getSingleton().create("rtt2_imgset",ctex);     
imgset.defineImage("rtt2_imgset/image",CEGUI::Point(0,0),ctex.getSize(),CEGUI::Point(0,0));     
CEGUI::Window *img = CEGUI::WindowManager::getSingleton().getWindow("Root/framewindow/staticimage");     
img->setProperty("Image","set:rtt2_imgset image:rtt2_imgset/image");    
 
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eplaylity/archive/2009/11/05/4771742.aspx 
CEGUI::Texture &ctex = static_cast<CEGUI::OgreRenderer*>  
    (CEGUI::System::getSingleton().getRenderer())->createTexture(tex);  
CEGUI::Imageset &imgset = CEGUI::ImagesetManager::getSingleton().create("rtt2_imgset",ctex);  
imgset.defineImage("rtt2_imgset/image",CEGUI::Point(0,0),ctex.getSize(),CEGUI::Point(0,0));  
CEGUI::Window *img = CEGUI::WindowManager::getSingleton().getWindow("Root/framewindow/staticimage");  
img->setProperty("Image","set:rtt2_imgset image:rtt2_imgset/image"); 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eplaylity/archive/2009/11/05/4771742.aspx

OK,去编译&运行吧。。。保证你能看到效果,可是。。效果并不是你所想的那样。。

因为你忘记了更新你的Window,所以,在程序中除非你改变了窗口尺寸或什么的,纹理图片才会改变~~

 

怎么办?好办,每帧都强制更新一个~~

找到你的FrameListener的frameRenderingQueued,在函数返回之前,添加下面一句:

CEGUI::WindowManager::getSingleton().getWindow("Root/framewindow/staticimage")->invalidate();

(这是CEGUI0.7的,如果你还在用CEGUI0.6及其之前的版本,我建议你可以去更新一下了~~如果你非用0.6,好吧,用“requestRedraw”替换invalidate,如果我没记错的话:-D~~)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eplaylity/archive/2009/11/05/4771742.aspx

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shadow_gz/archive/2010/11/11/6002265.aspx

原创粉丝点击