Irrlicht中的纹理管理还是比较简单的,功能也比较少,主要是面向应用的,现在来看一下irrlicht是如何管理纹理的。
纹理一般的都是从磁盘或者其他的文件中加载图片后创建的,我们平时创建纹理一般都是通过D3D的API来完成的:
HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice,
LPCTSTR pSrcFile,
LPDIRECT3DTEXTURE9 * ppTexture
);
HRESULT D3DXCreateTextureFromFileEx(...);
这样很方便,一步到位就能加载图片和创建纹理LPDIRECET3DTEXTURE9.
但是我们看到在IRRLICHT中不是这么做的,它将纹理和图片等资源文件是分开的,不是简单的利用D3D API来创建。
IRRLICHT中DX纹理类是 class CD3D9Texture : public ITexture ,这个类只要维护了LPDIRECET3DTEXTURE9这个指针,这样
一个CD3D9Texture 就代表着一个纹理资源,它以纹理对应的图片文件名来标记唯一性的。
再说一下图片,所有的IRRLICHT所支持的图片资源比如JPG,BMP,....都是在CImage类中维护的,CImage中有当前图片的数据,当然了
每个不同类型的图片都有各自的Loader,比如JPG图片的加载由class CImageLoaderJPG : public IImageLoader来完成的,图片的写入操作
就是Writer来完成 class CImageWriterJPG : public IImageWriter完成, 其中读取和写入都是通过CImage类完成。
有了图片的数据CImage,我们就能很轻松的初始化CD3D9Texture了,通过锁的操作来复制数据。
最后来看一下,纹理资源的管理,之前说了IRRLICHT中纹理的管理是很简单的,主要管理是在 CNullVideoDriver 中完成的,就是维护了一个
ITexture* 的vector,当通过getTexture(const char* name)来得到纹理时,查看name的纹理是否在vector,在就返回,不在就加载name的图片并创建
CD3DTexture并插入vector中。还是很基本的,对于大型的游戏包含很多的图片数据的话这个管理是不行的,稍后看一下OGRE对纹理是何如管理的,嘎嘎!!!
不过对于小型的游戏,这个足够了,简单效率就高!就写到这吧,很少写东东,真难,以后逼着自己学习写东西了,加油~