使用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; }
posted @ 2012-03-16 15:51  っ梦幻泡影  阅读(863)  评论(0编辑  收藏  举报