Ogre纹理的导出与保存
开发过程中,有时需要了解纹理数据是否正确,特别是在使用render to texture或者MRT的时候,为了了解结果是否正确,最简单的方式自然是把纹理数据导出,然后以图像文件的形式保存到本地。这里介绍一下我在Ogre中采用的方法。
首先自然要获得纹理对象,通常都是Ogre::Texture或者Ogre::TexturePtr对象;
纹理对象的数据由Ogre::HardwarePixelBuffer对象管理,但是真正的纹理数据保存在其中的Ogre::PixelBox对象中;
这里有两点需要注意,第一是在读取数据前要lock,读完后unlock;第二是读取数据是要采用Ogre::HardwarePixelBufferSharedPtr::blitToMemory函数,而不是readBuffer函数;
下面是读取纹理数据的示例代码,在读出纹理数据后,将其保存到一个本地的24位的真彩色BMP文件中。在保存BMP文件的时候,也许需要对像素数据的格式 进行转换,这时可以利用Ogre::PixelUtil::unpackColour函数来实现,该函数可以将Ogre中像素格式的数据转换成标准的 float格式数据。
开发过程中,有时需要了解纹理数据是否正确,特别是在使用render to texture或者MRT的时候,为了了解结果是否正确,最简单的方式自然是把纹理数据导出,然后以图像文件的形式保存到本地。这里介绍一下我在Ogre中采用的方法。
首先自然要获得纹理对象,通常都是Ogre::Texture或者Ogre::TexturePtr对象;
纹理对象的数据由Ogre::HardwarePixelBuffer对象管理,但是真正的纹理数据保存在其中的Ogre::PixelBox对象中;
这里有两点需要注意,第一是在读取数据前要lock,读完后unlock;第二是读取数据是要采用Ogre::HardwarePixelBufferSharedPtr::blitToMemory函数,而不是readBuffer函数;
下面是读取纹理数据的示例代码,在读出纹理数据后,将其保存到一个本地的24位的真彩色BMP文件中。在保存BMP文件的时候,也许需要对像素数据的格式 进行转换,这时可以利用Ogre::PixelUtil::unpackColour函数来实现,该函数可以将Ogre中像素格式的数据转换成标准的 float格式数据。
void
copyFrame(
const
char
*
pFile, Ogre::TexturePtr tex)
{
Ogre::HardwarePixelBufferSharedPtr tmpTexBuf = tex->getBuffer();
char* tmpBuf = new char[tmpTexBuf->getSizeInBytes()];
Ogre::PixelBox tmpBox(tmpTexBuf->getWidth(),
tmpTexBuf->getHeight(),
tmpTexBuf->getDepth(),
tmpTexBuf->getFormat(),
tmpBuf);
tmpTexBuf->lock(HardwareBuffer::HBL_READ_ONLY);
tmpTexBuf->
{
Ogre::HardwarePixelBufferSharedPtr tmpTexBuf = tex->getBuffer();
char* tmpBuf = new char[tmpTexBuf->getSizeInBytes()];
Ogre::PixelBox tmpBox(tmpTexBuf->getWidth(),
tmpTexBuf->getHeight(),
tmpTexBuf->getDepth(),
tmpTexBuf->getFormat(),
tmpBuf);
tmpTexBuf->lock(HardwareBuffer::HBL_READ_ONLY);
tmpTexBuf->