使用FreeImage加载纹理
DirectX9中提供了函数D3DXCreateTexureFromFile函数,但是对用户是透明的,不知道其实现,并且在实际当中一般都是用多线程来进行资源的处理,就像自己实现一下
考虑了两种方法来适用后台加载
1 使用Device CreateTexture后,进行后台加载
2 将纹理文件读进内存后,使用D3DXCreateTextureFromFileInMemory进行加载
这里先使用第一种方法
FreeImage是一个有名的开源图像库,支持的图像类型很多,并且有良好的说明文档,Ogre中也使用了该图像库
用设备创建纹理之后,就可以从后台进行加载了,暂时只支持level0的读取
bool LoadImage(const char* filename)
{
FREE_IMAGE_FORMAT fif=FIF_UNKNOWN;
//图像指针
FIBITMAP* dib(0);
//图像像素数据指针
BYTE* bits(0);
unsigned int width(0),height(0);
//获取图像类型
fif=FreeImage_GetFileType(filename,0);
if(fif==FIF_UNKNOWN)
fif=FreeImage_GetFIFFromFilename(filename);
if(fif==FIF_UNKNOWN)
return false;
if(FreeImage_FIFSupportsReading(fif))
dib=FreeImage_Load(fif,filename);
if(!dib)
return false;
bits=FreeImage_GetBits(dib);
width=FreeImage_GetWidth(dib);
height=FreeImage_GetHeight(dib);
////位图深度
//int depth=FreeImage_GetBPP(dib);
////对应D3D中的pitch
//int pitch=FreeImage_GetLine(dib);
g_pDevice->CreateTexture(width,height,0,D3DUSAGE_AUTOGENMIPMAP,D3DFMT_X8R8G8B8,D3DPOOL_MANAGED,&g_texture,0);
D3DLOCKED_RECT rect;
//获取Level0的整个矩形以便填充
g_texture->LockRect(0,&rect,0,0);
//rect.pBits是void*类型的,这里进行转化,方便寻址
BYTE* p=(BYTE*)rect.pBits;
//为什么从height-1开始?
//因为D3D的纹理坐标左上角是(0,0),一般图像左下角是(0,0)
//所以如果直接按像素对应的话,图像就会上下颠倒
for(int i=height-1;i>=0;--i)
{
//获取该行数据
BYTE* bitsi=FreeImage_GetScanLine(dib,i);
for(int j=0;jUnlockRect(0);
//用完了释放
FreeImage_Unload(dib);
return true;
}