利用Ogre的渲染到材质技术实现Ogre截屏功能

138 篇文章 0 订阅

引自http://thinkingmax.spaces.live.com/blog/cns!15A32E7953E527E8!182.entry

我们的无标记动作捕捉系统需要搭建模拟实验环境以进行模拟实验,所以便诞生了以下两个方案:利用Maya布置一个模拟实验环境和利用Ogre渲染一个模拟实验环境。Maya我们暂时抛开不谈因为Maya和我们的主题无关。关于Ogre我们需要实现的功能是在一个原地行走的人模周围均匀地布置8个摄像机,按下某一快捷键时可以同时截取8个摄像机里的画面并保存到本地硬盘里。

Ogre是可以设置多个摄像机的,而屏幕上显示的图像就是摄像机里看到的图像,所以这个问题就简化成了如何在Ogre实现截屏功能,并将截取的图像保存到本地硬盘。那么如何利用Ogre实现自身截屏功能呢?Ogre提供的渲染到材质技术可以很好的为我们服务。首先,新建一个材质Texture,把它的RenderTarget设置成摄像机。

TexturePtr texture = TextureManager::getSingleton().createManual( "RttTex",

              ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D,

              1024, 768, 0, PF_R8G8B8, TU_RENDERTARGET );

RenderTarget *rttTex = texture->getBuffer()->getRenderTarget();

Viewport *v = rttTex->addViewport(pCamera[i]);

 

第二步,把Texture的缓冲区里的数据拿到PixelBox中。

Ogre::HardwarePixelBufferSharedPtr tmpTexBuf = texture->getBuffer();

int width = texture->getWidth();

int height= texture->getHeight();

char* tmpBuf = new char[width*height*4];

Ogre::PixelBox tmpBox(width,

            height,

            texture->getDepth(),

            texture->getFormat(),

            tmpBuf);

tmpTexBuf->blitToMemory(tmpBox);

 

最后一步,从PixelBox中取出对应的信息利用ImageloadDynamicImage函数保存成Image格式。然后保存到本地硬盘上。

Ogre::Image image;

image.loadDynamicImage((Ogre::uchar*)tmpBox.data, tmpBox.getWidth(), tmpBox.getHeight(), tmpBox.getDepth(), tmpBox.format);

image.save(filename);

 

最后注意要注意一点,需要用texture.setNull()texture清空。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值