在Ogre中显示汉字
本章由cowboylym(酒劍仙采葡萄)编写,转载请注明出处。
作者:酒劍仙采葡萄 邮箱: cowboylym@163.com
由于最近几天忙着做BillBoard(公告板)所以没什么时间更新笔记。其实公告板本身比较简单。但是要想在公告板上显示汉字就没那么轻松了。
这里我要使用到Ogre的字体管理器Ogre::FontManager,其实他的主要功能就是将指定的字符集生成一张纹理,通过这张纹理贴图来实现文字的显示的。
#defineFONT_NAME "myfontname"
#defineFONT_GROUP_NAME "Popular"
Ogre::FontPtr pFont = Ogre::FontManager::getSingleton().getByName(FONT_NAME);
if (pFont.isNull()) { pFont = Ogre::FontManager::getSingleton().create(FONT_NAME,FONT_GROUP_NAME); }
FONT_NAME:字体名 必须是唯一的。
FONT_GROUP_NAME:资源组名 注意字体库文件(.ttf文件)的路径要记录在这个组下面
这个资源文件在OgreSDK 的ogre_src_v1-8-1\bin\Debug 目录下可以找到 你可以把他拷贝到自己的工程目录下。然后添加字体文件夹路径。如上图 这里我把系统的字体文件夹加了进去。
Font->setType(Ogre::FT_TRUETYPE);/*设置类型FT_TRUETYPE表示 我们将通过字符集来初始化字体管理器。
还有一种类型FT_IMAGE是通过加载字符图片来初始化字体管理器的,这里我们先讲FT_TRUETYPE这种方式的实现。*/
pFont->setSource("SIMYOU.TTF");//设置字体SIMYOU.TTF是幼圆体的文件名,在系统字体文件夹下可以找到。
pFont->setTrueTypeSize(20);//设置字体大小
pFont->setTrueTypeResolution(96);//分辨率 一般为96
pFont->addCodePointRange(Ogre::Font::CodePointRange(FONT_CODE_POINT_RANGE));//设置编码范围(这里FONT_CODE_POINT_RANGE宏,我定义的是0x4e00, 0x9fa5也就是汉字的unicode的编码范围,你也可以设置为ASCII码的编码范围,看自己的需求决定)
pFont->load();//生成纹理
//获得生成的字体纹理
Ogre::MaterialPtr pMaterial =pFont->getMaterial();
Ogre::TexturePtr pTex =pMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->_getTexturePtr(0); //获取纹理内存块
Ogre::HardwarePixelBufferSharedPtrpixelBuffer = pTex->getBuffer(); //锁住内存块为了对内存块进行操作
if(!pixelBuffer->isLocked())
{
pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
}
//根据当前内存块抽象出对应的像素盒
const Ogre::PixelBox& pixelBox =pixelBuffer->getCurrentLock();
Ogre::uchar*readrefdata = static_cast<Ogre::uchar*>(pixelBox.data);
Ogre::Image img; //将内存块中的数据取出并绘成一张图片
img.loadDynamicImage(readrefdata,pTex->getWidth(),pTex->getHeight(),pTex->getFormat()); //生成纹理图片
img.save("test.png");
记住生成的图片一定要保存为png格式的否则你将看不到字,因为生成的这张纹理是LA格式的只有亮度和alpha(透明度)值。png支持alpha通道。
生成的图如下:
这只是冰山一角啊,一共6万多个字呢…
时间不早了,先写这么多至于如何把这些字单独的抠出来 显示到Ogre中 ,下次再补充。先上两张我做好的将字显示在BillBoard上的例子。
and
这里可以先提示一下方法就是我们可以先获取某个字在那张字符集纹理中的UV坐标,然后通过UV坐标获取这个字对应的像素内存数据段,然后将这块内存数据段 赋值到另一张新建的纹理上去,如上图所示我就是将“七”“夕”这两个字放到我新建的一张灰色的纹理上去的。详细的操作 我下次再详细讲 有兴趣的可以先思考下。
To becontinued…
————貳零壹叁 年 捌月 柒 日